オンラインテストには次の質問があります。
読み取り専用変数の機能:
- コンパイル時に割り当てられます
- 宣言と初期化は分離されています
- 実行時に割り当てられます
- これらすべて
テストの答えは4でした。2と3が得られましたが、1についてはわかりません。これは、1の答えが発生する可能性がある場合の例でしょうか。
private readonly int readonlyExample = 10;
注:通常、上記の例ではconstを使用します
オンラインテストには次の質問があります。
読み取り専用変数の機能:
テストの答えは4でした。2と3が得られましたが、1についてはわかりません。これは、1の答えが発生する可能性がある場合の例でしょうか。
private readonly int readonlyExample = 10;
注:通常、上記の例ではconstを使用します
読み取り専用変数に値を割り当てた場合、変数をバインドしているので、これはコンパイル時です。例えば:
readonlt int xyz=10; // then this is compile time
実行して値を返す関数から値を割り当てる場合は、実行時になります。例えば:
readonly int xyz=objClass.getSum(); // Then it is runtime.
提案された答え(4)は正しくありません。なぜなら、オプション1)は正しくないからです!!
読み取り専用フィールドは、コンパイル時の値である必要はありません。次のコードを検討してください。読み取り専用フィールドに割り当てられた値がコンパイル時の既知の値ではない場合でも、正常にコンパイルされます。
public class ValidatingReadonlyField
{
private readonly UnKnownClass _readonlyField = new UnKnownClass();
}
public class UnKnownClass
{
private object _someValue;
public UnKnownClass()
{
_someValue = GetMeSomeThing();
}
private static object GetMeSomeThing()
{
throw new InvalidOperationException("Can you call me at Compile Time!!!");
}
}
編集:@Renaeのコメントに従って更新:
@Renae:回答1は正しくありません!上記の例は、コンパイル時に読み取り専用変数が割り当てられないシナリオを説明しているためです。したがって、ステートメント1を否定します。さらに否定する場合は、readonlyを「const」に置き換えてみてください。コンパイルすると、コンパイル時の値しか持てないことがわかります(これは読み取り専用の前提条件ではありません)。
これらの考えられる答えは少し紛らわしいです(私の意見では)。
実際に起こっていることは、C#コンパイラが実際に次のようなものを出力することです。
private readonly int readOnlyExample;
public YourClassConstructor()
{
this.readOnlyExample = 10;
}
それを考えると、#2は可能な選択のようです。宣言と割り当ては分離されています。(彼らがそれによって意味することさえ、つかむためにあります)
値はメモリのどこかに存在する必要があるため、3もおそらく正しいです。コンパイル時定数ではありません。
キーワードreadonlyの値は、実行時に変更または割り当てられる可能性があります