我看到很多C#类的示例代码执行此操作:
public class Point { public int x { get; set; } public int y { get; set; } }
或者,在旧代码中,具有显式私有支持值并且没有新的自动实现属性:
public class Point { private int _x; private int _y; public int x { get { return _x; } set { _x = value; } } public int y { get { return _y; } set { _y = value; } } }
我的问题是为什么.在执行上述操作与仅将这些成员设为公共字段之间是否有任何功能差异,如下所示?
public class Point { public int x; public int y; }
为了清楚起见,当您需要对基础数据进行一些翻译时,我理解了getter和setter的价值.但是,如果你只是传递价值观,那似乎是不必要的冗长.
我倾向于同意(它似乎不必要地冗长),虽然这已成为我们团队尚未解决的问题,因此我们的编码标准仍然坚持所有类的详细属性.
杰夫阿特伍德几年前处理过这个问题.他回顾性地指出的最重要的一点是,从一个领域转变为一个属性是你的代码中的一个重大变化 ; 任何消耗它的东西都必须重新编译才能使用新的类接口,所以如果你控制之外的任何东西都在消耗你的类,你可能会遇到问题.
稍后将其更改为更简单:
public int x { get; private set; }
它封装了这些成员的设置和访问.如果从现在起一段时间,代码的开发人员需要在访问或设置成员时更改逻辑,则可以在不更改类的合同的情况下完成.
我们的想法是,即使底层数据结构需要更改,也不必更改类的公共接口.
C#可以不同地处理属性和变量.例如,您不能将属性作为ref或out参数传递.因此,如果由于某种原因需要更改数据结构并且您正在使用公共变量并且现在需要使用属性,那么您的接口将不得不更改,现在代码访问属性x可能不再像它变量那样编译X:
Point pt = new Point(); if(Int32.TryParse(userInput, out pt.x)) { Console.WriteLine("x = {0}", pt.x); Console.WriteLine("x must be a public variable! Otherwise, this won't compile."); }
从一开始就使用属性可以避免这种情况,您可以随意调整底层实现,而不必破坏客户端代码.