C#是否使用公共方法访问私有财产?

C#是否使用公共方法访问私有财产?,c#,C#,psuedo代码示例如下: public class SomeClass { private int Num { get; set; } public void SetNum(int newNum) { Num = newNum; } } 在什么情况下这是明智的,或者在这种情况下,我应该将Num属性设置为公共属性吗?拥有一个只用于设置属性的方法是毫无意义的,您最好只使用 public int Num { private get; set; }

psuedo代码示例如下:

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

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

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

拥有一个只用于设置属性的方法是毫无意义的,您最好只使用

public int Num { private get; set; }
(或者,事实上,只是将getter和setter都公开)


更一般地说,拥有一个只有通过公共方法才能访问的私有财产,而公共方法的作用不仅仅是设置私有财产,这要合理得多,尽管私有财产通常只有在更广泛地访问或者具有某种逻辑的情况下才值得拥有;如果您只需要将其用于存储,那么字段就可以正常工作。

这样的示例没有意义。然而,有一种情况是,当实现域驱动的设计模式时,将属性范围限定为私有并使公共方法可访问是有保证的

例如:

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也可能无效。设置为1将使域对象(暂时)处于无效状态。虽然这种状态是暂时的,但随着代码的发展,它可能成为bug的滋生地


也就是说,我不认为简单地使用公共方法来设置单个私有属性有任何用途。

这段特定代码没有意义。setter是一种方法。在这种特殊情况下,创建一个只调用setter的方法是多余的。顺便说一句,这段代码不会编译
public
private
class
都应该小写。您知道属性和字段之间的区别吗?使用这种公共方法创建私有字段并不常见。奇怪的是,任何客户端都可以更改值,但没有客户端可以读取it@Amy我认为我们可以放心地假设打字错误是因为编写代码而不是复制代码