为什么使用私有属性setter,因为成员变量可以直接访问?

时间:2012-08-18 00:47:07

标签: c# properties field

在C#中,我们可以做类似的事情:

private string _myField;

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

在我们可以根据需要在课程中设置_myField时,在属性中使用私有设置器有什么好处?为什么我们要使用MyProperty

的setter

6 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

因为虽然属性通常包装后备字段,但没有理由他们必须。属性还可以实现自定义业务逻辑(通常是某种验证或转换)并调用其他函数。使用私有的setter会使你的代码变得更加惯用(意味着其他人会更容易理解你正在做的事情)并且更具表现力(意味着代码将会或者应该更接近地反映你试图完成的语义< / em>。私有设置器也允许封装这个自定义逻辑,因此在逻辑发生变化或代码需要重构的情况下,只需要一个地方就可以更改它。

答案 3 :(得分:2)

使用setter,您可以在尝试设置时控制该值,例如,如果您有一个想要确定其值不大于10的int。

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

    }
}

答案 4 :(得分:1)

Property主要用于两个目的:

  • 避免从外部意外访问基础字段
  • 隐藏基础字段的实现细节,因此只要保留界面,就可以自由更改实现。

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

答案 5 :(得分:1)

需要属性中的私有setter才能使用包含在属性中的字段,以便直接通过其他函数,类的属性进行修改。因此,在一个地方(属性)中设置字段的值,但是类的所有其他元素都不能直接访问您的私有字段,而是通过包装它的属性。