为获得/设置私人价值而设置单独的公共职能有什么意义?

时间:2019-05-29 16:34:28

标签: c# return-value private public

让我在开头说一下,我知道这可能是一个新手问题,我尝试搜索它,但找不到合适的答案(可能是问错了)。

通常,当我想使用另一个超出其类的值时,我只是将其公开并喜欢它。

我经常看到其他代码在其类中使用私有值,然后像下面这样制作单独的函数来获取和设置值:

  pushUnique<T, U>(arr: T[], obj: T, key: U = null) {
    if (key !== null) {
      const index = arr.findIndex(o => o.key === obj.key);
    }
  }

对不起,请问到底有什么意义?他们基本上都做同样的事情(根据我的新手逻辑)。我知道私有变量很有用,因为它可以确保您无法通过在代码的其他地方对其进行修改来破坏程序的功能,但是无论如何您都在代码的其他地方对其进行了修改,那么,这有什么用呢?为什么我看到人们这样做?

2 个答案:

答案 0 :(得分:7)

  1. 因为直接修改对象的状态在OOP中是不可以的
  2. 因为您不能将字段放入接口中(一旦到达足够远的位置,通常通常会通过接口访问大多数其他对象)
  3. 因为当另一个对象想要与字段交互时,它允许附加逻辑(例如引发事件)
  4. 因为某些内容(例如WPF绑定)仅适用于属性,不适用于字段

  5. 因为您可能要稍后更改/检索值(不只是在内存中)的方式

(请注意,在C#中,您通常将其作为属性而非方法来使用,例如public bool Foo {get; set;}

答案 1 :(得分:5)

这使您可以更改存储值的方式,而不管外部用户如何访问它。

使用Getter和Setter函数,您可以从本地缓存中请求数据或从数据库中提取数据。

C#使用属性样式访问器支持Getter Setter功能实现。

private bool _fooBar
public bool FooBar
{
 get { return _fooBar; }
 set {  _fooBar = value; }
}

正如评论中的BradleyDotNET一样,您可以以resembles lambdas从C#7.0开始的方式编写这些代码

private bool _fooBar
public bool FooBar
{
    get => _fooBar;
    set => _fooBar = value;
}

正如BradleyDotNET所述,您可以将确切的实现编写为

public bool FooBar { get; set; }

将采取相同的行动。

您还可以扩展此范围,方法是仅公开获取该值,但只能在该类中设置该值。

public bool FooBar { get; protected set; }