コレクションの対象外になっているか)について説明していきます。本項では、現時点までに説明していない概念がいくつか出てきます。演算子で新しい変数を導入ローカル関数を使える範囲キーワード識別子スコープ123次へ概要ローカル変数、メンバー名(メソッドなどの名前)、型名など、開発者が自由につけれる名前のことを識別子(identifier)と言います。「識別」(identify)の名のとおり、一意に区別するためにつける名前なので、基本的には複数のものに同じ名前は付けれません。識別子には有効は範囲があります。この範囲を識別子のスコープ(scope)と言い、スコープ内では識別子名は一意でなければならず、逆に、スコープが違えば、別のものに同じ名前を付けることができます。スコープと関連して、以下のようなものがあります。基本的に、変数のスコープを外れれば、そのオブジェクトは不要(GCの対象)になりますただし、ラムダ式やイテレーター、非同期メソッドなど、オブジェクトの寿命を延ばしてしまう構文がいくつかあります変数を使える範囲:スコープ内で、かつ、変数宣言より下でだけ変数を使えますさらに、変数に格納した値を読み出すためには、確実に初期化してからでなければいけません本稿では、これらについて説明して行きます。識別子のスコープC#の識別子のスコープは、原則として、その識別子の定義場所を囲むブロック内です。以下のようになります。この範囲では、基本的に同じ名前は使えないということになります。入れ子のブロックスコープの範囲は、ブロックが入れ子になっている個所も含めます。Console.WriteLine(x);}この例ではxという名前の変数が2つあります。1つ目のx(10を代入している方)のスコープはメソッドM全体になります。2つ目のx(20の方)のスコープはそれよりも1回り小さい内側のブロック内になりますが、この範囲は1つ目のxのスコープ内でもあります。プログラミング言語によっては、この「入れ子のレベル違い」の同名識別子を認めているものもありますが、C#では認めません。C#は、原則としてスコープ内で識別子の意味を変えない・上書かないという方針をとっています。逆に、以下のようなコードであれば、2つのxがそれぞれ直近のブロック内だけをスコープにしているので、エラーにはなりません。}}もう1つ注意が必要なのは、変数の定義位置がどこであろうと、スコープは直近のブロック全体になるということです。以下のコードを見てください。Console.WriteLine(x);}2つ目のx(stringの方)は下の方で定義されていますが、これのスコープはブロックの先頭からになります。「入れ子のもの含めて、スコープ内では同名不可」の原則には例外もあります。1つは、以下のように、メンバーとローカル変数には同じ名前をつけれるということです。}}この場合、ローカル変数側が優先されます。フィールドの方を使うためにはthis.を付けるのが必須になります。型と名前空間もう1つの例外は、型と名前空間です。外で定義された型の名前と同名のメンバーやローカル変数が作れます。}}この場合、どの識別子かを明確化するには、完全修飾名を使うことになります。}}ちなみに、これは、あくまで型が外側のスコープで定義されている場合だけです。以下のように、まったく同じスコープ内で定義する場合は、型名とメンバー名を同じにすることはできなくなります。}}引数メソッドの引数のスコープは、そのメソッド本体内全域です。ローカル変数と扱いは一緒です。メソッド内で、引数と同名のローカル変数は作れません。Console.WriteLine(x);}ローカル変数と同じくスコープの例外として、メンバーと同じ名前を付けることができます。極端な話、以下のように、メソッドと同名の引数を使うこともできます。}}ループ変数forステートメントや、foreachステートメントの場合、ループ変数があります。ループ変数のスコープはステートメントの内側になります。変数を使える範囲は、スコープよりもやや厳しくなります。変数の場合はそのブロック全体でから使えるわけではありません。変数は、変数宣言よりも前では使えません。20;また、変数に格納された値を読み出すためには、それよりも前に確実に初期化を行っている必要があります。初期化前には読めない。Console.WriteLine(y);}C#では、変数が確実に初期化されているかどうかを結構真面目に判定しています。ステートメントでは真偽両方で初期化されているかまで見ています。rule)と呼んで、結構事細かにルールが決まっています。まで気兼ねなくご連絡ください。ついて運営者について。