【问题标题】:Auto-Implemented Properties c#自动实现的属性 c#
【发布时间】:2010-05-25 08:57:05
【问题描述】:
  1. 有人可以解释一下使用 Auto-Implemented Properties c# 背后的想法吗?

    public class Customer
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    

    我得到了使用私有字段属性的动机,因此我们可以确定如何访问私有字段。但是在这里 - 这就像从一开始就将字段定义为公开。没有?

  2. 将字段定义为“public const”或将其定义为具有 get-only 属性有区别吗?

【问题讨论】:

标签: c#


【解决方案1】:

公共自动属性与公共字段不同,它们不是二进制兼容的。如果您实现了一个公共字段,然后想要添加一些逻辑,您将不得不将其更改为一个属性,从而引入一个重大更改(因为二进制不兼容)。这就是为什么许多约定都声明您不应该公开公共字段而应该使用属性的原因。

因此,对于任何简单的非私有类值成员来说,自动属性只是一个方便的起点,允许稍后添加逻辑,同时保持二进制兼容性。

【讨论】:

    【解决方案2】:

    属性可以数据绑定,而字段不能。

    【讨论】:

      【解决方案3】:

      自动实现的属性本质上是语法糖。一旦编译,后备存储就存在了。它只是无法从源代码中获得。

      正如其他人所说,属性和字段是不等价的。字段和属性不兼容,因此在它们之间进行更改是一项重大更改。此外,您不能对字段使用数据绑定。

      最后一点。尽管在您的情况下,示例和公共字段之间几乎没有功能差异,但您可以更改其中一个访问器的可见性。因此,要使用自动属性创建只读属性,您可以执行以下操作:

      public int ID { get; private set; }
      

      在这种情况下,根据整个签名,get 访问器是公共的,但 set 访问器是私有的。

      【讨论】:

        【解决方案4】:

        我会让MSDN在这里说话....

        “在 C# 3.0 及更高版本中,当属性访问器中不需要额外的逻辑时,自动实现的属性使属性声明更加简洁。它们还使客户端代码能够创建对象。当您声明一个属性时,如图所示在下面的示例中(例如,参见 MSDN 文章),编译器创建了一个私有的、匿名的支持字段,该字段只能通过属性的 get 和 set 访问器访问“

        可能最有利的区别是您可以进行前/后验证、引发 PropertyChanged 事件等

        将字段定义为“public const”或将其定义为具有 get-only 属性有区别吗?

        是的,仅获取字段必须具有私有字段声明。该字段可以由类内部更改,将字段标记为 const 意味着它不能被修改。

        【讨论】:

          【解决方案5】:

          2: public const 必须在编译时定义,你不能使用引用对象。仅继承自 System.ValueType (string, int, double, ...)的类

          const 也是静态的,而只有 getter 的属性不是(每个类都有自己的实例。)

          【讨论】:

            【解决方案6】:

            为 getter 函数添加逻辑。可以访问另一个属性的值

             public string Status
                {
                    get { return DeactivateDate != null ? "InActive" : "Active"; }
                    private set { }
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-06-04
              • 2021-04-14
              • 1970-01-01
              • 1970-01-01
              • 2014-03-16
              • 2015-05-23
              • 1970-01-01
              相关资源
              最近更新 更多