【问题标题】:Using backing fields inside a class在类中使用支持字段
【发布时间】:2019-10-26 08:10:25
【问题描述】:

在我们使用带有支持字段的属性的情况下,就 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 是不同的东西,我并不是在问像我的示例中这样的设置器是否是一个好主意。

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

【问题讨论】:

  • (因为我们不能依赖自动属性) -- 为什么不呢?
  • @DanielMann 因为你不能在他们的 getter/setter 中创建任何主体来在那里实现一些业务逻辑?例如。在设置实际值之前进行一些验证?
  • @DanielMann 可以说你在 getter/setter 中有一些额外的逻辑
  • @HimBromBeere 你甚至没有阅读我的问题并且你将它标记为重复,我没有问我是否应该使用自动实现
  • 为什么你会“需要”一个公共方法来设置一个公共属性?在 getter/setter 中需要额外的逻辑仅仅意味着在这种情况下自动实现的 prop 是错误的选择。这并不意味着他们不能被依赖

标签: c# oop


【解决方案1】:

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

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

int Age { get; set; }

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

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

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

_age = -10;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多