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

15

我知道使用属性比字段有优势,比如在未来需要时能够提供额外的逻辑。

但我真的很好奇为什么不能在数据绑定或像JavaScriptSerializer类这样的JSON序列化程序中使用公共字段。

在这些情况下忽略公共字段是否有好的理由?还是只是一种惯例?还是强制用户使用属性的原因?

3个回答

11
简短版即.NET自始至终将使用属性而不是public(或者实际上甚至是protected)字段作为基本设计选择。稍长版本是,支持public字段会增加数据绑定框架(无论您指的是哪一个)的复杂性。字段也缺乏任何形式的更改通知支持,在数据绑定中这是一个相当重要的方面(至少在像Winforms开发这样的有状态环境中)。最终,这只意味着需要更多的工作来添加对公共字段的支持到任何数据绑定场景中,因此由于它是一种反模式,所以这项工作没有进行。

3
这个限制没有技术上的原因:可以将公共字段添加到属性列表中并允许绑定。实际上,.NET中有一些API会自动选择属性或公共字段,基于名称。例如,LINQ的Expression具有PropertyOrField方法,该方法会根据其第一个参数返回的类型来选择其中之一。
然而,将字段公开会暴露您面临各种潜在问题,因此依赖反射的系统的设计者通常会试图通过在系统设计中不支持它们来阻止使用公共字段。
此外,在依赖事件进行绑定的系统中,由于无法在设置公共字段时触发事件,因此无法使用字段。

1
我会说在Winforms或MVVM数据绑定中存在技术限制,因为它们都依赖于事件触发以更新UI,而使用字段无法实现此类通知。 - Adam Robinson
@AdamRobinson 对于可变值,是的 - 但在不可变的情况下,没有理由不允许字段或标量用于只读数据显示,例如,在年份下拉列表中。 - Dai

0

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

如果您的代码依赖于抽象,您需要使用接口,并且在此处不能使用公共变量。


1
虽然这两点都很好,但它们说明了为什么使用属性是首选的设计选择,而不是为什么数据绑定场景中不存在字段支持。 - Adam Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接