変数Variables

変数は、記憶域の場所を表します。Variables represent storage locations. すべての変数ができる値を指定する型の変数に格納します。Every variable has a type that determines what values can be stored in the variable. C# は、タイプ セーフな言語と c# コンパイラでは、変数に格納されている値は常に適切な型のことが保証されます。C# is a type-safe language, and the C# compiler guarantees that values stored in variables are always of the appropriate type. 割り当てまたはを使用して変数の値を変更できる、++--演算子。The value of a variable can be changed through assignment or through use of the ++ and -- operators.

変数である必要があります確実に代入(確実な代入) 前に、その値を取得できます。A variable must be definitely assigned (Definite assignment) before its value can be obtained.

いずれかの変数は、次のセクションで説明した、最初に割り当てられたまたは最初に割り当てられていないします。As described in the following sections, variables are either initially assigned or initially unassigned. 最初に割り当てられている変数は、明確に定義された初期値を備え、明示的に代入すると考えられます。An initially assigned variable has a well-defined initial value and is always considered definitely assigned. 最初に未割り当ての変数には、初期値はありません。An initially unassigned variable has no initial value. 特定の場所に明示的に代入して考慮することを最初に割り当てられていない変数、その位置に至るすべての可能な実行パスで、変数への代入があります。For an initially unassigned variable to be considered definitely assigned at a certain location, an assignment to the variable must occur in every possible execution path leading to that location.

変数のカテゴリVariable categories

C# 7 つのカテゴリの変数を定義します。 静的変数、インスタンス変数、配列の要素、パラメーターの値、参照パラメーター、出力パラメーター、およびローカル変数。C# defines seven categories of variables: static variables, instance variables, array elements, value parameters, reference parameters, output parameters, and local variables. 次のセクションでは、これらの各カテゴリについて説明します。The sections that follow describe each of these categories.

In the example

class A
{
    public static int x;
    int y;

    void F(int[] v, int a, ref int b, out int c) {
        int i = 1;
        c = a + b++;
    }
}

x 静的変数、yインスタンス変数は、v[0]配列要素であるa値パラメーターでは、b参照パラメーターは、cは出力パラメーターとiはローカル変数です。x is a static variable, y is an instance variable, v[0] is an array element, a is a value parameter, b is a reference parameter, c is an output parameter, and i is a local variable.

静的変数Static variables

宣言されたフィールド、static修飾子と呼ばれる、静的変数します。A field declared with the static modifier is called a static variable. 静的変数は、静的コンス トラクターの実行前に存在するように、(静的コンス トラクター) その親の種類、および関連付けられているアプリケーション ドメインが存在しなくなるときに存在する停止します。A static variable comes into existence before execution of the static constructor (Static constructors) for its containing type, and ceases to exist when the associated application domain ceases to exist.

静的変数の初期値は、既定値 (既定値) の変数の型。The initial value of a static variable is the default value (Default values) of the variable's type.

確実な代入をチェックのために、静的変数は最初に割り当てられていると見なされます。For purposes of definite assignment checking, a static variable is considered initially assigned.

インスタンス変数Instance variables

なしで宣言されたフィールド、static修飾子と呼ばれる、インスタンス変数します。A field declared without the static modifier is called an instance variable.

クラスのインスタンス変数Instance variables in classes

クラスのインスタンス変数は、そのクラスの新しいインスタンスが作成され、そのインスタンスへの参照がないと、インスタンスのデストラクター (存在する場合) が実行時に存在しなくなったときに、存在するように得られます。An instance variable of a class comes into existence when a new instance of that class is created, and ceases to exist when there are no references to that instance and the instance's destructor (if any) has executed.

クラスのインスタンス変数の初期値は、既定値 (既定値) の変数の型。The initial value of an instance variable of a class is the default value (Default values) of the variable's type.

クラスのインスタンス変数は、確実な代入をチェックするために、最初に割り当てられていると見なされます。For the purpose of definite assignment checking, an instance variable of a class is considered initially assigned.

構造体にインスタンス変数Instance variables in structs

構造体のインスタンス変数には、正確に同じ有効期間が所属する構造体変数としてがあります。An instance variable of a struct has exactly the same lifetime as the struct variable to which it belongs. つまり、構造体の型の変数にまたは場合、存在しなくなりますすぎる構造体のインスタンス変数の操作を行います。In other words, when a variable of a struct type comes into existence or ceases to exist, so too do the instance variables of the struct.

構造体のインスタンス変数の初期の割り当ての状態は、構造体の変数の場合と同じです。The initial assignment state of an instance variable of a struct is the same as that of the containing struct variable. つまり、構造体変数が最初と見なされるタイミング割り当てられると、これがそのインスタンス変数と構造体変数が最初に割り当てられていないと見なされると、そのインスタンス変数が同様に割り当てられています。In other words, when a struct variable is considered initially assigned, so too are its instance variables, and when a struct variable is considered initially unassigned, its instance variables are likewise unassigned.

配列の要素Array elements

配列の要素は、配列インスタンスの作成時に存在することになるし、その配列インスタンスへの参照がない場合に存在しなくなります。The elements of an array come into existence when an array instance is created, and cease to exist when there are no references to that array instance.

各配列の要素の初期値は、既定値 (既定値) の配列の要素の型。The initial value of each of the elements of an array is the default value (Default values) of the type of the array elements.

配列の要素は、確実な代入をチェックするために、最初に割り当てられていると見なされます。For the purpose of definite assignment checking, an array element is considered initially assigned.

値パラメーターValue parameters

パラメーターなしで宣言された、refまたはout修飾子は、値パラメーターA parameter declared without a ref or out modifier is a value parameter.

関数メンバー (メソッド、インスタンス コンス トラクター、アクセサー、または演算子) または匿名関数の呼び出し時に存在するように値を持つパラメーターには、パラメーターが属していると、呼び出しで指定された引数の値で初期化されます。A value parameter comes into existence upon invocation of the function member (method, instance constructor, accessor, or operator) or anonymous function to which the parameter belongs, and is initialized with the value of the argument given in the invocation. 値を持つパラメーターは、通常、関数メンバーまたは匿名関数が戻るときに削除されます。A value parameter normally ceases to exist upon return of the function member or anonymous function. ただし、値パラメーターが匿名関数によってキャプチャされたかどうか (匿名関数式)、その有効期間をデリゲートには少なくとも拡張または作成の匿名関数式ツリーが対象であります。ガベージ コレクション。However, if the value parameter is captured by an anonymous function (Anonymous function expressions), its life time extends at least until the delegate or expression tree created from that anonymous function is eligible for garbage collection.

値を持つパラメーターは、確実な代入をチェックするために、最初に割り当てられていると見なされます。For the purpose of definite assignment checking, a value parameter is considered initially assigned.

参照パラメーターReference parameters

宣言したパラメーター、ref修飾子は、パラメーター参照します。A parameter declared with a ref modifier is a reference parameter.

参照パラメーターは、新しい記憶域の場所を作成できません。A reference parameter does not create a new storage location. 代わりに、参照パラメーターは、関数メンバーまたは匿名関数の呼び出しで引数として指定された変数と同じストレージ場所を表します。Instead, a reference parameter represents the same storage location as the variable given as the argument in the function member or anonymous function invocation. したがって、参照パラメーターの値は常に、基になる変数と同じです。Thus, the value of a reference parameter is always the same as the underlying variable.

次の確実な代入ルールは、参照パラメーターに適用されます。The following definite assignment rules apply to reference parameters. 説明されている出力パラメーターのさまざまな規則に注意してください出力パラメーターします。Note the different rules for output parameters described in Output parameters.

  • 変数を明示的に代入する必要があります (確実な代入) 関数のメンバーまたはデリゲートの呼び出しで参照パラメーターとして渡す前にします。A variable must be definitely assigned (Definite assignment) before it can be passed as a reference parameter in a function member or delegate invocation.
  • 関数メンバーまたは匿名関数の中で参照パラメーターが最初に割り当てられていると見なされます。Within a function member or anonymous function, a reference parameter is considered initially assigned.

インスタンス メソッドまたはインスタンス アクセサー、構造体型の内、thisキーワードは構造体の型の参照パラメーターとまったく同じ動作 (このアクセス)。Within an instance method or instance accessor of a struct type, the this keyword behaves exactly as a reference parameter of the struct type (This access).

出力パラメーターOutput parameters

宣言したパラメーター、out修飾子は、出力パラメーターします。A parameter declared with an out modifier is an output parameter.

出力パラメーターは、新しい記憶域の場所を作成できません。An output parameter does not create a new storage location. 代わりに、出力パラメーターは、関数のメンバーまたはデリゲートの呼び出しで引数として指定された変数と同じストレージ場所を表します。Instead, an output parameter represents the same storage location as the variable given as the argument in the function member or delegate invocation. したがって、出力パラメーターの値は常に、基になる変数と同じです。Thus, the value of an output parameter is always the same as the underlying variable.

次の確実な代入ルールは、出力パラメーターに適用されます。The following definite assignment rules apply to output parameters. 説明されている参照パラメーターのさまざまな規則に注意してくださいパラメーターを参照してします。Note the different rules for reference parameters described in Reference parameters.

  • 変数が必要ないに明示的に代入関数メンバーの出力パラメーターとして渡すことができますが、デリゲートの呼び出しまたは。A variable need not be definitely assigned before it can be passed as an output parameter in a function member or delegate invocation.
  • 関数メンバーまたはデリゲートの呼び出しが正常に完了した後、その実行パスと見なされます、出力パラメーターとして渡された各変数が割り当てられます。Following the normal completion of a function member or delegate invocation, each variable that was passed as an output parameter is considered assigned in that execution path.
  • 関数メンバーまたは匿名関数の中で、出力パラメーターが最初に割り当てられていないと見なされます。Within a function member or anonymous function, an output parameter is considered initially unassigned.
  • 関数のメンバーまたは匿名関数のすべての出力パラメーターを明示的に代入する必要があります (確実な代入) 関数の前にメンバーまたは匿名関数が通常どおり戻る。Every output parameter of a function member or anonymous function must be definitely assigned (Definite assignment) before the function member or anonymous function returns normally.

構造体の型のインスタンス コンス トラクター内で、thisキーワードは構造体の型の出力パラメーターとまったく同じ動作 (このアクセス)。Within an instance constructor of a struct type, the this keyword behaves exactly as an output parameter of the struct type (This access).

ローカル変数Local variables

Aローカル変数で宣言されて、 local_variable_declarationで発生する可能性があります、ブロックfor_statementswitch_statementまたはusing_statementまたは、 foreach_statementまたはspecific_catch_clauseをの 。try_statementします。A local variable is declared by a local_variable_declaration, which may occur in a block, a for_statement, a switch_statement or a using_statement; or by a foreach_statement or a specific_catch_clause for a try_statement.

ローカル変数の有効期間は、プログラムの実行を予約する記憶域を保証する部分です。The lifetime of a local variable is the portion of program execution during which storage is guaranteed to be reserved for it. この有効期間を拡張のエントリから、少なくとも、ブロックfor_statementswitch_statementusing_statementforeach_statement、またはspecific_catch_clauseそれが関連付けられている、その実行までブロックfor_statementswitch_statementusing_statementforeach_statement、またはspecific_catch_clause任意の方法で終了します。This lifetime extends at least from entry into the block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause with which it is associated, until execution of that block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause ends in any way. (入力、囲まれたブロックメソッドを呼び出すが、中断、終わらない、現在の実行またはブロックfor_statementswitch_statementusing_statementforeach_statement、またはspecific_catch_clause)。匿名関数でローカル変数をキャプチャするかどうか (外部変数をキャプチャ)、その有効期間に付属するその他のオブジェクトと共に、匿名関数から作成されたデリゲートまたは式ツリーまで少なくとも拡張キャプチャされた変数への参照はガベージ コレクションの対象とします。(Entering an enclosed block or calling a method suspends, but does not end, execution of the current block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause.) If the local variable is captured by an anonymous function (Captured outer variables), its lifetime extends at least until the delegate or expression tree created from the anonymous function, along with any other objects that come to reference the captured variable, are eligible for garbage collection.

場合、親ブロックfor_statementswitch_statementusing_statementforeach_statement、またはspecific_catch_clause入力が再帰的に、ローカル変数の新しいインスタンスのたびが作成し、そのlocal_variable_initializer、いずれかが評価される場合、各時間です。If the parent block, for_statement, switch_statement, using_statement, foreach_statement, or specific_catch_clause is entered recursively, a new instance of the local variable is created each time, and its local_variable_initializer, if any, is evaluated each time.

導入されたローカル変数、 local_variable_declarationが自動的に初期化されていないと、そのため、既定値がありません。A local variable introduced by a local_variable_declaration is not automatically initialized and thus has no default value. 確実な代入をチェックするためには、ローカル変数がで導入された、 local_variable_declarationは最初に割り当てられていないと見なされます。For the purpose of definite assignment checking, a local variable introduced by a local_variable_declaration is considered initially unassigned. A local_variable_declaration含めることができます、 local_variable_initializer、その場合、変数と見なされます明示的に代入、初期化式の後にのみ (宣言ステートメント)。A local_variable_declaration may include a local_variable_initializer, in which case the variable is considered definitely assigned only after the initializing expression (Declaration statements).

導入されたローカル変数のスコープ内で、 local_variable_declaration、前にあるテキストの位置でそのローカル変数を参照すると、コンパイル時エラー、 local_variable_declarator.Within the scope of a local variable introduced by a local_variable_declaration, it is a compile-time error to refer to that local variable in a textual position that precedes its local_variable_declarator. ローカル変数宣言に暗黙の型がある場合 (ローカル変数の宣言)、内の変数に参照するとエラーもそのlocal_variable_declaratorします。If the local variable declaration is implicit (Local variable declarations), it is also an error to refer to the variable within its local_variable_declarator.

導入されたローカル変数、 foreach_statementまたはspecific_catch_clause全体のスコープに確実に割り当てられていると見なされます。A local variable introduced by a foreach_statement or a specific_catch_clause is considered definitely assigned in its entire scope.

ローカル変数の実際の有効期間は、実装によって異なります。The actual lifetime of a local variable is implementation-dependent. たとえば、コンパイラ可能性があります静的に決定できるブロック内のローカル変数は、そのブロックの小さな部分にのみ使用します。For example, a compiler might statically determine that a local variable in a block is only used for a small portion of that block. この分析を使用して、コンパイラはその包含ブロックよりも短い有効期間を持つ変数の記憶域になるコードを生成可能性があります。Using this analysis, the compiler could generate code that results in the variable's storage having a shorter lifetime than its containing block.

ローカル参照変数によって参照されるストレージはローカル参照変数の有効期間とは独立して再利用 (自動メモリ管理)。The storage referred to by a local reference variable is reclaimed independently of the lifetime of that local reference variable (Automatic memory management).

既定の値Default values

次のカテゴリの変数は、既定値に自動的に初期化されます。The following categories of variables are automatically initialized to their default values:

  • 静的変数Static variables.
  • クラスのインスタンスのインスタンス変数。Instance variables of class instances.
  • 配列の要素。Array elements.

変数の既定値は、変数の型に依存し、次のように決定されます。The default value of a variable depends on the type of the variable and is determined as follows:

  • 変数のvalue_type、既定値はによって計算された値と同じ、 value_typeの既定のコンス トラクター (既定のコンス トラクター)。For a variable of a value_type, the default value is the same as the value computed by the value_type's default constructor (Default constructors).
  • 変数のreference_type、既定値はnullします。For a variable of a reference_type, the default value is null.

メモリ マネージャーによって既定値に初期化が普通または使用に割り当てられる前に、ガベージ コレクターがすべてのビットが 0 にメモリを初期化します。Initialization to default values is typically done by having the memory manager or garbage collector initialize memory to all-bits-zero before it is allocated for use. このため、null 参照を表すすべてのビットが 0 を使用すると便利です。For this reason, it is convenient to use all-bits-zero to represent the null reference.

確実な代入Definite assignment

関数メンバーの実行可能コード内の指定した位置に変数があると言います確実に代入、特定の静的フロー解析でコンパイラを証明できるかどうか (確実なを決定するための厳密な規則割り当て)、変数が自動的に初期化されるまたは少なくとも 1 つの割り当ての対象になっています。At a given location in the executable code of a function member, a variable is said to be definitely assigned if the compiler can prove, by a particular static flow analysis (Precise rules for determining definite assignment), that the variable has been automatically initialized or has been the target of at least one assignment. 確実な代入ルールは、します非公式説明すると。Informally stated, the rules of definite assignment are:

上記の非公式なルールを基になる正式な仕様については、「変数最初に割り当てられている変数最初に割り当てられていない、およびを決定するための厳密な規則確実な代入します。The formal specification underlying the above informal rules is described in Initially assigned variables, Initially unassigned variables, and Precise rules for determining definite assignment.

インスタンス変数の確実な割り当ての状態、 struct_type変数が全体としても個別に追跡されます。The definite assignment states of instance variables of a struct_type variable are tracked individually as well as collectively. 上記の規則に、次の規則にも適用されますstruct_type変数とそのインスタンス変数。In additional to the rules above, the following rules apply to struct_type variables and their instance variables:

  • インスタンス変数と見なされます確実に割り当てられている場合はそれを含んでいるstruct_type変数が確実に割り当てられていると見なされます。An instance variable is considered definitely assigned if its containing struct_type variable is considered definitely assigned.
  • A struct_type変数と見なされます確実に割り当てられている場合は確実に割り当てられているそれぞれのインスタンス変数と見なされます。A struct_type variable is considered definitely assigned if each of its instance variables is considered definitely assigned.

確実な代入では、次のコンテキストでの要件を示します。Definite assignment is a requirement in the following contexts:

  • 変数は、その値が取得される各場所では明示的に代入する必要があります。A variable must be definitely assigned at each location where its value is obtained. これにより、未定義の値が発生しません。This ensures that undefined values never occur. 式内の変数の出現が場合を除き、変数の値を取得すると見なされますThe occurrence of a variable in an expression is considered to obtain the value of the variable, except when
    • 変数は、単純な割り当ての左オペランドです。the variable is the left operand of a simple assignment,
    • 変数が出力パラメーターとして渡されたか、the variable is passed as an output parameter, or
    • 変数は、 struct_type変数とメンバー アクセスの左のオペランドとして発生します。the variable is a struct_type variable and occurs as the left operand of a member access.
  • 変数は、明示的に参照パラメーターとして渡されますが、それぞれの場所に代入する必要があります。A variable must be definitely assigned at each location where it is passed as a reference parameter. これにより、呼び出される関数メンバーが最初に割り当てられている参照パラメーターを検討できます。This ensures that the function member being invoked can consider the reference parameter initially assigned.
  • 関数メンバーを返しますの各場所で明示的関数メンバーのすべての出力パラメーターに代入する必要があります (を通じて、returnステートメントまたは実行関数メンバーの本文の終わりに達するまで)。All output parameters of a function member must be definitely assigned at each location where the function member returns (through a return statement or through execution reaching the end of the function member body). これにより、関数メンバー未定義の値に返しません、出力パラメーター、変数への代入と等価の出力パラメーターとして変数を受け取る関数メンバーの呼び出しを考慮するコンパイラが有効にします。This ensures that function members do not return undefined values in output parameters, thus enabling the compiler to consider a function member invocation that takes a variable as an output parameter equivalent to an assignment to the variable.
  • thisの変数をstruct_typeインスタンス コンス トラクターをそのコンス トラクターを返しますの各場所で間違いなく割り当てる必要があります。The this variable of a struct_type instance constructor must be definitely assigned at each location where that instance constructor returns.

最初に割り当てられた変数Initially assigned variables

次のカテゴリの変数は、初期割り当てられている分類されます。The following categories of variables are classified as initially assigned:

  • 静的変数Static variables.
  • クラスのインスタンスのインスタンス変数。Instance variables of class instances.
  • 最初に割り当てられている構造体の変数のインスタンス変数。Instance variables of initially assigned struct variables.
  • 配列の要素。Array elements.
  • 値のパラメーター。Value parameters.
  • 参照パラメーター。Reference parameters.
  • 宣言された変数をcatch句またはforeachステートメント。Variables declared in a catch clause or a foreach statement.

最初に割り当てられていない変数Initially unassigned variables

次のカテゴリの変数は、初期代入なしに分類されます。The following categories of variables are classified as initially unassigned:

  • 最初に割り当てられていない構造体の変数のインスタンス変数。Instance variables of initially unassigned struct variables.
  • 出力パラメーター、this構造体のインスタンス コンス トラクターの変数。Output parameters, including the this variable of struct instance constructors.
  • 宣言されたローカル変数を除く、catch句またはforeachステートメント。Local variables, except those declared in a catch clause or a foreach statement.

確実な代入を決定するための正確な規則Precise rules for determining definite assignment

を使用する各変数を明示的に代入を判断するために、コンパイラは、このセクションで説明したように相当するプロセスを使用する必要があります。In order to determine that each used variable is definitely assigned, the compiler must use a process that is equivalent to the one described in this section.

コンパイラは、最初に割り当てられていない 1 つまたは複数の変数を持つ各関数メンバーの本文を処理します。The compiler processes the body of each function member that has one or more initially unassigned variables. 最初に割り当てられていない各変数のv、コンパイラが判断を確実な代入状態v関数メンバーの次の点の各。For each initially unassigned variable v, the compiler determines a definite assignment state for v at each of the following points in the function member:

  • 各ステートメントの先頭にAt the beginning of each statement
  • 最後の時点で (エンドポイントと到達可能性) の各ステートメントAt the end point (End points and reachability) of each statement
  • それぞれの円弧の制御を移す別のステートメントまたはステートメントの終了点On each arc which transfers control to another statement or to the end point of a statement
  • 各式の先頭にAt the beginning of each expression
  • 各式の最後にAt the end of each expression

確実な代入状態vいずれかになります。The definite assignment state of v can be either:

  • 明示的に代入します。Definitely assigned. この時点ですべての可能な制御フローのことを示しますこれは、 vに値が代入されています。This indicates that on all possible control flows to this point, v has been assigned a value.
  • 間違いなく割り当てられています。Not definitely assigned. 型の式の最後に変数の状態のbool、間違いなく月が割り当てられていない (ただし、必ずしも) 変数の状態は、次のサブ状態のいずれかに分類されます。For the state of a variable at the end of an expression of type bool, the state of a variable that isn't definitely assigned may (but doesn't necessarily) fall into one of the following sub-states:
    • 間違いなく true 式の後に割り当てられます。Definitely assigned after true expression. この状態では、ことを示しますvブール式が true として評価は、ブール式が false と評価された場合とは限りません割り当てられていない場合は確実に代入します。This state indicates that v is definitely assigned if the boolean expression evaluated as true, but is not necessarily assigned if the boolean expression evaluated as false.
    • False の式の後に確実に代入します。Definitely assigned after false expression. この状態では、ことを示しますvブール式が false として評価は、ブール式が true と評価された場合とは限りません割り当てられていない場合は確実に代入します。This state indicates that v is definitely assigned if the boolean expression evaluated as false, but is not necessarily assigned if the boolean expression evaluated as true.

次の規則が、どのように変数の状態vは場所ごとに決定されます。The following rules govern how the state of a variable v is determined at each location.

ステートメントの一般的な規則General rules for statements

  • v関数メンバーの本文の先頭に確実に代入できません。v is not definitely assigned at the beginning of a function member body.
  • vが確実に到達不可能なステートメントの先頭に代入します。v is definitely assigned at the beginning of any unreachable statement.
  • 確実な代入状態vの確実な割り当ての状態をチェックして、他のステートメントの先頭に決定されますvの先頭を対象とするすべてのコントロール フロー転送ステートメント。The definite assignment state of v at the beginning of any other statement is determined by checking the definite assignment state of v on all control flow transfers that target the beginning of that statement. 場合 (および場合にのみ) vし、割り当て、このようなすべてのコントロールのフローの転送に間違いなくvが確実に割り当て、ステートメントの先頭にします。If (and only if) v is definitely assigned on all such control flow transfers, then v is definitely assigned at the beginning of the statement. ステートメントの到達可能性のチェックと同じ方法で移動する可能性のある制御フローのセットが決定されます (エンドポイントと到達可能性)。The set of possible control flow transfers is determined in the same way as for checking statement reachability (End points and reachability).
  • 確実な代入状態vブロックの終了点でcheckeduncheckedifwhiledoforforeachlockusing、またはswitchの確実な割り当ての状態を確認してステートメントが決定されますvをそのステートメントの終点を対象とするすべてのコントロール フロー転送します。The definite assignment state of v at the end point of a block, checked, unchecked, if, while, do, for, foreach, lock, using, or switch statement is determined by checking the definite assignment state of v on all control flow transfers that target the end point of that statement. 場合vが確実に割り当て、このようなすべてのコントロールのフローの転送で、 vが確実に割り当て、ステートメントの終了時点。If v is definitely assigned on all such control flow transfers, then v is definitely assigned at the end point of the statement. それ以外の場合。vステートメントの終了時点で確実に代入できません。Otherwise; v is not definitely assigned at the end point of the statement. ステートメントの到達可能性のチェックと同じ方法で移動する可能性のある制御フローのセットが決定されます (エンドポイントと到達可能性)。The set of possible control flow transfers is determined in the same way as for checking statement reachability (End points and reachability).

オンになっている、ブロックのステートメントと unchecked ステートメントBlock statements, checked, and unchecked statements

確実な代入状態vブロックにおけるステートメント リストの最初のステートメント (またはステートメントの一覧が空の場合は、ブロックの終了点) の転送では、コントロールがの確実な代入ステートメントと同じv 、ブロックの前にchecked、またはuncheckedステートメント。The definite assignment state of v on the control transfer to the first statement of the statement list in the block (or to the end point of the block, if the statement list is empty) is the same as the definite assignment statement of v before the block, checked, or unchecked statement.

式ステートメントExpression statements

式ステートメントのstmt式で構成されるexpr:For an expression statement stmt that consists of the expression expr:

  • vの先頭に同じ状態の確実な代入exprの先頭としてstmtします。v has the same definite assignment state at the beginning of expr as at the beginning of stmt.
  • 場合vの最後に確実に割り当てられている場合expr、間違いなくの終了ポイントに割り当てられているstmtそれの終点で間違いなく割り当てがありませんstmtします。If v if definitely assigned at the end of expr, it is definitely assigned at the end point of stmt; otherwise; it is not definitely assigned at the end point of stmt.

宣言ステートメントDeclaration statements

  • 場合stmt宣言のステートメントは、初期化子のない、 vの終了時点で確実な代入状態の同じstmt の先頭としてstmtします。If stmt is a declaration statement without initializers, then v has the same definite assignment state at the end point of stmt as at the beginning of stmt.
  • 場合stmtと初期化子、宣言ステートメントは次の明確な割り当ての状態は、 v決定場合とstmtが 1 つの割り当てと、ステートメントの一覧(宣言) の順序で初期化子による各宣言ステートメントです。If stmt is a declaration statement with initializers, then the definite assignment state for v is determined as if stmt were a statement list, with one assignment statement for each declaration with an initializer (in the order of declaration).

場合ステートメントIf statements

ifステートメントstmtの形式。For an if statement stmt of the form:

if ( expr ) then_stmt else else_stmt
  • vの先頭に同じ状態の確実な代入exprの先頭としてstmtします。v has the same definite assignment state at the beginning of expr as at the beginning of stmt.
  • 場合vの最後に明示的に代入がexpr、確実に制御フローの移動で割り当てられているし、 then_stmtとするか、 else_stmtまたはのエンドポイントにstmt else 句がない場合。If v is definitely assigned at the end of expr, then it is definitely assigned on the control flow transfer to then_stmt and to either else_stmt or to the end-point of stmt if there is no else clause.
  • 場合vの末尾に「間違いなく true 式の後に割り当て済み」の状態を持つexpr、確実に制御フローの移動で割り当てられているし、 then_stmt、および not間違いなくいずれかを制御フローの移動で割り当てられているelse_stmtまたはのエンドポイントにstmt else 句がない場合。If v has the state "definitely assigned after true expression" at the end of expr, then it is definitely assigned on the control flow transfer to then_stmt, and not definitely assigned on the control flow transfer to either else_stmt or to the end-point of stmt if there is no else clause.
  • 場合vの末尾に「を代入式が false の後に」の状態を持つexpr、確実に制御フローの移動で割り当てられているし、 else_stmt、および not制御フローの移動の代入then_stmtします。If v has the state "definitely assigned after false expression" at the end of expr, then it is definitely assigned on the control flow transfer to else_stmt, and not definitely assigned on the control flow transfer to then_stmt. 間違いなくのエンドポイントに割り当てられているstmt間違いなくのエンドポイントに割り当てられている場合にのみthen_stmtします。It is definitely assigned at the end-point of stmt if and only if it is definitely assigned at the end-point of then_stmt.
  • それ以外の場合、 vはいないと見なされるいずれかを制御フローの転送を確実に割り当てられた、 then_stmtまたはelse_stmt、またはのエンドポイントにstmt else 句がない場合。Otherwise, v is considered not definitely assigned on the control flow transfer to either the then_stmt or else_stmt, or to the end-point of stmt if there is no else clause.

Switch ステートメントSwitch statements

switchステートメントstmt制御式とexpr:In a switch statement stmt with a controlling expression expr:

  • 確実な代入状態vの先頭にexprの状態と同じでは、 vの先頭にstmtします。The definite assignment state of v at the beginning of expr is the same as the state of v at the beginning of stmt.
  • 確実な代入状態v到達可能なスイッチ ブロック ステートメントの一覧への転送では、制御フローでが確実な割り当ての状態のと同じvの最後にexpr.The definite assignment state of v on the control flow transfer to a reachable switch block statement list is the same as the definite assignment state of v at the end of expr.

While ステートメントWhile statements

whileステートメントstmtの形式。For a while statement stmt of the form:

while ( expr ) while_body
  • vの先頭に同じ状態の確実な代入exprの先頭としてstmtします。v has the same definite assignment state at the beginning of expr as at the beginning of stmt.
  • 場合vの最後に明示的に代入がexpr、確実に制御フローの移動で割り当てられているし、 while_bodyと終点をstmtします。If v is definitely assigned at the end of expr, then it is definitely assigned on the control flow transfer to while_body and to the end point of stmt.
  • 場合vの末尾に「間違いなく true 式の後に割り当て済み」の状態を持つexpr、確実に制御フローの移動で割り当てられているし、 while_bodyがありませんエンドポイントで確実に代入stmtします。If v has the state "definitely assigned after true expression" at the end of expr, then it is definitely assigned on the control flow transfer to while_body, but not definitely assigned at the end-point of stmt.
  • 場合vの末尾に「を代入式が false の後に」の状態を持つexpr、間違いなくの終了点への制御フローの移動で割り当てられているし、 stmt、への制御フローの移動では間違いなく割り当てられていませんが、 while_bodyします。If v has the state "definitely assigned after false expression" at the end of expr, then it is definitely assigned on the control flow transfer to the end point of stmt, but not definitely assigned on the control flow transfer to while_body.

Do ステートメントDo statements

doステートメントstmtの形式。For a do statement stmt of the form:

do do_body while ( expr ) ;
  • vの先頭からの制御フローの移動で同じ状態の確実な代入stmtdo_bodyの先頭としてstmtします。v has the same definite assignment state on the control flow transfer from the beginning of stmt to do_body as at the beginning of stmt.
  • vの先頭に同じ状態の確実な代入exprの終了時点としてdo_bodyします。v has the same definite assignment state at the beginning of expr as at the end point of do_body.
  • 場合vの最後に明示的に代入がexpr、間違いなくの終了点への制御フローの移動で割り当てられているし、 stmtします。If v is definitely assigned at the end of expr, then it is definitely assigned on the control flow transfer to the end point of stmt.
  • 場合vの末尾に「を代入式が false の後に」の状態を持つexpr、間違いなくの終了点への制御フローの移動で割り当てられているし、 stmt.If v has the state "definitely assigned after false expression" at the end of expr, then it is definitely assigned on the control flow transfer to the end point of stmt.

ステートメントFor statements

確実な代入のチェック、for形式のステートメント。Definite assignment checking for a for statement of the form:

for ( for_initializer ; for_condition ; for_iterator ) embedded_statement

ステートメントが記述された場合とが行われます。is done as if the statement were written:

{
    for_initializer ;
    while ( for_condition ) {
        embedded_statement ;
        for_iterator ;
    }
}

場合、 for_conditionから省略すると、forステートメント、し、確実な代入処理の進行状況の評価としてfor_conditionに置き換えられましたtrueで上記の拡張.If the for_condition is omitted from the for statement, then evaluation of definite assignment proceeds as if for_condition were replaced with true in the above expansion.

中断、続行、および goto ステートメントBreak, continue, and goto statements

確実な代入状態vによる制御フローの転送、 breakcontinue、またはgotoステートメントが確実な割り当ての状態のと同じvで、ステートメントの先頭。The definite assignment state of v on the control flow transfer caused by a break, continue, or goto statement is the same as the definite assignment state of v at the beginning of the statement.

Throw ステートメントThrow statements

ステートメントのstmtのフォームFor a statement stmt of the form

throw expr ;

確実な代入状態vの先頭にexprの確実な割り当ての状態と同じvの先頭にstmt.The definite assignment state of v at the beginning of expr is the same as the definite assignment state of v at the beginning of stmt.

Return ステートメントReturn statements

ステートメントのstmtのフォームFor a statement stmt of the form

return expr ;
  • 確実な代入状態vの先頭にexprの確実な割り当ての状態と同じvの先頭にstmt.The definite assignment state of v at the beginning of expr is the same as the definite assignment state of v at the beginning of stmt.
  • 場合vが出力パラメーターでは、間違いなく割り当てる必要がありますか。If v is an output parameter, then it must be definitely assigned either:
    • exprafter expr
    • またはの最後に、finallyのブロックをtry - finallyまたはtry - catch - finallyを囲む、returnステートメント。or at the end of the finally block of a try-finally or try-catch-finally that encloses the return statement.

形式のステートメント stmt:For a statement stmt of the form:

return ;
  • 場合vが出力パラメーターでは、間違いなく割り当てる必要がありますか。If v is an output parameter, then it must be definitely assigned either:
    • 前にstmtbefore stmt
    • またはの最後に、finallyのブロックをtry - finallyまたはtry - catch - finallyを囲む、returnステートメント。or at the end of the finally block of a try-finally or try-catch-finally that encloses the return statement.

Try-catch ステートメントTry-catch statements

ステートメントのstmtの形式。For a statement stmt of the form:

try try_block
catch(...) catch_block_1
...
catch(...) catch_block_n
  • 確実な代入状態vの先頭にtry_blockの確実な割り当ての状態と同じvの先頭にstmt.The definite assignment state of v at the beginning of try_block is the same as the definite assignment state of v at the beginning of stmt.
  • 確実な代入状態vの先頭にcatch_block_i (いずれかの) の明確な割り当ての状態と同じvの先頭にstmtします。The definite assignment state of v at the beginning of catch_block_i (for any i) is the same as the definite assignment state of v at the beginning of stmt.
  • 確実な代入状態vのエンドポイントでstmtは確実に割り当てられている場合 (および場合にのみ) vのエンドポイントで確実に代入がtry_block 、毎回catch_block_i (のすべて1 ~ n)。The definite assignment state of v at the end-point of stmt is definitely assigned if (and only if) v is definitely assigned at the end-point of try_block and every catch_block_i (for every i from 1 to n).

Try finally ステートメントTry-finally statements

tryステートメントstmtの形式。For a try statement stmt of the form:

try try_block finally finally_block
  • 確実な代入状態vの先頭にtry_blockの確実な割り当ての状態と同じvの先頭にstmt.The definite assignment state of v at the beginning of try_block is the same as the definite assignment state of v at the beginning of stmt.
  • 確実な代入状態vの先頭にfinally_blockの確実な割り当ての状態と同じvの先頭にstmt.The definite assignment state of v at the beginning of finally_block is the same as the definite assignment state of v at the beginning of stmt.
  • 確実な代入状態vのエンドポイントでstmtは確実に割り当てられている場合 (および場合にのみ)、次の少なくとも 1 つが true:The definite assignment state of v at the end-point of stmt is definitely assigned if (and only if) at least one of the following is true:
    • vのエンドポイントで確実に代入がtry_blockv is definitely assigned at the end-point of try_block
    • vのエンドポイントで確実に代入がfinally_blockv is definitely assigned at the end-point of finally_block

制御フローの転送の場合 (など、gotoステートメント) が行われた内で開始try_block、以外の終了とtry_block、しvも場合、その制御フローの転送を確実に割り当てられていると見なされますvのエンドポイントで確実に代入がfinally_blockします。If a control flow transfer (for example, a goto statement) is made that begins within try_block, and ends outside of try_block, then v is also considered definitely assigned on that control flow transfer if v is definitely assigned at the end-point of finally_block. (これは、場合にのみではありません — 場合vが間違いなくこの制御フローの転送時に別の理由を割り当てられて明示的に代入みなされますし、)。(This is not an only if—if v is definitely assigned for another reason on this control flow transfer, then it is still considered definitely assigned.)

Try – catch – finally ステートメントTry-catch-finally statements

分析を確実な代入をtry - catch - finally形式のステートメント。Definite assignment analysis for a try-catch-finally statement of the form:

try try_block
catch(...) catch_block_1
...
catch(...) catch_block_n
finally *finally_block*

場合、ステートメントが同じように行われますが、 try - finallyステートメントを囲む、 try - catchステートメント。is done as if the statement were a try-finally statement enclosing a try-catch statement:

try {
    try try_block
    catch(...) catch_block_1
    ...
    catch(...) catch_block_n
}
finally finally_block

次の例で方法の異なるブロック、tryステートメント (try ステートメント) に影響する確実な代入です。The following example demonstrates how the different blocks of a try statement (The try statement) affect definite assignment.

class A
{
    static void F() {
        int i, j;
        try {
            goto LABEL;
            // neither i nor j definitely assigned
            i = 1;
            // i definitely assigned
        }

        catch {
            // neither i nor j definitely assigned
            i = 3;
            // i definitely assigned
        }

        finally {
            // neither i nor j definitely assigned
            j = 5;
            // j definitely assigned
            }
        // i and j definitely assigned
        LABEL:;
        // j definitely assigned

    }
}

Foreach ステートメントForeach statements

foreachステートメントstmtの形式。For a foreach statement stmt of the form:

foreach ( type identifier in expr ) embedded_statement
  • 確実な代入状態vの先頭にexprの状態と同じでは、 vの先頭にstmtします。The definite assignment state of v at the beginning of expr is the same as the state of v at the beginning of stmt.
  • 確実な代入状態vへの制御フローの移動でembedded_statementまたはの終点をstmtの状態と同じでは、 vの最後にexprします。The definite assignment state of v on the control flow transfer to embedded_statement or to the end point of stmt is the same as the state of v at the end of expr.

ステートメントを使用します。Using statements

usingステートメントstmtの形式。For a using statement stmt of the form:

using ( resource_acquisition ) embedded_statement
  • 確実な代入状態vの先頭にresource_acquisitionの状態と同じでは、 vの先頭にstmt.The definite assignment state of v at the beginning of resource_acquisition is the same as the state of v at the beginning of stmt.
  • 確実な代入状態vへの制御フローの移動でembedded_statementの状態と同じでは、 vの最後にresource_買収します。The definite assignment state of v on the control flow transfer to embedded_statement is the same as the state of v at the end of resource_acquisition.

Lock ステートメントLock statements

lockステートメントstmtの形式。For a lock statement stmt of the form:

lock ( expr ) embedded_statement
  • 確実な代入状態vの先頭にexprの状態と同じでは、 vの先頭にstmtします。The definite assignment state of v at the beginning of expr is the same as the state of v at the beginning of stmt.
  • 確実な代入状態vへの制御フローの移動でembedded_statementの状態と同じでは、 vの最後にexpr.The definite assignment state of v on the control flow transfer to embedded_statement is the same as the state of v at the end of expr.

Yield ステートメントYield statements

yield returnステートメントstmtの形式。For a yield return statement stmt of the form:

yield return expr ;
  • 確実な代入状態vの先頭にexprの状態と同じでは、 vの先頭にstmtします。The definite assignment state of v at the beginning of expr is the same as the state of v at the beginning of stmt.
  • 確実な代入状態vの最後にstmtの状態と同じでは、 vの最後にexprします。The definite assignment state of v at the end of stmt is the same as the state of v at the end of expr.
  • Ayield breakステートメントが確実な代入の状態に影響を与えません。A yield break statement has no effect on the definite assignment state.

単純式での一般的な規則General rules for simple expressions

これらの種類の式に、次の規則が適用されますリテラル (リテラル)、単純な名前 (簡易名)、メンバー アクセス式 (メンバー アクセス)、。インデックスのないベース アクセス式 (Base アクセス)、typeof式 (typeof 演算子)、既定の値式 (既定の値式) とnameof式 (Nameof 式)。The following rule applies to these kinds of expressions: literals (Literals), simple names (Simple names), member access expressions (Member access), non-indexed base access expressions (Base access), typeof expressions (The typeof operator), default value expressions (Default value expressions) and nameof expressions (Nameof expressions).

  • 確実な代入状態vはの確実な割り当ての状態と同じような式の末尾にv式の先頭にします。The definite assignment state of v at the end of such an expression is the same as the definite assignment state of v at the beginning of the expression.

埋め込み式を持つ式の一般的な規則General rules for expressions with embedded expressions

これらの種類の式に、次の規則が適用されます: かっこで囲まれた式 (かっこで囲まれた式)、要素アクセス式 (要素へのアクセス)、基本アクセスを含む式インデックスの作成 (Base アクセス)、インクリメントおよびデクリメント式 (置インクリメント演算子と前置デクリメント演算子前置インクリメントとデクリメント演算子)、キャスト式 (キャスト式)、単項+-~*式、バイナリ+-*/, %, <<, >>, <, <=, >, >=, ==, !=, is, as, &|^式 (算術演算子シフト演算子関係式と型検査演算子論理演算子)、複合代入式 (複合代入)、checkedunchecked式 (checked と unchecked演算子)、さらに配列とデリゲート作成式 (new 演算子)。The following rules apply to these kinds of expressions: parenthesized expressions (Parenthesized expressions), element access expressions (Element access), base access expressions with indexing (Base access), increment and decrement expressions (Postfix increment and decrement operators, Prefix increment and decrement operators), cast expressions (Cast expressions), unary +, -, ~, * expressions, binary +, -, *, /, %, <<, >>, <, <=, >, >=, ==, !=, is, as, &, |, ^ expressions (Arithmetic operators, Shift operators, Relational and type-testing operators, Logical operators), compound assignment expressions (Compound assignment), checked and unchecked expressions (The checked and unchecked operators), plus array and delegate creation expressions (The new operator).

それぞれの式は、無条件に一定の順序で評価される 1 つまたは複数のサブ式があります。Each of these expressions has one or more sub-expressions that are unconditionally evaluated in a fixed order. たとえば、バイナリ%演算子を評価し、演算子の左側、右側にあります。For example, the binary % operator evaluates the left hand side of the operator, then the right hand side. インデックス作成操作では、インデックス付きの式を評価しの各インデックス式、順序は左から右に評価し、します。An indexing operation evaluates the indexed expression, and then evaluates each of the index expressions, in order from left to right. 式のexpr、サブ式を持つe1、e2、…、eN、その順序で評価されます。For an expression expr, which has sub-expressions e1, e2, ..., eN, evaluated in that order:

  • 確実な代入状態vの先頭にe1の先頭に明確な割り当ての状態と同じexprします。The definite assignment state of v at the beginning of e1 is the same as the definite assignment state at the beginning of expr.
  • 確実な代入状態vの先頭にei (1 より大きい) 以前のサブ式の末尾に明確な割り当ての状態の場合と同じです。The definite assignment state of v at the beginning of ei (i greater than one) is the same as the definite assignment state at the end of the previous sub-expression.
  • 確実な代入状態vの最後にexprの最後に明確な割り当ての状態と同じeNThe definite assignment state of v at the end of expr is the same as the definite assignment state at the end of eN

Invocation 式とオブジェクト作成式Invocation expressions and object creation expressions

Invocation 式のexprの形式。For an invocation expression expr of the form:

primary_expression ( arg1 , arg2 , ... , argN )

または、フォームのオブジェクト作成式:or an object creation expression of the form:

new type ( arg1 , arg2 , ... , argN )
  • Invocation 式での確実な割り当ての状態のvする前にprimary_expressionの状態と同じでは、 vする前にexpr.For an invocation expression, the definite assignment state of v before primary_expression is the same as the state of v before expr.
  • Invocation 式での確実な割り当ての状態のvする前にarg1の状態と同じでは、 vprimary_expression.For an invocation expression, the definite assignment state of v before arg1 is the same as the state of v after primary_expression.
  • オブジェクト作成式での確実な割り当ての状態をvする前にarg1の状態と同じでは、 vする前にexprします。For an object creation expression, the definite assignment state of v before arg1 is the same as the state of v before expr.
  • 各引数のargiの確実な代入状態vargiは無視して、通常の式の規則によって決まりますrefまたはout修飾子。For each argument argi, the definite assignment state of v after argi is determined by the normal expression rules, ignoring any ref or out modifiers.
  • 各引数のargi1 の確実な割り当ての状態よりも大きいvする前にargiの状態の場合と同じですv前後argします。For each argument argi for any i greater than one, the definite assignment state of v before argi is the same as the state of v after the previous arg.
  • 場合、変数vとして渡される、out引数 (つまり、フォームの引数out v)、引数は、次の状態のいずれかでvexpr間違いなく割り当てられます。If the variable v is passed as an out argument (i.e., an argument of the form out v) in any of the arguments, then the state of v after expr is definitely assigned. それ以外の場合。状態vexprの状態と同じでは、 vargNします。Otherwise; the state of v after expr is the same as the state of v after argN.
  • 配列初期化子の (配列作成式)、オブジェクト初期化子 (オブジェクト初期化子)、コレクション初期化子 (コレクション初期化子) と匿名オブジェクト初期化子 (匿名オブジェクト作成式)、これらのコンストラクトがの観点で定義されている拡張によって明確な割り当ての状態が決定されます。For array initializers (Array creation expressions), object initializers (Object initializers), collection initializers (Collection initializers) and anonymous object initializers (Anonymous object creation expressions), the definite assignment state is determined by the expansion that these constructs are defined in terms of.

単純な代入式Simple assignment expressions

式のexprフォームのw = expr_rhs:For an expression expr of the form w = expr_rhs:

  • 確実な代入状態vする前にexpr_rhsの確実な割り当ての状態と同じvする前にexprします。The definite assignment state of v before expr_rhs is the same as the definite assignment state of v before expr.
  • 確実な代入状態vexprによって決定されます。The definite assignment state of v after expr is determined by:
    • 場合wとして変数が同じvの確実な代入状態vexprは確実に代入します。If w is the same variable as v, then the definite assignment state of v after expr is definitely assigned.
    • 場合、構造体の型のインスタンス コンス トラクター内で、割り当てが行われた場合w 、自動的に実装されたプロパティを指定するプロパティへのアクセスは、 Pで構築されるインスタンスvの非表示のバッキング フィールドは、 Pの確実な代入状態vexprは間違いなく割り当てられます。Otherwise, if the assignment occurs within the instance constructor of a struct type, if w is a property access designating an automatically implemented property P on the instance being constructed and v is the hidden backing field of P, then the definite assignment state of v after expr is definitely assigned.
    • それ以外の場合の確実な代入状態vexprの確実な割り当ての状態と同じvexpr_rhsします。Otherwise, the definite assignment state of v after expr is the same as the definite assignment state of v after expr_rhs.

& & (AND 条件付き) 式&& (conditional AND) expressions

式のexprフォームのexpr_first && expr_second:For an expression expr of the form expr_first && expr_second:

  • 確実な代入状態vする前にexpr_firstの確実な割り当ての状態と同じvする前にexprします。The definite assignment state of v before expr_first is the same as the definite assignment state of v before expr.
  • 確実な代入状態vする前にexpr_second場合が確実に割り当ての状態vexpr_firstいずれかです明示的に代入または「間違いなく true 式の後に割り当てられている」します。The definite assignment state of v before expr_second is definitely assigned if the state of v after expr_first is either definitely assigned or "definitely assigned after true expression". それ以外の場合、これは間違いなく割り当てられません。Otherwise, it is not definitely assigned.
  • 確実な代入状態vexprによって決定されます。The definite assignment state of v after expr is determined by:
    • 場合expr_firstの定数式の値では、falseの確実な代入状態vexpr確実な代入と同じです状態のvexpr_firstします。If expr_first is a constant expression with the value false, then the definite assignment state of v after expr is the same as the definite assignment state of v after expr_first.
    • の場合の状態vexpr_firstが確実に割り当て、次の状態vexprは確実に代入します。Otherwise, if the state of v after expr_first is definitely assigned, then the state of v after expr is definitely assigned.
    • の場合の状態vexpr_secondが確実に割り当て、および状態のvexpr_firstは"間違いなく割り当てられた式が false の後に"、その後の状態vexprは確実に代入します。Otherwise, if the state of v after expr_second is definitely assigned, and the state of v after expr_first is "definitely assigned after false expression", then the state of v after expr is definitely assigned.
    • の場合、状態のvexpr_secondが確実に割り当てまたは「明示的に代入式が true の後に」後の状態vexpr 「は確実に代入式の true」です。Otherwise, if the state of v after expr_second is definitely assigned or "definitely assigned after true expression", then the state of v after expr is "definitely assigned after true expression".
    • の場合、状態のvexpr_first 「明示的に代入式が false の後に」、"と"の状態は、 vexpr_second 「明示的に代入式が false の後に」、その後の状態は、 vexpr 「は確実に代入式が false の後に」。Otherwise, if the state of v after expr_first is "definitely assigned after false expression", and the state of v after expr_second is "definitely assigned after false expression", then the state of v after expr is "definitely assigned after false expression".
    • それ以外の場合、状態のvexprが確実に割り当てできません。Otherwise, the state of v after expr is not definitely assigned.

In the example

class A
{
    static void F(int x, int y) {
        int i;
        if (x >= 0 && (i = y) >= 0) {
            // i definitely assigned
        }
        else {
            // i not definitely assigned
        }
        // i not definitely assigned
    }
}

変数iの埋め込みステートメントのいずれかで確実に割り当てられていると見なされます、ifステートメントが他にない。the variable i is considered definitely assigned in one of the embedded statements of an if statement but not in the other. ifメソッドでステートメントF、変数iために埋め込みの最初のステートメントで間違いなく割り当てられた式の実行(i = y)この埋め込みステートメントの実行の前に必ずします。In the if statement in method F, the variable i is definitely assigned in the first embedded statement because execution of the expression (i = y) always precedes execution of this embedded statement. これに対して、変数iが間違いなく割り当てられていない 2 番目の埋め込みステートメントの後x >= 0可能性がありますの検査が false の場合、変数にi未割り当て。In contrast, the variable i is not definitely assigned in the second embedded statement, since x >= 0 might have tested false, resulting in the variable i being unassigned.

||(条件付き OR) 式|| (conditional OR) expressions

式のexprフォームのexpr_first || expr_second:For an expression expr of the form expr_first || expr_second:

  • 確実な代入状態vする前にexpr_firstの確実な割り当ての状態と同じvする前にexprします。The definite assignment state of v before expr_first is the same as the definite assignment state of v before expr.
  • 確実な代入状態vする前にexpr_second場合が確実に割り当ての状態vexpr_firstいずれかです明示的に代入または「false 式の後に間違いなく割り当て済み」です。The definite assignment state of v before expr_second is definitely assigned if the state of v after expr_first is either definitely assigned or "definitely assigned after false expression". それ以外の場合、これは間違いなく割り当てられません。Otherwise, it is not definitely assigned.
  • 確実な代入ステートメントのvexprによって決定されます。The definite assignment statement of v after expr is determined by:
    • 場合expr_firstの定数式の値では、trueの確実な代入状態vexpr確実な代入と同じです状態のvexpr_firstします。If expr_first is a constant expression with the value true, then the definite assignment state of v after expr is the same as the definite assignment state of v after expr_first.
    • の場合の状態vexpr_firstが確実に割り当て、次の状態vexprは確実に代入します。Otherwise, if the state of v after expr_first is definitely assigned, then the state of v after expr is definitely assigned.
    • の場合の状態vexpr_secondが確実に割り当て、および状態のvexpr_firstは"間違いなく割り当てられている場合は true。 式の後に"、その後の状態vexprは確実に代入します。Otherwise, if the state of v after expr_second is definitely assigned, and the state of v after expr_first is "definitely assigned after true expression", then the state of v after expr is definitely assigned.
    • の場合、状態のvexpr_secondが確実に割り当てまたは「明示的に代入式が false の後に」後の状態vexpr 「は確実に代入式が false の後に」。Otherwise, if the state of v after expr_second is definitely assigned or "definitely assigned after false expression", then the state of v after expr is "definitely assigned after false expression".
    • の場合、状態のvexpr_first 「明示的に代入式の true」、"と"の状態は、 vexpr_second「明示的に代入式の true」、その後の状態は、 vexpr 「は確実に代入式の true」です。Otherwise, if the state of v after expr_first is "definitely assigned after true expression", and the state of v after expr_second is "definitely assigned after true expression", then the state of v after expr is "definitely assigned after true expression".
    • それ以外の場合、状態のvexprが確実に割り当てできません。Otherwise, the state of v after expr is not definitely assigned.

In the example

class A
{
    static void G(int x, int y) {
        int i;
        if (x >= 0 || (i = y) >= 0) {
            // i not definitely assigned
        }
        else {
            // i definitely assigned
        }
        // i not definitely assigned
    }
}

変数iの埋め込みステートメントのいずれかで確実に割り当てられていると見なされます、ifステートメントが他にない。the variable i is considered definitely assigned in one of the embedded statements of an if statement but not in the other. ifメソッドでステートメントG、変数iために 2 番目の埋め込みステートメントで間違いなく割り当てられた式の実行(i = y)この埋め込みステートメントの実行の前に必ずします。In the if statement in method G, the variable i is definitely assigned in the second embedded statement because execution of the expression (i = y) always precedes execution of this embedded statement. これに対して、変数iが間違いなく割り当てられていない最初の埋め込みステートメントの後x >= 0可能性がありますの検査が true の場合、変数にi未割り当て。In contrast, the variable i is not definitely assigned in the first embedded statement, since x >= 0 might have tested true, resulting in the variable i being unassigned.

!! (論理否定) 式(logical negation) expressions

式のexprフォームの! expr_operand:For an expression expr of the form ! expr_operand:

  • 確実な代入状態vする前にexpr_operandの確実な割り当ての状態と同じvする前にexprします。The definite assignment state of v before expr_operand is the same as the definite assignment state of v before expr.
  • 確実な代入状態vexprによって決定されます。The definite assignment state of v after expr is determined by:
    • 場合の状態v後 * expr_operand * が確実に割り当て、次の状態vexprは確実に代入します。If the state of v after *expr_operand *is definitely assigned, then the state of v after expr is definitely assigned.
    • 場合の状態v後 * expr_operand * が間違いなく割り当てられていない、状態のvexprが確実に割り当てできません。If the state of v after *expr_operand *is not definitely assigned, then the state of v after expr is not definitely assigned.
    • 場合の状態v後 * expr_operand 「明示的に代入式が false の後に」、その後の状態は、 vexpr* "は確実に代入後 true式"です。If the state of v after *expr_operand *is "definitely assigned after false expression", then the state of v after expr is "definitely assigned after true expression".
    • 場合の状態v後 * expr_operand "は true 式の後には割り当て間違いなく、"次の状態は、 vexpr* "は確実に代入後 false。式"です。If the state of v after *expr_operand *is "definitely assigned after true expression", then the state of v after expr is "definitely assigned after false expression".

???? 式の (null 合体演算子)(null coalescing) expressions

式のexprフォームのexpr_first ?? expr_second:For an expression expr of the form expr_first ?? expr_second:

  • 確実な代入状態vする前にexpr_firstの確実な割り当ての状態と同じvする前にexprします。The definite assignment state of v before expr_first is the same as the definite assignment state of v before expr.
  • 確実な代入状態vする前にexpr_secondの確実な割り当ての状態と同じvexpr_firstします。The definite assignment state of v before expr_second is the same as the definite assignment state of v after expr_first.
  • 確実な代入ステートメントのvexprによって決定されます。The definite assignment statement of v after expr is determined by:
    • 場合expr_first定数式です (定数式) null の値の状態とvexprと同じです状態vexpr_secondします。If expr_first is a constant expression (Constant expressions) with value null, then the state of v after expr is the same as the state of v after expr_second.
  • それ以外の場合、状態のvexprの確実な代入状態と同じでは、 vexpr_firstOtherwise, the state of v after expr is the same as the definite assignment state of v after expr_first.

?: (条件) 式?: (conditional) expressions

式のexprフォームのexpr_cond ? expr_true : expr_false:For an expression expr of the form expr_cond ? expr_true : expr_false:

  • 確実な代入状態vする前にexpr_condの状態と同じでは、 vする前にexprします。The definite assignment state of v before expr_cond is the same as the state of v before expr.
  • 確実な代入状態vする前にexpr_true次のいずれかを保持する場合にのみが確実に割り当て。The definite assignment state of v before expr_true is definitely assigned if and only if one of the following holds:
    • expr_cond値を持つ定数式です falseexpr_cond is a constant expression with the value false
    • 状態vexpr_condが明示的に代入するか、「間違いなく true 式の後に割り当てられている」。the state of v after expr_cond is definitely assigned or "definitely assigned after true expression".
  • 確実な代入状態vする前にexpr_false次のいずれかを保持する場合にのみが確実に割り当て。The definite assignment state of v before expr_false is definitely assigned if and only if one of the following holds:
    • expr_cond値を持つ定数式です trueexpr_cond is a constant expression with the value true
  • 状態vexpr_condが明示的に代入するか、「を代入式が false の後に」。the state of v after expr_cond is definitely assigned or "definitely assigned after false expression".
  • 確実な代入状態vexprによって決定されます。The definite assignment state of v after expr is determined by:
    • 場合expr_cond定数式です (定数式) 値を持つtrueの状態、 vexpr状態と同じでは、 vexpr_trueします。If expr_cond is a constant expression (Constant expressions) with value true then the state of v after expr is the same as the state of v after expr_true.
    • の場合expr_cond定数式です (定数式) 値を持つfalseの状態、 vexprの状態と同じでは、 vexpr_falseします。Otherwise, if expr_cond is a constant expression (Constant expressions) with value false then the state of v after expr is the same as the state of v after expr_false.
    • の場合、状態のvexpr_trueが確実に割り当ての状態とvexpr_falseは間違いなく状態、割り当てられたvexprは確実に代入します。Otherwise, if the state of v after expr_true is definitely assigned and the state of v after expr_false is definitely assigned, then the state of v after expr is definitely assigned.
    • それ以外の場合、状態のvexprが確実に割り当てできません。Otherwise, the state of v after expr is not definitely assigned.

匿名関数Anonymous functions

Lambda_expressionまたはanonymous_method_expression exprの本文 (かブロックまたは)本文:For a lambda_expression or anonymous_method_expression expr with a body (either block or expression) body:

  • 外部変数の確実な代入状態vする前に本文の状態と同じでは、 vする前にexprします。The definite assignment state of an outer variable v before body is the same as the state of v before expr. つまり、外部変数の状態を確実な代入では、匿名関数のコンテキストから継承されます。That is, definite assignment state of outer variables is inherited from the context of the anonymous function.
  • 外部変数の確実な代入状態vexprの状態と同じでは、 vする前にexprします。The definite assignment state of an outer variable v after expr is the same as the state of v before expr.

例では、The example

delegate bool Filter(int i);

void F() {
    int max;

    // Error, max is not definitely assigned
    Filter f = (int n) => n < max;

    max = 5;
    DoWork(f);
}

以降のコンパイル時エラーが生成されますmaxが間違いなく割り当てられていない匿名関数が宣言されています。generates a compile-time error since max is not definitely assigned where the anonymous function is declared. 例では、The example

delegate void D();

void F() {
    int n;
    D d = () => { n = 1; };

    d();

    // Error, n is not definitely assigned
    Console.WriteLine(n);
}

代入後も、コンパイル時エラーが生成されますn匿名関数に効力はなくなりましたの確実な代入状態n匿名関数の外側です。also generates a compile-time error since the assignment to n in the anonymous function has no affect on the definite assignment state of n outside the anonymous function.

変数参照Variable references

A variable_referenceは、変数として分類します。A variable_reference is an expression that is classified as a variable. A variable_referenceを現在の値をフェッチして新しい値を格納する両方にアクセスできる記憶域の場所を表します。A variable_reference denotes a storage location that can be accessed both to fetch the current value and to store a new value.

variable_reference
    : expression
    ;

C とC++、 variable_referenceと呼ばれますが、左辺値します。In C and C++, a variable_reference is known as an lvalue.

変数参照の原子性Atomicity of variable references

次のデータ型の読み取りや書き込みはアトミック: boolcharbytesbyteshortushortuintintfloatと参照型。Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types. さらに、上記の一覧では、基になる型と列挙型の読み取りや書き込みもアトミックです。In addition, reads and writes of enum types with an underlying type in the previous list are also atomic. など、他の型の読み書きlongulongdouble、およびdecimalとユーザー定義の型がアトミックである保証されません。Reads and writes of other types, including long, ulong, double, and decimal, as well as user-defined types, are not guaranteed to be atomic. 目的のために設計されたライブラリ関数を除けば、インクリメントまたはデクリメントの場合など、分割不可能な読み取り/変更/書き込みの保証はありません。Aside from the library functions designed for that purpose, there is no guarantee of atomic read-modify-write, such as in the case of increment or decrement.