C#自动实现的属性和局部变量的最佳实践,仅根据具体情况而有所不同?
让我给你举个例子:
public class MyClass { public string MyProperty { get; set; } public MyClass(string myProperty) { MyProperty = myProperty; // bad? this.MyProperty = myProperty; // good? } }
我已经开始在这种情况下使用this
,因为我有轻微的偏执,单独依赖案例可能会让人感到困惑,或者更糟糕的是可能会导致错误。
这里的“最佳实践”是什么?
编辑:
到目前为止,听起来这比我想象的要主观得多。 我想人们会在一方或另一方强烈下来。
使用“ this.
”在任何课程中都是多余的。 这完全取决于您的开发商店设置使用它的标准。
使用“ this.
”的优点是,一些开发人员发现在阅读代码时更容易将它们与类实例相关联,正如您所提到的,在处理类似命名的项目时更清楚。
缺点是有些人认为它使你的代码文件变得混乱,如果你使用像ReSharper这样的工具,它们会默认将它标记为冗余代码。
正如womp所说。 “这”是多余的,但它使代码更容易阅读。 或者更难以误读。
C#绝对区分大小写,因此使用中没有风险……
MyProperty = myProperty;
那么我会寻找其他最佳实践,例如编写实现目标所需的最少量代码(同时进行自我记录)。 事实是,这不是必需的,极简主义者可能会说不管它。
这是我当前如何使用您的示例初始化属性(自动实现和不自动)
public class MyClass { public string MyProperty { get; set; } public string AnotherProperty { get { return _anotherProperty; } set { _anotherProperty = value; } } private string _anotherProperty; public MyClass(string myProperty, string anotherProperty) { MyProperty = myProperty; // auto-implemented property initialization _anotherProperty = anotherProperty; //property with member variable initialization } }
点击使用’this’超出我的规范。 我知道这是一个本地财产,因为它是资本化的。 所有属性都应该是资本化的。 我知道变量’_anotherProperty’因为下划线而具有类范围。 我曾经省略了类级变量的下划线。 当下划线存在时,我更容易阅读代码因为我立即知道范围而不必将鼠标hover在变量上以查看VS中工具提示中的声明。 此外,我通过省略下划线获得了为局部变量使用相同名称的好处。 这使您的初始化看起来很干净。 下划线的另一个好处是,您可以键入下划线并按ctrl +空格,并将所有类范围的变量分组。
在我的工作场所,编码标准要求将属性写成LikeThis,而局部变量则写成像这样。 由于C#区分大小写,因此这是一个很好的工具,用于区分变量。 但是,如果您发现自己的属性和局部变量具有完全相同的名称,则使用this关键字肯定会消除使用歧义。
你的两个选择都只依赖于案例……两者之间没有区别。
在我看来,这里的“最佳实践”是“不要那样做”。 如果我在我正在审查的代码中遇到它,我会立即标记它。 只有两种不同的变量只是等待发生的误解。 对于维护程序员来说,几个月或几年后很容易就会出现这种情况,并且无意中对myThing
而不是MyThing
。
后来添加:
一位评论者要求我提出更换大/小写命名惯例的建议。 为此,我需要一个具体的例子。 假设您有一个只有一个属性的简单Book
类: Title
:
public class Book { public string Title { get; private set; } }
现在你需要一个构造函数。 常见的约定是使用属性的小写版本:
public Book(string title) { Title = title; }
或者,如果你想确保没有歧义: this.Title = title
。
人们可以certificate这在构造函数中是可以的。 如果所有构造函数都如此简单,它可能就是这样。 但是我的经验是,当构造函数超出几行时, Title
和title
之间的区别就会丢失。 当你在谈论构造函数以外的方法时,问题会变得更糟。 无论哪种方式,您都需要一个不同的约定。
用什么? 我在参数中使用过各种各样的缩写:例如ttl
。 或类似bookTitle
东西,在使用Intellisense时更具描述性。 在我看来,要么优于使用仅根据情况不同的名称的惯例。