为什么我们不能在C#中使用公共字段进行数据绑定?

时间:2014-12-20 16:55:50

标签: c# .net serialization data-binding public-fields

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

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

在这些情况下,是否有任何理由忽视公共领域?或者它只是某种惯例?或者只是强迫用户使用属性?

3 个答案:

答案 0 :(得分:8)

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

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

最后,这一切只意味着将公共字段的支持添加到任何数据绑定场景需要做更多的工作,所以因为它是一个反模式,无论如何这项工作都没有完成。

答案 1 :(得分:3)

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

但是,将字段公开会让您面临如此多的潜在问题,依赖于反射的系统设计人员常常试图通过拒绝对系统设计的支持来阻止对公共字段的使用。

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

答案 2 :(得分:0)

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

如果你的代码依赖于抽象,你需要使用接口,这里公共字段不可用。