C# Get Set访问器的功能因Get Set关键字的存在而不同
我目前正在实现一个穷人版的RSA算法,我希望素数d、e、m和n是只读的,因为它们将在构造函数体中自动生成。但是,我键入时会得到两种不同的结果: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#》一书时,我得到的印象是,私有集函数可以通过自动实现的属性来实现。事实证明,我也可以在构造函数本身中实现,但只适用于第一个版本 阅读
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;
}
}