C#の変数
・C#はコンパイル時に決定されるデータ型を持つ静的型付き言語
←→実行時に型が決定される動的型付き言語(JavaScriptなど)
静的型付き言語 宣言時の型は変更されない
動的型付き言語 代入する変数によって型が変わる
変数名(ASCIIのみの場合)
アルファベットまたはアンダースコアから始める
アルファベット、10進数、アンダースコアの組み合わせが使える
var
・varを使っても実際には型が決まっている(初期化子を見てコンパイラが決定)
・初期化子がないとvarは使えない
・宣言時と違う型は代入できない
varを使うべきか
【メリット】
・楽
・早く入力できる
・変数名がそろっていて見やすい
【デメリット】
・コードを読み解くのに時間がかかる
・開発者が思っていた型と実際の型が異なりバグを生むことにつながる
varを使うべき場面
以下のような場合はvarを使ったほうが良い(または使う人が多い)
・List<int> listA =new List<int>; など左辺と右辺に同じ型名を書く場合
※C#9.0以降ではList<int> listA =new ();とも書ける
・foreachの繰り返し変数
・匿名型の場合(varでしか宣言できない)
複数の同じ型の変数を一行で宣言する
double a=1, b=2.5, c=3;
未割り当てのローカル変数が使用された警告がでる場合
・常に値を持つように初期化子を書く
数値…0
ブール値…false
参照型…null
スコープ
・メソッド、プロパティ、型など名前を持つものすべてがスコープを持つ
・その実態を余計な修飾を使わず名前だけで参照できる範囲
・ネストしたブロックの場合、外側のブロックにある全てのものが内側のブロックでも引き続きスコープ内になる
・ブロックは{}で囲まれた範囲
・ifブロックの外側で宣言された変数はifブロックの中で使えるが、逆はできない
ローカル変数のスコープ
・修飾しなくてもアクセス可能か、全くアクセスできないかのどちらか
・宣言されたところから始まり、その変数を含むブロックの最後で終わる
(ループは例外)
・スコープは重なっていなくても同じ宣言空間の中では同じ名前の変数を宣言できない
宣言空間
・2つの異なる実態を同じ名前で参照してはいけないコード範囲
・メソッドやネストしたブロックには宣言空間がある
・ネストの宣言空間では親の宣言空間にある変数と同じ名前を使用できない
・宣言する位置はほとんど考慮されない。宣言をブロックの先頭に移動させても宣言空間は変わらない。
・全ての変数宣言を先頭に移動させるなどの移動でコードの意味が変わってはいけないという考えに基づいている
・変数だけでなくクラス、メソッド、プロパティなどにも適用される
ローカル変数のインスタンス
・メソッドを実行するたびに、ローカル変数の値を保存するための保存場所がそれぞれ確保される
・特定のスコープを実行するごとに、それぞれ別個の変数が確保される
・最適化のために可能な限り格納場所が再利用されるので、スコープの実行時に本当に必要な場合にだけ新たなメモリが割り当てられる