gpt4 book ai didi

c# - 为什么类成员是私有(private)的而属性是公共(public)的?

转载 作者:行者123 更新时间:2023-12-02 04:03:35 24 4
gpt4 key购买 nike

在类中,我们将类成员声明为私有(private),但将属性定义为公共(public)。

例如:

public class student
{
private int StudentId;
private string StudentName;
private string Address;
}

在此之后我们使用方法进行分配。

但是如果我们使用 get set 的属性来定义 public 之类的。

public class student
{
public int StudentId {get;set;};
public string StudentName{get;set;};
public string Address{get;set;};
}

这背后的原因是什么?

最佳答案

不完全是这样。真正的规则是:

Define all members as restrictively as they can to be.

那么,如果可以是private那么就是private 。否则,如果它必须是 internalprotected上类的话就是internalprotected分别。否则,如果它必须是 protected internal上类的话就是protected internal 。否则就是public因为它必须是public才能工作(程序集外部不继承它的东西必须访问它。

现在,综上所述,通常情况下,我们大部分都会有 private领域和大部分 public属性。

让我们考虑一下是否有 public field 。这是有效的,会起作用,甚至在非常有限的情况下有用。但它也更脆。拥有它public让任何其他代码将其设置为任何值,无论多么愚蠢。没关系,因为当我们创建一个字段 public 时我们说“没有愚蠢的值(value)观”。*

但是,如果我们突然意识到有一些愚蠢的值,或者我们需要在每次字段更改时执行某些操作,或者我们需要使用一些仅限属性的数据绑定(bind),该怎么办?在这里,我们必须将字段变成属性,这是一个突破性的改变;使用此类的任何代码都必须重新编译,如果我们是唯一使用该类的人,这没什么大不了的,但如果它在其他人使用的库中,那就是大问题了。

如果它是一个属性,那么我们只需将其变成一个自动属性 ​​{ get; set; }进入具有自定义实现的属性 { get { /* do stuff and return value */ } set { /* do stuff */ } } 。从类(class)外部看来,一切都没有改变,我们也没有破坏任何东西。

因此,99.99% 的情况下,如果您要创建一个字段 public以防万一,您最好在那里使用属性(property)。

另一方面,如果我们有 private如果属性没有逻辑,那么 getter 和 setter 方法不会给我们带来任何好处。不会有任何成本,但它们毫无意义。所以我们只使用一个字段来代替。如果我们最终不得不在将来使用私有(private)属性,那也没关系,因为唯一需要重新编译的代码就是相关的类,而且我们无论如何都在重新编译它。

因此,我们最终会遇到几乎所有字段都是 private 的情况。几乎所有没有任何自定义逻辑的属性都是 protectedpublic .

*或者是 privateinternal类,我们从外部 promise 不会将其设置为愚蠢的东西,但如果可以的话,执行 promise 比做出 promise 更好。

关于c# - 为什么类成员是私有(private)的而属性是公共(public)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40676570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com