6

让我给你举个例子:

public class MyClass
{
    public string MyProperty { get; set; }

    public MyClass(string myProperty)
    {
        MyProperty = myProperty; // bad?
        this.MyProperty = myProperty; // good?
    }
}

我已经开始this在这种情况下使用,因为我有轻微的偏执狂,认为仅依靠案例可能会令人困惑,或者更糟糕的是实际上可能会导致错误。

这里的“最佳实践”是什么?

编辑:

到目前为止,这听起来比我想象的要主观得多。我想人们会强烈地从一边或另一边下来。

4

7 回答 7

12

在任何类中使用“ this.”都是多余的。设置使用它的标准完全取决于您的开发商店。

使用 " this." 的优点是一些开发人员在阅读代码时发现在他们的脑海中更容易将其与类实例相关联,并且正如您所提到的,在处理类似命名的项目时更清楚。

缺点是有些人认为它会使您的代码文件变得混乱,如果您使用 ReSharper 等工具,他们默认将其标记为冗余代码。

于 2009-09-30T17:07:13.973 回答
5

正如womp所说。“this”是多余的,但它使代码更易于阅读。或者更难误读。

于 2009-09-30T17:09:09.663 回答
2

这是我目前使用您的示例初始化属性的方式(自动实现和非自动实现)

        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' 因为有下划线而具有类范围。我过去常常从类级变量中省略下划线。当有下划线时,代码对我来说更容易阅读,因为我立即知道范围,而无需将鼠标悬停在变量上即可查看 VS 工具提示中的声明。此外,通过省略下划线,我获得了为局部变量使用相同名称的好处。这使您的初始化看起来很干净。下划线的另一个好处是您可以键入下划线并按 ctrl+space 并且所有类范围的变量都被分组。

于 2009-09-30T21:26:01.173 回答
2

C# 绝对区分大小写,因此使用时没有风险...

我的属性 = 我的属性;

因此,我会寻找其他最佳实践,例如编写实现目标所需的最少代码(同时进行自我记录)。事实是,这不是必需的,极简主义者可能会说把它排除在外。

于 2009-09-30T17:50:18.170 回答
1

在我的工作场所,编码标准规定属性写成 LikeThis 而局部变量写成 likeThis。由于 C# 区分大小写,因此这是一个用来区分变量的好工具。但是,如果您发现自己拥有一个名称完全相同的属性和局部变量,则使用 this 关键字肯定会消除用法的歧义。

于 2009-09-30T17:56:12.563 回答
0

在我看来,这里的“最佳实践”是“不要那样做”。如果我在我正在审查的代码中遇到它,我会立即标记它。有两个仅因情况而异的变量是等待发生的误解。维护程序员很容易在数月或数年后出现并无意中分配myThingMyThing.

后来补充:

一位评论者要求我提出替换大写/小写命名约定的建议。为此,我需要一个具体的例子。假设您有一个Book只有一个属性的简单类 Title

public class Book
{
    public string Title { get; private set; }
}

现在你需要一个构造函数。一个常见的约定是使用属性的小写版本:

public Book(string title)
{
    Title = title;
}

或者,如果您想确保没有歧义:this.Title = title.

可以说这在构造函数中是可以的。如果所有构造函数都如此简单,它可能会如此。但我的经验是,当构造函数超出几行代码时,和之间的区别Title就会title消失。当您谈论构造函数以外的方法时,问题会变得更糟。无论哪种方式,您都需要不同的约定。

用什么?ttl例如,我在参数中使用并看到了各种使用的缩写: 或类似的东西bookTitle,在使用 Intellisense 时更具描述性。在我看来,任何一个都比使用仅按大小写不同的名称的约定更可取。

于 2009-09-30T17:26:24.163 回答
0

您的两种选择都仅取决于大小写....两者都没有区别。

于 2009-09-30T17:08:27.380 回答