何时分配了ReadOnly变量?

时间:2012-12-17 00:52:06

标签: c#

在线测试有这个问题:

只读变量的功能:

  1. 在编译时分配
  2. 声明和初始化分开
  3. 在运行时分配
  4. 所有这些
  5. 测试给出答案为4.我得到2和3但不确定1.这是否可以作为1的答案的例子:

    private readonly int readonlyExample = 10;
    

    注意:我通常会在上面的示例中使用const

3 个答案:

答案 0 :(得分:2)

如果为readonly变量赋值,那么你是绑定变量,那么这就是编译时。例如:

readonlt int xyz=10; // then this is compile time

如果要从任何将执行并返回值的函数中分配值,那么它将是“运行时”。例如:

readonly int xyz=objClass.getSum();  // Then it is runtime.

答案 1 :(得分:0)

这些可能的答案有点令人困惑(在我看来)。

实际发生的是C#编译器实际发出如下内容:

private readonly int readOnlyExample;

public YourClassConstructor()
{
    this.readOnlyExample = 10;
}

鉴于此,#2似乎是一种可能的选择。声明和作业是分开的。 (他们甚至意味着什么都可以争夺)

3也可能是正确的,因为该值必须存在于内存某处。它不是编译时常量。

答案 2 :(得分:0)

建议的答案(4)不正确。 因为,选项1)不正确!!

Readonly字段不必是编译时间值。 考虑以下代码,即使分配给readonly字段的值不是编译时已知值,它也能很好地编译!!

    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不正确!因为,上面的示例解释了在编译时分配readonly变量的情况。因此,否定陈述1。 如果你想进一步否定,尝试用“const”替换readonly,编译将告诉你它只能有编译时间值(这不是readonly的前提条件)。