为什么可以';t只能与属性一起使用

本文关键字:属性 一起 为什么 | 更新日期: 2023-09-27 18:26:20

为什么C#中的属性不能是只读的?

当我尝试使属性只读时,它会声明:

修饰符"只读"对此项无效

Simmilar的问题在这里被问到:为什么可以';属性是只读的吗?但这个问题是5年前提出的,当时给出的答案是:因为他们没有想清楚。5年后情况依然如此吗?

编辑:代码示例:

public class GreetingClass
{
    public readonly string HelloText { get; set; }
}

为什么可以';t只能与属性一起使用

属性在C#中可以是只读的,实现只是不使用readonly关键字:

如果使用C#6(VS 2015),则可以使用以下行,该行允许在构造函数或成员定义中分配属性。

public int Property { get; }

如果您使用较旧的C#/Visual Studio版本,您可以编写这样的内容,并在构造函数或字段定义中分配字段:

private readonly int property;
public int Property { get { return this.property; }}

如果你想让属性保持只读,你可以这样定义它们的getter:

public MyProperty { get; }

没有set的属性在C#中被视为只读属性,您不需要使用Readonly关键字来指定它们。

public class GreetingClass
{
    private string _HelloText = "some text"; 
    public string HelloText => _HelloText; 
}

而在VB中,您必须指定:Public ReadOnly Property HelloText() As String

如果您在C#中搜索只读属性,您会得到100*no_of_answers_here正确的结果。

https://msdn.microsoft.com/en-us/library/w86s7x04.aspx明确指出,没有set访问器的属性是只读的。因此,认为额外应用readonly关键字会导致冗余,而不是其他原因,这是合乎逻辑的。

此外,在C#6.0之前,您甚至不能在包含类型(例如class)中设置readonly属性。在C#6.0中,您至少可以将其作为初始化的一部分。这意味着这在C#6.0、public int Prop { get; } = 10;中是可能的。当您这样做时,会自动生成一个readonly后备字段,并将其设置为您为属性初始化选择的值。

或多或少,从C#6中可以使用这样的东西:

class MyClass {
    string MyProp { get; }
    MyClass { MyProp = "Hallo Worls"; }
}

在C#6之前,您可以使用只读备份字段:

class MyClass {
    private readonly string _myProp;
    string MyProp { get { return this._myProp; } }
    MyClass { this._myProp = "Hallo Worls"; }
}