C#受保护的属性或字段

您是否认为始终使受保护的类成员成为自动实现的受保护属性以保持隔离或使其受保护的字段就足够了?

protected bool test { get; set; } 

要么

 protected bool test; 

通常,您应该使用autoproperties – 这样您就可以轻松添加validation或以后需要的任何其他内容。 如果受保护的成员将被程序集外的类使用,这一点尤其重要,因为添加此类代码不会破坏与它们的合同,而将字段更改为方法或属性将会。

建议的做法是使其成为财产 。 签名会根据是字段还是属性而更改,如果您正在跨越程序集,则会导致问题。 如果你把它作为一个属性开始,你永远不会有这个问题。 (通常以后您希望在读取或写入属性时添加逻辑。)

在C#中,自动实现属性非常简单,没有理由不这样做。

而且,它使事情更加清晰。 如果它真的意味着被外界用作对象function的一部分,那么将其作为属性。 否则,未来的程序员可能会怀疑你是否意外地保护了一个字段而不是私有字段。

财产,由私人领域支持。

这个问题可能有用

您永远不应允许从类外部直接访问成员变量。 使用自动生成的属性或具有支持字段的属性。 如果允许直接访问,当多个方法在派生链中更改该值并且您不知道哪个导致该错误时,它可能会导致一些非常糟糕的调试问题。

我知道这个问题很老,但我会根据值的范围以及需要初始化或写入的位置来回答它。 我尽量使用最严格的范围。 希望以下内容能够更清楚地说明如何做出决定:

受保护的值:这假定值只需要由基类和/或inheritance类访问,而不是由任何外部代码访问…

  1. 当inheritance类必须读取,但永远不必修改值:

    • 如果值可以在基类的构造函数中写入一次,请使用以下命令,这将阻止inheritance类写入它,并更进一步,只允许在构造函数中设置它:

      protected readonly bool test;

    • 如果值可以用除构造函数之外的其他方法写入,但仍然只在基类中使用,则使用以下命令阻止inheritance类写入它,但允许它读取:

      protected bool Test { get; private set; }

  2. 当inheritance类可以修改值时,使用以下命令,它允许inheritance类和基类在任何时候写入它:

    protected bool test;

私有值:这假设只需要从声明的类中访问该值。

  1. 如果只能在构造函数中设置一次,请使用:

    readonly bool test;

  2. 如果可以在class级的任何地方设置,请使用:

    bool test;

另外,不要忘记,如果将其声明为属性,则应使用PascalCase。 如果将其声明为成员变量,则应使用camelCase。 这将使其他开发人员更容易理解范围。