【问题标题】:Why can't we use public fields for data binding in C#?为什么我们不能在 C# 中使用公共字段进行数据绑定?
【发布时间】:2015-02-19 08:25:42
【问题描述】:

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

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

在这些情况下是否有充分的理由忽略公共字段?还是只是某种约定?还是只是为了强制用户使用属性?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 说在 Winforms 或 MVVM 数据绑定之类的东西中对它们有技术限制,因为它们都依赖于在值更改时触发事件以更新 UI .字段无法进行此类通知。
      • @AdamRobinson 对于可变值,是的 - 但在不可变场景中,没有理由不允许字段或标量用于只读数据显示,例如,在年份的下拉列表中。
      【解决方案3】:

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

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

      【讨论】:

      • 虽然这些都是优点,但这些都说明了为什么使用属性是首选的设计选择,而不是为什么数据绑定场景中不存在字段支持。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2012-01-06
      • 1970-01-01
      • 2011-08-01
      相关资源
      最近更新 更多