您是否认为始终使受保护的类成员成为自动实现的受保护属性以保持隔离或使其受保护的字段就足够了?
protected bool test { get; set; }
或
protected bool test;
答案 0 :(得分:20)
通常,您应该使用autoproperties - 这样您就可以轻松添加验证或以后需要的任何其他内容。如果受保护的成员将被程序集外的类使用,这一点尤其重要,因为添加此类代码不会破坏与它们的合同,而将字段更改为方法或属性将会发生。
答案 1 :(得分:7)
建议的做法是使其成为属性。签名会根据是字段还是属性而更改,如果您正在跨越程序集,则会导致问题。如果你把它作为一个属性开始,你永远不会有这个问题。 (通常以后你想在读或写属性时添加逻辑。)
在C#中,自动实现属性非常简单,没有理由不这样做。
此外,它使事情变得更加清晰。如果它真的意味着被外界用作对象功能的一部分,那么将其作为属性。否则,未来的程序员可能会怀疑你是否意外地保护了一个字段而不是私有字段。
答案 2 :(得分:3)
属性,由私有字段支持。
This question可能有用
答案 3 :(得分:3)
您绝不允许从班级外部直接访问成员变量。使用自动生成的属性或具有支持字段的属性。如果允许直接访问,当多个方法在派生链中更改该值并且您不知道哪个导致该错误时,它可能导致一些非常糟糕的调试问题。
答案 4 :(得分:3)
我知道这个问题已经过时了,但我会根据值的范围以及需要初始化或写入的位置来回答它。我尽量使用最严格的范围。希望以下内容能够更明确地决定:
受保护的值:这假设该值只需要由基类和/或继承类访问,而不是由任何外部代码访问...
当继承类必须读取,但永远不必修改值:
如果值可以在基类的构造函数中写入一次,请使用以下命令,这将阻止继承类写入它,并更进一步,只允许在构造函数中设置它:
protected readonly bool test;
如果值可以用不同于构造函数的其他方法写入,但仍然只在基类中,请使用以下命令,这会阻止继承类写入它,但允许它读取:
protected bool Test { get; private set; }
当继承类可以修改该值时,使用以下命令,它允许继承类和基类在任何时候写入它:
protected bool test;
私有值:这假设只需要从声明它的类中访问该值。
如果只能在构造函数中设置一次,请使用:
readonly bool test;
如果可以在班级的任何地方设置,请使用:
bool test;
另外,不要忘记,如果将其声明为属性,则应使用PascalCase。如果将其声明为成员变量,则应使用camelCase。这将使其他开发人员更容易理解范围。