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

时间:2013-07-09 08:58:18

标签: c# properties field class-design

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

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

4 个答案:

答案 0 :(得分:7)

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

尽管语法相同,但在幕后,对属性的访问和对成员变量的访问的编译方式也不同。

也就是说,如果您的变量/属性不是从您自己不编译的程序集中使用的,那么更改它就没有任何害处。但如果它是公共界面的一部分,那么最好将它作为一个属性,这样你将来不会后悔。

答案 1 :(得分:2)

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

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

  2. 不同的 Reflection 方法用于访问字段和属性。这意味着使用Reflection获取或设置值的任何代码都会中断,只有在运行时才会知道它。

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

答案 2 :(得分:0)

如果该属性只是该字段的包装,我同意你的看法。 Coding Horror的那些人看起来有同样的看法,我发现他们使用的受惊吓的图标非常有趣:) http://www.codinghorror.com/blog/2006/08/properties-vs-public-variables.html

答案 3 :(得分:0)

一个简单的程序。

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

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

    }