为什么不能只读取属性

时间:2015-12-10 07:35:29

标签: c#

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

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

  

修饰符'readonly'对此项无效

Simmilar问题在这里被问到: Why can't properties be readonly? 但问题是在5年前提出的,然后提供的答案是:因为他们没有想到它。 5年后仍然如此吗?

编辑: 代码示例:

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

5 个答案:

答案 0 :(得分:17)

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

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

public int Property { get; }

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

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

答案 1 :(得分:4)

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

public MyProperty { get; }

答案 2 :(得分:3)

没有设置的属性被视为C#中的只读属性,您无需使用Readonly关键字指定它们。

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

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

答案 3 :(得分:0)

或多或少,从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"; }
}

答案 4 :(得分:0)

如果您使用C#搜索了只读属性,那么您将获得 100 * no_of_answers_here 正确的结果。

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

此外,在C#6.0之前,即使使用包含类型(例如,readonly),也无法设置class属性。在C#6.0中,您至少可以将其作为初始化的一部分。这意味着可以在C#6.0,public int Prop { get; } = 10;中执行此操作,自动生成readonly支持字段并将其设置为您为属性初始化选择的值。