在线测试有这个问题:
只读变量的特点:
- 它是在编译时分配的
- 声明和初始化是分开的
- 它是在运行时分配的
- 所有这些
测试给出的答案为 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.
这些可能的答案有点令人困惑(在我看来)。
实际发生的是 C# 编译器实际上发出了如下内容:
private readonly int readOnlyExample;
public YourClassConstructor()
{
this.readOnlyExample = 10;
}
鉴于此,#2 似乎是一个可能的选择。声明和赋值是分开的。(他们甚至是什么意思是可以争夺的)
3 也可能是正确的,因为该值必须存在于内存中的某个地方。它不是编译时间常数。
建议的答案 (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”,编译将告诉您它只能具有编译时间值(这不是 readonly 的先决条件)。
关键字 readonly 具有可以在运行时更改或分配的值