c# - 为什么要封装这个字段?

标签 c# oop coding-style standards encapsulation

<分区>

我总是被告知要封装类中的任何和所有属性...

这是对的:

private string propertyName;
public string PropertyName
{
    get { return propertyName; }
    set { propertyName = value; }
}

这是错误的

Public string PropertyName;

我看不出哪里需要封装... 第一个代码,对我来说,只是无用的冗余代码...... 不需要封装那个字段...

因此,如果有人可以证明在这种情况下进行封装是合理的。 (我可以在其他情况下理解)。

最佳答案

在大多数情况下,公共(public)领域在实践中是可以的。毕竟,如果您稍后需要从外部将其设置为只读,或向其 setter 添加行为,那么您只需将其更改为属性即可。因此,您今天可以将其设置为公共(public)字段,以后需要时再进行更改。对吧?

问题是,在某些情况下您以后无法安全地更改它:

  • 如果您使用公共(public)字段编译 Foo.dll,并且有人构建了引用 Foo.dll 的 Bar.dll,您以后不能放入新版本的 Foo.dll,并将该字段更改为属性。您将不得不让其他人针对您的新 Foo.dll 重建 Bar.dll。对于一些商店来说,这不是问题;对于其他人来说,这可能是一个大问题。
  • 如果您编写任何反射代码,针对字段的反射与针对属性的反射是非常不同的。因此,如果您稍后将字段更改为属性,您的反射代码就会中断。

这两种情况有多重要?可能不是很。但是抢先式写起来更容易

public string PropertyName { get; set; }

如果您确实以后必须更改它,那么它是为了清理困惑。

而且没有性能成本。 JIT 编译器无论如何都会内联 getter 和 setter。所以它不花钱,却带来一些好处;到那时,为什么不使用属性?

关于c# - 为什么要封装这个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8347371/

相关文章:

c# - C# 中的 Excel 函数目标求等价算法

php - 我可以动态设置新的对象名称吗

java - 如何在不创建实例的情况下访问类中的特定组件/方法

javascript - Typescript 团队的直觉是什么让 not === default

python - 有没有更好的方法将字符串转换为Python中的数据集?

c# - 在 MVC 核心中搭建 Controller 时找不到主键

c# - 如何在 Windows 商店应用程序 C# 中读取 mp3 文件的每分钟节拍数标签?

java - 为什么对象引用在它存储的集合中也没有改变?

function - C中的一行函数?

c# - 我想一直检查标签的内容?