Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9749

staticっていつ使えばいいの?何がいいの?

$
0
0

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としている。これによりインスタンス化されて

例)

classPerson{publicstringname;// インスタンス化したPersonごとに変わる。publicintage;// 同上。publicstaticstringscientificName;// インスタンス化してもPersonは皆ホモサピエンスで変わらない。}Personp=newPerson()p.name="安倍 晋三";p.age=66;Person.scientificName="Homo Sapiens";

3. staticの良くないところ

4. いつ使えば良いのか

  • 共通のメソッドを定義する場合
  • 共通のプロパティを定義する場合
  • 複数クラス間で共通のプロパティを共有したい場合

とは言え、副作用を考えると極力使いたくないしオブジェクト指向的でないと思います。
しかし、上記例のようにクラス唯一の変数であり、

5. staticの書き方

static型名フィールド名// 例publicclassMyBaseC{publicstructMyStruct{publicstaticintx=100;}}

クラスをstaticにした場合はスコープ内のメンバーもstaticとしなければならない。

アクセスする方法
  • 完全修飾名 (MyBaseC.MyStruct.x) を使用。 (同じスコープからその静的メンバーにアクセス可能でない限り) ##### これはできない
  • 静的なローカル変数化 (つまり、メソッドのスコープで宣言された変数) 。

6. まとめ

静的メンバーはアプリケーション起動時にメモリを確保し
、終了までメモリの割り当てが変更されない。
故にどこからでもアクセスできるようになる。

共通して使うメソッドや、クラス内で唯一の変数などに使う。

メソッドは特別staticにする利点は見つからなかった。変数はインスタンス化することで、本来一つしかないはずの情報が複数作られるのを防ぐことができる。

しかし、副作用があるため代替方法があるなら検討すべき。

間違いやツッコミあったら教えてください👨

7. 参照

静的クラスと静的クラス メンバー
PHP: 静的メソッドは何のためにあるか?
わい、static変数とstaticメソッドについて熱く語る
プログラミング序論 11.記憶クラスとスコープ


Viewing all articles
Browse latest Browse all 9749

Trending Articles