我目前正在实现一个穷人的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
时,为什么我可以在构造函数中初始化值,但如果我隐式地这样做则不能?这有什么区别?
答案 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;
}
}