我知道属性有一些优点,但是如果你认为你不需要属性,那么将它作为公共实例有什么害处?
人们说如果您稍后尝试将公共字段更改为属性会破坏代码,但根据我的经验,将其更改为属性不会破坏任何内容。
答案 0 :(得分:7)
我认为人们的意思是它破坏了ABI(二进制)兼容性,而不是API(源)兼容性。
尽管语法相同,但在幕后,对属性的访问和对成员变量的访问的编译方式也不同。
也就是说,如果您的变量/属性不是从您自己不编译的程序集中使用的,那么更改它就没有任何害处。但如果它是公共界面的一部分,那么最好将它作为一个属性,这样你将来不会后悔。
答案 1 :(得分:2)
这是关于保持二进制和源兼容性。将来的某个时候,您可能会决定将值分配的逻辑更复杂,并将字段更改为属性。这就是出现问题的地方。
公共字段可用作 out
和ref
参数。属性不能。这将产生无法编译的代码。
不同的 Reflection 方法用于访问字段和属性。这意味着使用Reflection获取或设置值的任何代码都会中断,只有在运行时才会知道它。
使用不同的 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; }
}