自动实现的属性c#


Auto-Implemented Properties c#

  • 有人能给我解释一下使用自动实现的属性c的想法吗?

    1
    2
    3
    4
    5
    public class Customer
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

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

  • 将字段定义为"public const"或将其定义为具有get-only属性之间是否存在差异?


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

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


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


    自动实现的属性本质上就是语法糖。一旦编译,备份存储就存在。它只是在源代码中不可用。

    正如其他人所说,属性和字段不是等价的。字段和属性不兼容,因此字段和属性之间的更改是一个破坏性的更改。此外,不能对字段使用数据绑定。

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

    1
    public int ID { get; private set; }

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


    我会让默沙东在这里说话……

    "在C 3.0及更高版本中,当属性访问器中不需要其他逻辑时,自动实现的属性使属性声明更加简洁。它们还允许客户机代码创建对象。当您声明如下示例所示的属性时(例如,请参阅msdn文章),编译器将创建一个私有的匿名支持字段,该字段只能通过属性的get和set访问器访问。"

    最有利的区别可能是,您可以进行验证前/验证后、提出PropertyChanged事件等。

    将字段定义为"public const"或将其定义为具有get-only属性之间是否存在差异?

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


    2:必须在compileTime中定义公共常量,不能使用引用对象。仅从System.ValueType继承的类(String、Int、Double,…)

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


    关于1:建议使用自动实现的属性,因为您以后可以在不中断更改的情况下实现其他逻辑。在学习自动实现的属性时可以找到一个这样的例子。