在类中使用后备字段

时间:2019-06-11 20:57:51

标签: c# oop

在我们使用带有支持字段的属性的情况下,从OOP和封装方面来说,直接访问这些支持字段是一种好习惯吗?还是我们应该始终遍历class属性?

public class SomeClass
{
   private string _name;

   public string Name
   {
      get { return _name; }
      set { _name = value == null ? "" : value; }
   }

   public void SetField()
   {
      ...
        _name = "alice";
      ...
    }

   public void SetProperty()
   {
      ...
      Name = "bob";
      ...
   }
}

我的直觉是始终使用该属性,除了在getter / setter中外,不要使用该字段,但是我不知道这是个人喜好还是首选的标准或规则。

请澄清一下,因为我不想被误解,我知道设置_nameName是不同的事情,我不是在问示例中的设置者是否是一个好主意。

编辑: 我不问是否以及何时应该使用自动属性,例如重复的问题/答案提及。

1 个答案:

答案 0 :(得分:2)

由于属性只不过是围绕后备字段的获取方法和设置方法,因此它们通常实现一些逻辑,该逻辑应在您访问该属性时运行-最常见的是验证。

想象一下,例如以下代表年龄的财产:

int Age { get; set; }

没有任何逻辑,您可以为该属性分配 any int,例如负值。因此,您在设置器中引入了一些验证:

int Age {
    { get => return _age; }
    { set => _age = value > 0 ? value : 0 }
}

在您的课堂上,您通常可以控制所设置的值。话虽如此,没有真正的需求来验证输入。但是,我认为这样做最好还是要有一个成员访问权限的单点。此外,很容易忘记班级变大时 valid 的实际含义。因此,您可能很容易编写以下代码,这会绕过您的验证,使您在执行代码时感到头疼:

_age = -10;

事实上,它很少那么简单。您必须扫描所有可能触摸到您的后备场的地方,才能确定该无效值的来源。

所以我也更喜欢在声明类中使用属​​性。