1

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

它实际上似乎并没有阻止修改该字段:

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

4 回答 4

7

这被认为是一个漏洞,还是设计使然?

这是设计使然。

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

与类相比,它对结构的用处肯定要小——尤其是因为替换“整个值”可能不是原子的——但它仍然对 IMO 有用。

换句话说……您可以将整数视为不可变的值,对吗?但是这段代码仍然有效:

int x = 10;
x = 20;

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

于 2013-05-09T08:53:26.330 回答
2

您有一个不同Struct. 您没有覆盖readonly原来的值Struct。也就是说,该变量s已被赋值StructValue1,后来又被赋值 Struct2 Value

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

如果你试试:

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

您将收到编译器错误 - “无法将只读字段分配给(在构造函数或变量初始化程序中除外)”。

于 2013-05-09T08:53:12.003 回答
1

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

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

于 2013-05-09T08:53:16.703 回答
1

微软文档

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

于 2013-05-09T08:53:16.813 回答