【问题标题】:What is the point of making separate public functions for getting/setting a private value?为获取/设置私有值创建单独的公共函数有什么意义?
【发布时间】:2019-10-15 07:54:16
【问题描述】:

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

所以通常当我想使用它的类之外的另一个值时,我只是将它公开并像访问它一样访问它。

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

private bool fooBar;

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

public bool GetFooBar()
{
   return fooBar;
}

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

【问题讨论】:

  • 在 C# 中,您应该使用属性而不是 Get/Set 方法,但一般要点是隐藏值在内部保存方式的实现,并使其更容易进行非破坏性更改。
  • 您通常不应创建字段public,而应将其设为公共属性(即:public bool FooBar { get; set; })。使用方法获取和设置在 c# 中并不常见。

标签: c# return-value private public


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

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

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

【讨论】:

  • 谢谢你的信息,下次我会通过属性来做。我在某处读到,通过方法执行此操作的目的是使该字段保持私有,并且出于安全原因或其他原因您希望它们私有(?)。也就是说,如果我使用public bool Foo {get; set;},那么我实际上是在将其设为公共字段,对吗?
  • 我的错误,我的意思是如果我使用public bool Foo {get; set;},那么我将其设为公共属性,但它与公共字段有何不同?
  • @Mathue24 这并不是真正的“安全”原因(尤其是因为无论如何都可以通过反射访问私有成员),而更多的是“良好设计”的原因。属性与我回答的第 2、3、4 和 5 项中的字段不同。 Auto 属性(我列出的)在 2 和 4 中是不同的
【解决方案2】:

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

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

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

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

正如 cmets 中提到的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; }

【讨论】:

  • 而且,对于 C# 7,get 可以是 get => _fooBar
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2018-02-20
  • 2017-11-29
相关资源
最近更新 更多