为 getting/setting 设置单独的 public 函数有什么意义?

What is the point of making separate public functions for getting/setting a private value?

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

所以通常当我想使用它的 class 之外的另一个值时,我只是将它设置为 public 并访问它。

但我经常看到其他代码在其 class 中使用私有值,然后创建单独的函数来获取和设置值,如下所示:

private bool fooBar;

public void SetFooBar(bool boolean)
{
   fooBar = boolean;
}

public bool GetFooBar()
{
   return fooBar;
}

请原谅我的无知,但它到底有什么意义呢?他们基本上都做同样的事情(至少按照我的新手逻辑)。我知道私有变量很有用,因为它确保您不能通过在代码的其他地方修改它们来破坏程序的功能,但无论如何您都在代码的其他地方修改它们,那有什么用呢?为什么我看到人们这样做?

  1. 因为直接修改对象的状态是OOPno-no中的一个
  2. 因为您不能将字段放入接口中(一旦您做得足够多,您通常最终会通过接口访问大多数其他对象)
  3. 因为当另一个对象想要与字段交互时它允许额外的逻辑(比如引发事件)
  4. 因为某些东西(如 WPF 绑定)只适用于属性,不适用于字段

  5. 因为稍后您可能想更改值 retrieved/stored(不仅仅是 in-memory)

(请注意,在 C# 中,您通常将此作为 属性,而不是方法,如 public bool Foo {get; set;}

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

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

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

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

作为 BradleyDotNET mentioned in the comments, you can write these in a way that resembles lambdas 从 C# 7.0 开始

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

BradleyDotNET 所述,您可以将此确切实现写为

public bool FooBar { get; set; }

这将以同样的方式行事。

您还可以通过使值仅 public 来扩展这一点,但只能在 class.

中设置
public bool FooBar { get; protected set; }