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

Mat*_*e24 3 c# private public return-value

首先,我要说这是一个新手问题,我尝试搜索它,但找不到合适的答案(可能是错误的),以此作为我的序言。

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

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

private bool fooBar;

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

public bool GetFooBar()
{
   return fooBar;
}
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*NET 8

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

  5. 因为您可能要稍后更改取回/存储值的方式(而不仅仅是在内存中)

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


Ben*_*dgi 5

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

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

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

private bool _fooBar
public bool FooBar
{
 get { return _fooBar; }
 set {  _fooBar = value; }
}
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的BradleyDotNET一样,您可以使用类似于以C#7.0开头的lambda的方式编写这些代码

private bool _fooBar
public bool FooBar
{
    get => _fooBar;
    set => _fooBar = value;
}
Run Code Online (Sandbox Code Playgroud)

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

public bool FooBar { get; set; }
Run Code Online (Sandbox Code Playgroud)

这将以相同的方式起作用。

您还可以通过仅公开获取该值,而只能在该类中将其设置为可扩展值。

public bool FooBar { get; protected set; }
Run Code Online (Sandbox Code Playgroud)