6

在 C# 中,我们可以执行以下操作:

private string _myField;

public string MyProperty
{
    get { return _myField; }
    private set { _myField = value; }
}

在这里的属性中使用私有设置器有什么好处,而我们可以根据_myField需要在类中设置?为什么我们要使用 setter MyProperty

4

6 回答 6

7

当属性更新时,setter 可以实现其他行为/逻辑,因此您不必在可能更新属性的每个位置手动实现它。

它可以:

  • 自动更新其他字段
  • 验证新值(例如,确保电子邮件地址与正则表达式匹配)
  • 将每次更新字段时需要运行的代码保留在一个地方

例如:

private string _myField;
private int _myField_num_updated;
private DateTime _myField_updated_at;

public string MyProperty
{
    get { return _myField; }
    private set {
      _myField = value;
      _myField_num_updated++;
      _myField_updated_at = DateTime.Now;
    }
}
于 2012-08-18T00:48:49.870 回答
5

使用属性访问器 (getset) 的目的是隐藏有关如何查询或修改特定值的内部实现。在您的情况下,设置器很简单,但在未来,它可能会变得更加复杂。通过隐藏实现,您可以最大限度地减少潜在更改的影响并保持界面简单。

现在关于您的问题:为什么使用私人二传手?使用私有 setter 的原因与一般使用 setter 的原因完全相同。在私有设置器的情况下,该设置器的用户是类本身的代码。在公共设置器的情况下,用户可以是使用该类的任何人。使用 setter 的优点是一样的。

于 2012-08-18T00:54:55.090 回答
3

因为虽然属性通常包装支持字段,但没有理由必须. 属性还可以实现自定义业务逻辑(通常是某种验证或转换)并调用其他函数。使用私有 setter 可以使您的代码更惯用(意味着其他人会更容易理解您在做什么)和更具表现力(意味着代码将或应该更接近地反映您正在尝试完成的语义。私有 setter 也允许封装此自定义逻辑,以便在逻辑更改或代码需要重构的情况下只需要更改一个地方。

于 2012-08-18T00:54:49.537 回答
2

使用 setter,您可以在尝试设置它时控制该值,例如,如果您有一个 int,您希望确保它的值不大于 10。

public int MyProp 
{
    get { return _my_prop;}
    private set {
        if value > 10 {
            _my_prop = 10;
        }

    }
}
于 2012-08-18T00:53:33.047 回答
1

物业主要用于两个目的:

  • 避免从外部意外访问底层字段
  • 隐藏底层字段的实现细节,只要保留接口就可以自由更改实现。

至于私人设置,虽然第一项没有多大意义,但第二项仍然有效

于 2012-08-18T00:58:23.403 回答
1

需要在属性中使用私有设置器是使用包装在属性中的字段仅用于由其他函数直接修改,您的类的属性。因此,在一个地方(属性),您设置了字段的值,但类的所有其他元素不必直接访问您的私有字段,而是通过包装它的属性。

于 2012-08-18T01:07:59.910 回答