我知道属性有一些优势,但是如果您认为不需要属性,那么将其设为公共实例有什么害处?
人们说,如果您稍后尝试将公共字段更改为属性会破坏代码,但根据我的经验,将其更改为属性不会破坏任何代码。
我知道属性有一些优势,但是如果您认为不需要属性,那么将其设为公共实例有什么害处?
人们说,如果您稍后尝试将公共字段更改为属性会破坏代码,但根据我的经验,将其更改为属性不会破坏任何代码。
我认为人们的意思是它破坏了 ABI(二进制)兼容性,而不是 API(源)兼容性。
尽管语法相同,但在幕后,访问属性和访问成员变量的编译方式不同。
也就是说,如果您的变量/属性不能从您自己不编译的程序集中使用,那么更改它并没有什么坏处。但是如果它是公共接口的一部分,那么最好把它变成一个属性,这样你以后就不会后悔了。
这是关于保持二进制和源代码兼容性。将来某个时候,您可能会决定使赋值逻辑更加复杂,并将字段更改为属性。这就是问题出现的地方。
公共字段可以用作out
和ref
参数。属性不能。这将产生不可编译的代码。
不同的反射方法用于访问字段和属性。这意味着任何使用反射获取或设置值的代码都会中断,您只能在运行时了解它。
不同的IL运算符用于访问字段和属性。这意味着当字段更改为属性并且只重新编译一个程序集时,跨程序集兼容性会被破坏。这将使您的程序在运行时失败。
我同意你的看法,如果该属性只是该领域的一个包装器。Coding Horror 的人看起来和我们有同样的看法,我觉得他们使用的那个受惊的图标很有趣 :) http://www.codinghorror.com/blog/2006/08/properties-vs-public-variables.html
一个简单的程序。
在这里,我添加了两个属性和一个变量。我们可以根据自己的决定使用属性。但我更喜欢使用属性,因为它有助于实现一些业务验证,并且可以隐藏业务逻辑表单调用方。
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; }
}