为啥使用属性而不是字段更好? [复制]

Posted

技术标签:

【中文标题】为啥使用属性而不是字段更好? [复制]【英文标题】:Why is it good to use Properties instead of fields? [duplicate]为什么使用属性而不是字段更好? [复制] 【发布时间】:2013-12-27 03:12:03 【问题描述】:

我读了很多关于我永远不应该在我的模型和 DTOS 中使用字段的文章,但我从来没有读过为什么会这样。

public int property get; set;  

public int Foo;

这两者之间的区别是什么?

【问题讨论】:

***.com/questions/295104/… Jon Skeet 已经回答了这个问题! [1]:***.com/a/1272535/2270839 同时使用属性可以让您更精细地控制访问。如果您希望其他人能够读取但未设置的属性,则可以使用 get; private set; 轻松实现。但是你不能用一个字段来做到这一点。 【参考方案1】:

一个重要的区别是接口可以有属性但不能有字段。

JON SKEET 给出的article 对理解这一点非常有用。

属性的实际好处

有时您可以使用非私有字段,因为对于 无论您出于何种原因不关心上述兼容性原因。 然而,即使是微不足道的使用属性仍然有好处 情况:

有更细粒度的属性访问控制。需要它可以公开获取,但真的只希望它设置为受保护 使用权?没问题(至少从 C# 2 开始)。 想要在值更改时闯入调试器?只需在 setter 中添加断点即可。 想要记录所有访问?只需将日志记录添加到 getter。 属性用于数据绑定;字段不是。

【讨论】:

【参考方案2】:

一个很好的理由是因为它允许您在 getter 和 setter 中包含逻辑和验证

【讨论】:

【参考方案3】:

取自:http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx

属性的实际好处

有时您可以使用非私有字段,因为无论出于何种原因,您都不关心上述兼容性原因。但是,即使在琐碎的情况下使用属性仍然有好处:

还有更细粒度的属性访问控制。需要它是公开可获取的,但真的只希望它具有受保护的访问权限吗?没问题(至少从 C# 2 开始)。 想要在值更改时闯入调试器?只需在设置器中添加一个断点。 想要记录所有访问?只需将日志记录添加到 getter 即可。 属性用于数据绑定;字段不是。 这些都不是传统的“添加真实逻辑”属性的使用,但是对于普通字段来说,所有这些都是棘手的/不可能的。您可以在“当我需要时”这样做,但为什么不从一开始就保持一致呢?使用 C# 3 的自动属性更容易理解。

只暴露属性的哲学原因

对于您编写的每种类型,您都应该考虑它与世界其他地方的接口(包括同一程序集中的类)。这是它对它所提供的东西的描述,它的外在角色。实现不应该是该描述的一部分,而不是绝对必须的。 (这就是为什么我更喜欢组合而不是继承,在这种情况下选择是有意义的——继承通常会暴露或限制可能的实现。)

属性传达“我将为您提供价值,或接受您提供的价值”的理念。这不是一个实现概念,它是一个接口概念。另一方面,字段传达实现 - 它表示“这种类型以这种非常特定的方式表示一个值”。没有封装,它是裸存储格式。这是字段不属于接口的部分原因 - 它们不属于接口,因为它们谈论的是如何实现某事而不是实现什么。

我非常同意,很多时候,字段实际上可以在应用程序的生命周期内毫无问题地使用。只是事先不清楚是哪个时间段,还是违反了不暴露实现的设计原则。

【讨论】:

以上是关于为啥使用属性而不是字段更好? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该更喜欢 unsafe_unretained 限定符而不是为弱引用属性赋值? [复制]

如果 Swift 通过值而不是引用传递,为啥我可以通过将 UIView 传递给函数来在 Swift 中操作 UIView 的属性? [复制]

使用注释而不是模型属性

C#中继承类为啥可以通过属性访问基类的私有字段。

C#中为啥使用字段封装

MSSQL 中Bit属性的字段表示为0或1但当用在ASP中显示出来的却是true或false而不是0或1,为啥呢?