为什么希望在c#中使用所有属性而不是公共实例变量?

为什么希望在c#中使用所有属性而不是公共实例变量?,c#,properties,field,class-design,C#,Properties,Field,Class Design,我知道房产有一些好处,但是如果你认为你不需要房产,那么把它公开有什么坏处呢 人们说,如果以后再尝试将公共字段更改为属性,将破坏代码,但根据我的经验,将其更改为属性不会破坏任何东西。我认为人们的意思是它破坏了ABI(二进制)兼容性,而不是API(源代码)兼容性 虽然语法相同,但在幕后,对属性的访问和对成员变量的访问是不同的 这就是说,如果您的变量/属性不是从您自己不编译的程序集中使用的,那么更改它是无害的。但是,如果它是公共接口的一部分,那么最好将其设置为属性,这样将来您就不会后悔了。如果该属性只

我知道房产有一些好处,但是如果你认为你不需要房产,那么把它公开有什么坏处呢


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

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

虽然语法相同,但在幕后,对属性的访问和对成员变量的访问是不同的


这就是说,如果您的变量/属性不是从您自己不编译的程序集中使用的,那么更改它是无害的。但是,如果它是公共接口的一部分,那么最好将其设置为属性,这样将来您就不会后悔了。

如果该属性只是字段上的包装器,那么我同意您的看法。 《编写恐怖代码》的家伙们似乎有着我们相同的观点,我发现他们使用的受惊图标非常有趣:) 一个简单的程序

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

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; }

    }

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

  • 公共字段可用作
    out
    ref
    参数。属性不能。这将产生不可编译的代码

  • 不同的反射方法用于访问字段和属性。这意味着任何使用反射获取或设置值的代码都将中断,并且只有在运行时您才会知道这一点

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


  • 显示一些代码示例!属性为您提供了对解析到类中的数据的更多控制,您不希望任何旧数据位未验证到类中并引发异常。如果您需要在设置字段之前对其进行验证,会发生什么情况?或者,如果希望在字段更改时触发事件,会发生什么情况?在一个字段中,这两种操作都不容易完成。使用属性并没有真正的性能损失,因为它是自动实现的,小的属性将被抖动内联。属性也用于数据绑定,所以你不需要手动更新你的GUI。对MVC来说很好。如果换了一处房产,可能会导致。(我是属性的粉丝)它们有什么不同?@Killercam:对属性的访问被编译为方法调用。@Killercam:要读取
    T
    类型的属性
    Foo
    ,编译器调用方法
    T get\u Foo()
    ,并调用
    void set\u Foo(T value)