C#是否使用公共方法明智地访问私有属性?

时间:2019-02-20 21:58:22

标签: c#

下面的伪代码示例:

public class SomeClass
{
    private int Num { get; set; }

    public void SetNum(int newNum)
    {
        Num = newNum;
    }
}

在什么情况下这是明智的,还是在这种情况下我应该将Num属性设置为公开?

2 个答案:

答案 0 :(得分:3)

拥有仅用于设置属性的方法将是毫无意义的,而仅仅使用

会更好
    wp user list --role='customer' --orderby=ID --order=asc | awk 'FNR == 1 
{next} $1>200 {print ;}'

(或者实际上,只公开了getter和setter)。

尽管更一般地说,拥有仅可以通过公共方法访问的私有财产,而该私有财产除了设置私有财产外还可以做些其他事,但是私有财产通常只有在其可以更广泛地访问或具有某种逻辑时才值得拥有;如果您只需要它来存储,那么一个字段就可以正常工作。

答案 1 :(得分:0)

像这样的例子没有道理。但是,在一种情况下,必须将属性范围限定为私有,并确保使公共方法可访问,即在实现域驱动的设计模式时。

例如:

public class MyObject
{
  private ValueEnum SomeValue {get; set;}
  private int? SomeOtherValue {get; set;}

  public void Update(ValueEnum someValue, int? someOtherValue = null)
  {
    if ( (someOtherValue.HasValue && someValue != ValueEnum.HasOtherValue)
      || (!someOtherValue.HasValue && someValue == ValueEnum.HasOtherValue))
      throw new ArgumentException("Invalid value combination.");

    SomeValue = someValue;
    SomeOtherValue = someOtherValue;
  }
}

本质上,您将更新域对象的操作包装在一种方法中,以包含用于强制域对象始终处于有效状态的业务逻辑。该方法接受所有相关更新以对域对象执行状态更改,并在更新状态之前验证该组合是否完整和有效。

另一种选择是一次将每个属性设置为一个,并且每个属性设置器都可能验证整个实体的状态,因为这可能会产生鸡和蛋。对于SomeOtherValue的当前状态,更新SomeValue属性可能无效,尝试设置SomeOtherValue的情况也是如此。设置一个将使域对象(暂时)处于无效状态。虽然这种状态只是暂时的,但随着代码的发展,它可能成为错误的潜在温床。

也就是说,我不认为简单地使用公共方法来设置单个私有财产有任何目的。