【问题标题】:Why is it desirable to use all properties instead of public instance variables in c#?为什么需要在 c# 中使用所有属性而不是公共实例变量?
【发布时间】:2013-07-09 08:58:18
【问题描述】:

我知道属性有一些优点,但是如果您认为不需要属性,那么将其设为公共实例有什么害处?

人们说如果您稍后尝试将公共字段更改为属性会破坏代码,但根据我的经验,将其更改为属性不会破坏任何代码。

【问题讨论】:

  • 显示一些代码示例!
  • 属性让您可以更好地控制解析到您的类的数据,您不希望任何旧数据未经验证进入您的类并引发异常。
  • 如果您需要在设置之前对字段进行一些验证会怎样?或者当您希望在字段更改时触发事件时会发生什么?你不能用一个字段轻松地完成其中任何一个。使用属性并没有真正的性能损失,因为自动实现的小属性无论如何都会被 JITter 内联。
  • 属性也用于数据绑定,所以你不需要手动更新你的GUI。非常适合 MVC
  • 更改属性可能会导致this error。 (不过我是房产的粉丝)

标签: c# properties field class-design


【解决方案1】:

我认为人们的意思是它破坏了 ABI(二进制)兼容性,而不是 API(源)兼容性。

虽然语法相同,但在后台,访问属性和访问成员变量的编译方式不同。

也就是说,如果您的变量/属性不能从您自己未编译的程序集中使用,那么更改它并没有什么坏处。但是如果它是公共接口的一部分,那么最好把它做成一个属性,这样你以后就不会后悔了。

【讨论】:

  • 它们有何不同?
  • @Killercam:对属性的访问被编译为方法调用。
  • @Killercam 见description
  • @Killercam:要读取T 类型的属性Foo,编译器调用方法T get_Foo() 并设置它,它调用void set_Foo(T value)
【解决方案2】:

这是关于保持二进制和源代码兼容性。将来某个时候,您可能会决定使赋值逻辑更加复杂,并将字段更改为属性。这就是问题出现的地方。

  1. 公共字段可用作outref 参数。属性不能。这将产生不可编译的代码。

  2. 不同的反射方法用于访问字段和属性。这意味着任何使用反射获取或设置值的代码都会中断,您只能在运行时了解它。

  3. 不同的 IL 运算符用于访问字段和属性。这意味着当字段更改为属性并且只重新编译一个程序集时,跨程序集兼容性会被破坏。这将使您的程序在运行时失败。

【讨论】:

    【解决方案3】:

    我同意你的观点,如果该属性只是该字段的一个包装器。 Coding Horror 的人看起来和我们有相同的看法,我觉得他们使用的那个受惊的图标很有趣:) http://www.codinghorror.com/blog/2006/08/properties-vs-public-variables.html

    【讨论】:

      【解决方案4】:

      一个简单的程序。

      这里我添加了两个属性和一个变量。我们可以根据自己的决定使用属性。但我更喜欢使用属性,因为它有助于实现一些业务验证,并且可以隐藏业务逻辑表单调用方。

      class Program
          {
              static void Main(string[] args)
              {
                  Human h = new Human();
                  h.FirstName = "Test";
                  h.LastName = "User";
                  Console.WriteLine(h.FullName);
                  Console.Read();
              }
          }
          class Human
          {
              public string FullName { get { return FirstName + " " + LastName; } }
              public string FirstName;//{ get; set; }
              public string LastName;//{ get; set; }
      
          }
      

      【讨论】:

        猜你喜欢
        • 2021-11-23
        • 1970-01-01
        • 2011-11-30
        • 2010-10-18
        • 2013-05-07
        • 2010-12-24
        • 2023-04-04
        • 1970-01-01
        • 2018-11-12
        相关资源
        最近更新 更多