C#中的只读属性与只读成员变量

now*_*ed. 3 c#

我有一个ExProperty类似下面的课程:

class ExProperty
{
    private int m_asimplevar;
    private readonly int _s=2;

    public ExProperty(int iTemp)
    {
        m_asimplevar = iTemp;  
    }

    public void Asimplemethod()
    {
        System.Console.WriteLine(m_asimplevar);
    }

    public int Property
    {
        get {return m_asimplevar ;}
        //since there is no set, this property is just made readonly.
    }
}

class Program
{
    static void Main(string[] args)
    {
        var ap = new ExProperty(2);
        Console.WriteLine(ap.Property);
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 将属性设置为只读或只写的唯一目的是什么?我看,通过下面的程序可以readonly达到相同的目的!

  2. 当我将该属性设置为只读时,我认为它应该不可写。当我使用

    public void Asimplemethod()
    {
        _s=3; //Compiler reports as "Read only field cannot be used as assignment"
        System.Console.WriteLine(m_asimplevar);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    是的,没关系。

    但是,如果我使用

    public ExProperty(int iTemp)
    {
        _s = 3 ; //compiler reports no error. May be read-only does not apply to constructors functions ?
    }
    
    Run Code Online (Sandbox Code Playgroud)

    为什么在这种情况下编译器没有报告错误?

  3. 可以_s=3吗?还是应该_s使用构造函数声明并分配其值?

Jep*_*sen 5

是的,readonly关键字意味着只能在字段初始化器和构造函数中将字段写入。

如果需要,可以readonly与属性方法结合使用。private可以声明属性的后备字段,readonly而属性本身只有一个吸气剂。然后,只能在构造函数(及其可能的字段初始化器)中将后备字段分配给它。

您可以考虑的另一件事是创建一个字段。由于字段本身是只读的,因此,如果它所做的只是返回字段值,那么实际上您不会从getter那里获得什么好处。public readonly