C# Get Set访问器的功能因Get Set关键字的存在而不同

C# Get Set访问器的功能因Get Set关键字的存在而不同,c#,accessor,C#,Accessor,我目前正在实现一个穷人版的RSA算法,我希望素数d、e、m和n是只读的,因为它们将在构造函数体中自动生成。但是,我键入时会得到两种不同的结果: class RSA { public RSA() { n = 4; } private long n { get; private set; } } 或 在阅读《加速C#》一书时,我得到的印象是,私有集函数可以通过自动实现的属性来实现。事实证明,我也可以在构造函数本身中实现,但只适用于第一个版本 阅读

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

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

    private long n { get; private set; }
}

在阅读《加速C#》一书时,我得到的印象是,私有集函数可以通过自动实现的属性来实现。事实证明,我也可以在构造函数本身中实现,但只适用于第一个版本

阅读C#3.0标准,它说:

既有get访问器又有set访问器的属性是读写属性,只有get访问器的属性是只读属性,只有set访问器的属性是只读属性。

但他们的行为并不平等


简单的问题:当我显式声明
私有集
时,为什么我可以初始化构造函数中的值,但如果我隐式声明则不能?这里有什么区别?

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


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


没有隐式自动生成的私有setter。如果省略
set,则无法为其赋值,该值将不会编译,因为它永远无法赋值


此外,通过将
n
设为私有,您无法从该类之外访问它。如果这是你的意图,那么使用一个属性就毫无意义了。您只需将其声明为一个字段:
private readonly long n

没有隐式自动生成的私有setter。如果省略
set,则无法为其赋值,该值将不会编译,因为它永远无法赋值


此外,通过将
n
设为私有,您无法从该类之外访问它。如果这是你的意图,那么使用一个属性就毫无意义了。您只需将其声明为一个字段:
private readonly long n

如果您确实需要具有只读值的属性,则可以使用具有显式支持字段的属性,即:

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

  public RSA() 
  {
     _n = 4;
  }
}

如果您确实想要具有只读值的属性,则可以使用具有显式支持字段的属性,即:

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

  public RSA() 
  {
     _n = 4;
  }
}
public class RSA {
  private readonly long _n;
  public long n {
    get { return _n; }
  }

  public RSA() 
  {
     _n = 4;
  }
}