14

我知道使用属性而不是字段的优势,例如能够在将来需要时提供额外的逻辑。

但我真的很想知道为什么不能使用公共字段来进行数据绑定,甚至不能使用像 JavaScriptSerializer 类这样的 JSON 序列化器。

在这些情况下,是否有充分的理由忽略公共领域?还是只是某种约定?还是只是强迫用户使用属性?

4

3 回答 3

10

简短的版本是,从一开始,始终使用属性而不是public(或者,实际上,甚至是protected)字段一直是 .NET 中的基本设计选择。

稍长的版本是添加对public字段的支持会增加数据绑定框架的复杂性(无论您指的是哪个)。字段也缺乏对更改通知的任何支持,这是数据绑定的一个相当重要的方面(至少在像 Winforms 开发这样的有状态环境中)。即使在检索和设置值的级别,字段和属性也是不同的;虽然 VB.NET 或 C# 中用于检索或设置属性值的语法(按设计)与字段的语法相同,但在数据绑定等编程场景中用于执行此操作的机制对于属性与属性是不同的。字段。

最后,这一切都意味着需要更多的工作来为任何数据绑定场景添加对公共字段的支持,因此,由于它是一种反模式,因此无论如何这项工作都没有完成。

于 2014-12-20T17:02:57.620 回答
3

这种限制背后没有技术原因:当然可以将公共字段添加到属性列表中,并允许绑定到它们。事实上,.NET 中的 API 会自动选择属性或公共字段,仅基于名称。例如,LINQ 的Expression方法PropertyOrField可以根据第一个参数中的表达式返回的类型来选择一个或另一个。

但是,将字段公开会使您面临一系列潜在问题,以至于依赖于反射的系统设计者经常试图通过在系统设计中不支持公共字段来阻止使用公共字段。

此外,在依赖事件进行绑定的系统中,由于技术原因,无法使用字段,因为无法在设置公共字段时触发事件。

于 2014-12-20T17:05:21.710 回答
0

由于您不能在接口中声明字段,因此您不应该使用公共字段。所有字段都应该是私有的。

如果您的代码依赖于抽象,则需要使用接口,并且此处的公共字段不可用。

于 2014-12-20T17:06:26.860 回答