0

我目前正在实现 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,但如果我隐式执行则不能?这里有什么区别?

4

3 回答 3

2

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

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

    private readonly long n;
}
于 2010-08-10T16:25:45.793 回答
2

没有隐式自动生成的私有设置器之类的东西。如果省略set;,则无法为其分配一个值,该值将无法编译,因为它永远无法分配。

此外,通过设为n私有,您无法从该类外部访问它。如果这是您的意图,那么使用属性根本没有意义。您可以简单地将其声明为字段:private readonly long n;

于 2010-08-10T16:29:35.713 回答
1

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

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

  public RSA() 
  {
     _n = 4;
  }
}
于 2010-08-10T16:37:20.420 回答