staticいつ使えばいいんですか?
積極的に使う気が起きなかったが、上司のソースコードを見ると各所に散見されたので
いつ使えばいいのか?どんなメリットがあるのか?という観点で調べた。
1. staticとは
2. staticは何がいいのか
3. staticの良くないところ
4. いつ使えば良いのか
5. staticの書き方
6. まとめ
7. 参照
1. staticとは
- 修飾子。
- 静的クラス・メンバーの宣言で使う。
- 静的クラスの場合メンバーも静的にする。
- 静的クラスの場合コンストラクターを含めることはできない。
- メモリを静的に確保する。
メンバ変数にstaticをつけた場合、その変数がメモリ上のどこに配置されるかが固定される。
メモリ上の位置が固定されるということはどこからでもこの変数にアクセスできるということです。
[https://qiita.com/suin/items/0897adc7dc653b9c20de]
2. staticは何がいいのか
- インスタンス化するより処理が早くなる。というかインスタンス化は相対的にメモリを圧迫する。
- インスタンスメンバーが追加されない保証がされる。
「静的クラスを使用する利点は、インスタンス メンバーが誤って追加されないことをコンパイラで確認できるという点です。
コンパイラによって、このクラスのインスタンスを作成できないことが保証されます。」
- staticにするとインスタンス参照せずに直でメンバーへアクセスできる。
- クラス唯一のものであればstaticとするという使い方ができる。
下記のPersonクラスではnameやageはPerson毎に変わるが、scientifiName(学名)は必ずホモサピエンスとなるのでstaticとしている。これによりインスタンス化されて
例)
class Person
{
public string name; // インスタンス化したPersonごとに変わる。
public int age; // 同上。
public static string scientificName;// インスタンス化してもPersonは皆ホモサピエンスで変わらない。
}
Person p = new Person()
p.name = "安倍 晋三";
p.age = 66;
Person.scientificName = "Homo Sapiens";
3. staticの良くないところ
-
どのクラスからでもアクセスできてしまう為副作用が起こりうる。
(副作用:関数が終了した後に影響が残ること。この場合呼び出され値を変更されるなど。) -
Singletonパターンを採用した方がいいケース
同様の質疑がありました。
そもそもSingletonパターンとは
[C#]Singletonパターン実装方法(備忘録
C# での Singleton についてまとめ
4. いつ使えば良いのか
- 共通のメソッドを定義する場合
- 共通のプロパティを定義する場合
- 複数クラス間で共通のプロパティを共有したい場合
とは言え、副作用を考えると極力使いたくないしオブジェクト指向的でないと思います。
しかし、上記例のようにクラス唯一の変数であり、
5. staticの書き方
static 型名 フィールド名
// 例
public class MyBaseC
{
public struct MyStruct
{
public static int x = 100;
}
}
クラスをstaticにした場合はスコープ内のメンバーもstaticとしなければならない。
アクセスする方法
- 完全修飾名 (
MyBaseC.MyStruct.x
) を使用。
(同じスコープからその静的メンバーにアクセス可能でない限り)
これはできない
- 静的なローカル変数化 (つまり、メソッドのスコープで宣言された変数) 。
6. まとめ
静的メンバーはアプリケーション起動時にメモリを確保し
、終了までメモリの割り当てが変更されない。
故にどこからでもアクセスできるようになる。
共通して使うメソッドや、クラス内で唯一の変数などに使う。
メソッドは特別staticにする利点は見つからなかった。変数はインスタンス化することで、本来一つしかないはずの情報が複数作られるのを防ぐことができる。
しかし、副作用があるため代替方法があるなら検討すべき。
間違いやツッコミあったら教えてください👨
7. 参照
静的クラスと静的クラス メンバー
PHP: 静的メソッドは何のためにあるか?
わい、static変数とstaticメソッドについて熱く語る
[プログラミング序論 11.記憶クラスとスコープ]
(http://www.ibe.kagoshima-u.ac.jp/edu/gengo0/p11.html#:~:text=%E3%82%B9%E3%82%BF%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E9%A0%98%E5%9F%9F%EF%BC%9A,%E3%81%A7%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82)