4

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

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

4

4 回答 4

7

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

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

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

于 2013-07-09T09:01:44.587 回答
2

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

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

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

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

于 2013-07-09T10:06:37.633 回答
0

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

于 2013-07-09T09:03:25.797 回答
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; }

    }
于 2013-07-09T09:07:47.603 回答