繁体   English   中英

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

[英]Why use private property setters since member variables can be accessed directly?

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

private string _myField;

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

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

更新属性时,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;
    }
}

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

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

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

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

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

    }
}

物业主要用于两个目的:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM