C#中“只读”的目的? (这是一个漏洞吗?)

时间:2013-05-09 08:51:29

标签: c# readonly

在C#中创建字段readonly的目的是什么?

实际上似乎并没有阻止对字段的修改:

public struct Struct
{
    public readonly int Value;
    public Struct(int value)
    {
        this.Value = value;
    }
}

static class Program
{
    static void Main()
    {
        var s = new Struct(1);
        Debug.Assert(s.Value == 1, "Read-only field is 1");
        s = new Struct(2);
        Debug.Assert(s.Value == 2, "Read-only field written!");
    }
}

这被视为漏洞,还是设计? 鉴于可以轻松修改字段,我何时可以从字段readonly中受益?

4 个答案:

答案 0 :(得分:7)

  

这被视为漏洞,还是设计?

这是设计的。

它可以防止字段本身被直接修改(在结构内部或外部),但这并不意味着你不能用变量(在这种情况下为s)替换整个变量值。新的Struct值。

对于结构而言,它对于类来说肯定不太有用 - 特别是因为替换“整个值”可能不是原子的 - 但它仍然是有用的IMO。

换句话说......你可以将整数看作不可变的值,对吧?但是这段代码仍然有效:

int x = 10;
x = 20;

这会改变x的值 - 它不会改变10的含义。

答案 1 :(得分:2)

您的Struct拥有不同的实例。您尚未覆盖原始readonly的{​​{1}}值。也就是说,变量Struct已被分配s Struct为1,之后被分配了不同 Value {{1} 2。

Struct的要点是允许在初始化或构造类型期间设置字段的值,而不是在后面的字段。

如果您尝试:

Value

您将收到编译器错误 - “无法将readonly字段分配给(构造函数或变量初始值设定项除外)”。

答案 2 :(得分:1)

允许构造函数或声明写入它们,但不允许其他人写入。

From MSDN“当字段声明包含只读修饰符时,声明引入的字段的赋值只能作为声明的一部分或同一类的构造函数中出现。”

答案 3 :(得分:1)

来自Microsoft Docs

  

readonly字段可以在声明或构造函数中初始化。