首页 > 解决方案 > 在类中使用支持字段

问题描述

在我们使用带有支持字段的属性的情况下,就OOP和封装而言,直接访问这些支持字段是一种好习惯,还是我们应该始终通过类属性?

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不同的东西,我不是在问像我的例子中这样的二传手是否是个好主意。

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

标签: c#oop

解决方案


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

例如,想象一下代表一个人年龄的以下属性:

int Age { get; set; }

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

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

在您的班级中,您通常可以控制正在设置的值。话虽如此,没有真正需要验证输入。但是,我觉得最好还是这样做,以便拥有单点成员访问权限。此外,当您的班级变大时,很容易忘记有效的实际含义。因此,您可能很容易编写以下代码,这会在执行代码时让您头疼,因为它绕过了您的验证:

_age = -10;

事实上,它很少那么简单。您必须扫描所有可能触及支持字段的位置,以确定无效值的来源。

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


推荐阅读