Get-Set Accessor功能因get-set关键字的存在而不同

时间:2010-08-10 16:23:09

标签: c# accessor

我目前正在实现一个穷人的RSA算法版本,我希望素数d,e,m和n是只读的,因为它们将在构造函数体内自动生成。但是,当我输入时,我得到两个不同的结果:

class RSA
{
    public RSA() 
    {
        n = 4;
    }

    private long n { get; private set; }
}

class RSA
{
    public RSA() 
    {
        n = 4;
    }

    private long n { get; }
}

阅读“Accelarated C#”一书,我得到的印象是可以使用自动实现的属性实现私有集功能。结果我也可以在构造函数本身中完成它,但仅适用于第一个版本。

阅读C#3.0标准,它说:

A property that has both a get accessor and a set accessor is a read-write property, a property that has only a get accessor is a read-only property, and a property that has only a set accessor is a write-only property.

但他们的行为并不平等。

简单的问题:当我明确声明private set时,为什么我可以在构造函数中初始化值,但如果我隐式地这样做则不能?这有什么区别?

3 个答案:

答案 0 :(得分:2)

在第一种情况下,setter是私有的。这意味着您可以在此类中的所有位置设置此属性的值,而不仅仅是在构造函数中。在第二个例子中,没有setter将无法设置该值。在您的情况下,使用readonly字段在语义上可能是最正确的,因为它允许您在构造函数中设置其值,或者在声明字段时直接设置其值(如果此字段不应在此类外部可见):

class RSA
{
    public RSA() 
    {
        n = 4;
    }

    private readonly long n;
}

答案 1 :(得分:2)

没有隐式自动生成私有设置器这样的东西。如果省略set;,则无法为其分配值,因为永远不会对其进行编译,因此无法编译该值。

此外,通过将n设为私有,您无法从该类外部访问它。如果这是你的意图,那么根本就没有使用房产。您只需将其声明为字段:private readonly long n;

答案 2 :(得分:1)

如果您真的想要一个具有只读值的属性,您可以使用具有显式支持字段IE的属性:

public class RSA {
  private readonly long _n;
  public long n {
    get { return _n; }
  }

  public RSA() 
  {
     _n = 4;
  }
}