正确使用C#属性
private List _dates; public List Dates { get { return _dates; } set { _dates = value; } }
要么
public List Dates { get; set; }
我一直用前者,是不正确还是不好的做法? 我从未想过我可以使用第二个选项。 我喜欢让我的封装变量以下划线开头,所以我可以将它们与方法参数区分开来。 而我总是那样做。
是否有可能使用第一个选项会导致额外的List
对象被实例化,然后整个_dates
被替换为value
,还是比它更智能?
此外,哪个是行业中最突出的还是完全主观的?
它们在内部编译forms中是等效的,除了您不能以第二种forms访问编译器生成的私有变量。
从代码效率的角度来看,它们也是等价的,即时编译器通常直接访问私有变量而没有调用访问函数的开销(在运行时环境检查了可访问性等之后)。
从编码的角度来看,我更喜欢第二个版本,它更紧凑(写入少,阅读少)。
第二种语法是在C#3.0中引入的。 因此第一个变体将与旧编译器更兼容。
如果您需要为getter / setter添加某种逻辑,请使用前者。
否则使用后者。 它使事情变得更加清洁。 您还可以使用自动属性实现只读属性:
public List Dates { get; private set; }
或者,如果您不希望人们通过属性向列表中添加任何项目,您可以使用以前的语法:
private List _dates = new List (); private ReadOnlyCollection _readOnlyDates = new ReadOnlyCollection (_dates); public ReadOnlyCollection Dates { get { return _readOnlyDates; } }
由于.NET如何编译自动属性,两者基本相同。 .NET 3.5提供了自动属性。
我倾向于更多地使用自动属性,因为属性是表达对象正在做什么的意图的好方法,但仍然有一些保护。
几乎所有的属性声明都是这样的:
public bool IsBlah { get; private set; }
这使它成为一个漂亮,可读和受保护的getter。
但有时您需要明确的支持字段:
private bool? _isBlah; public bool IsBlah { get { if (_isBlah == null) { // Do something expensive here and set _isBlah _isBlah = true; } return _isBlah; } }
前者是原始方法,后者是较新的“自动属性”工具的示例,编译器会自动为您生成支持字段。
有些人(包括我自己)回避自动属性,因为语法很容易被误认为是抽象属性,没有“readonly”属性的设施,并且私有setter的自动属性的语法是笨拙的:
public List Dates { get; private set; }
我也发现让我的类的内部实现通过类API访问字段感到不舒服。
第二个变体被称为自动实现的属性 ,并在C#3.0中引入(因此您可能以前没有遇到它)。
如果要使用后备字段创建简单属性并且不需要在“getter”和“setter”中实现任何逻辑,则最好使用此格式。 它不仅更简洁,而且还迫使您直接访问该属性,而不是通过支持字段,这通常是最佳实践。
请注意,您仍然可以初始化属性,只需通过构造函数即可。
public class MyClass { public List Dates { get; set; } public MyClass() { Dates = new List (); } }
我个人更喜欢第一种方法,因为它允许您在返回之前执行一些操作。
EG(一个非常糟糕的例子)
private int _limit; private int _onHand; private bool returnToVendor; public Item(int limit, int onHand) { _limit = limit; _onHand = onHand; } public int ReturnStock { get { if(_onHand > _limit) { returnToVendor = true; return _onHand; } } set { _onHand = value; if(_onHand < _limit) { returnToVendor = false; } } }
没关系。 第二个只是糖。 我总是使用第二个,因为它更干净,但每隔一段时间我就需要访问支持值。
只要您不必确保在getter中初始化List
,您就可以使用这两个版本。 我只是建议您使用一个版本而不要在代码中混合它…
如果你需要它初始化你必须去第一个版本…
private List _dates; public List Dates { get { if (_dates == null) _dates = new List (); return _dates; } set { _dates = value; } }
我相信他们编译成相同的代码。 后者只是代表前者的语法糖。 我倾向于认为后者是未来逻辑的占位符,可能需要放置在属性中,此时我将所述受影响的属性转换为前者。
两者的编译方式大致相同(我不知道支持字段的名称将特别相同,但它们在function上是等同的)。
IIRC,在.NET 3.0或3.5中添加了执行自动属性( public List
)的function。
据我所知,我总是从我的对象中管理我的列表属性,使它们只读。
private IList _dates; public MyClass() { _dates = new List (); } public IList Dates { get { return _dates; } }
通过这样做,我确保我访问它时我的列表永远不会为空,因为客户端无法分配它。
但是,对于您的示例,如果在获取或设置属性时需要某种逻辑,则只需使用前一种方法。 否则,自动属性与您完全相同,只是获取并设置私有字段的值。 而且, { get; set; }
{ get; set; }
从我的谦虚的角度来看,提高可读性并帮助其他程序员理解你的意图。
例如:
public class MyClass { private IList _dates; public IList Dates { get { return _dates; } set { _dates = value; } } }
与
public class MyClasse { public IList Dates { get; set; } }
第二种方式使它更精简,更快,至少对我来说,意图是什么。 当getter和setter中没有逻辑是必要的时候,编写一个类变得更快。
否则,一个并不比另一个好,并且完全相同,谈到获取和设置属性的值没有逻辑。
最重要的是,您需要熟悉您的代码。 如果它结束了你没有得到任何改进,你喜欢你正在做的事情,而不仅仅是做它。 =)
上述就是C#学习教程:正确使用C#属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1006725.html