在C#中,"this"关键字是必须的吗?

9
在下面的构造函数中,'this'关键字是否是必需的?我知道我可以删除它,代码可以编译,一切正常。如果我省略'this',那么以后会出现问题吗?省略'this'被认为是不好的做法吗?
    // Constructor:
    public Employee(string name, string alias)
    {
        // Use this to qualify the fields, name and alias:
        this.name = name;
        this.alias = alias;
    }

参见:https://dev59.com/kHVD5IYBdhLWcg3wTZxm - Marc Gravell
6个回答

26

不是必须的,几乎所有情况下都可以省略this。仅在您的示例中需要它来消除局部变量和参数以及具有相同标识符名称的成员变量之间的歧义。

您可以通过将参数或字段重命名为唯一的名称来避免使用this


1
所以这是必需的。如果他不使用它,那么代码将无法正常工作。没有“this”,它甚至能编译吗? - Alex Baranosky
1
它会编译,但会有警告。 - Andrew Hare
需要这样做的原因是,编译器会假设 name 指的是参数,而不是省略了 this 的字段。显然,它可以编译,但程序中会出现逻辑错误。 - Andrew Hare
如果类实现了一个基类(base vs. this),那么“this”也可以与成员方法区分开来。 - jro

10

是的,在你的代码示例中需要使用它。C# 始终假定你指的是局部变量,因此如果成员变量和局部变量具有相同的名称,则 必须 使用this,否则会认为你在引用局部变量。

在你的代码示例中,如果忽略了this,实际上是将name(或alias)的值分配给它本身(因此什么也没有完成)。


5
在下面的情况下,this是绝对必需的。但是,您可以通过选择变量名称来避免使用它。在我看来,下面的示例没有任何问题,我并不介意使用this。事实上,即使不需要,我经常使用this来提示我的IDE中的智能感知和自动完成。
internal class Something
{
    private string name;
    public Something(string name)
    {
        this.name = name;
    }
}

3

这是可选的,除非您有一个名为“name”的成员变量,在这种情况下,您的代码将会给自身赋值。

我总是喜欢使用“this”来访问所有的成员变量,以便更加明确。有些人喜欢使用“_”作为前缀,甚至使用“m”。


最近我一直在使用下划线(_),但是我发现很多示例代码,像上面展示的那样,都使用了'this'关键字,因此我产生了疑问。 - DenaliHardtail
1
我更喜欢使用 'this',因为它不会出错;有人可能会意外地将本地变量命名为“_”,但使用 this 就显而易见了。 - Noon Silk
@sikly:适当的工具可以防止以“_”开头的意外本地变量。人眼也可以做到。 - John Saunders
3
我更喜欢使用最基本的工具(编译器)来查找错误。 - Noon Silk
@Scott -- 这很可能是人们开始使用默认设置的 StyleCop 工具来自动化编码标准的结果。 - Steve Gilham

0

在C#中,最常见的是将私有变量命名为_Name或m_Name。这也使得很容易通过视觉匹配属性,因为如果你有一个使用本地私有变量_Name的属性Name,那么很容易快速地看出它的作用。

在你的例子中,如果没有使用this关键字,你所做的只是将本地变量赋值给本地变量(而不是私有变量)。这就是为什么它可以编译,但不会执行你认为它应该执行的操作。


3
实际上,像_或m_这样使用符号的做法违反了MSFT编码准则中嵌入在FxCop和StyleCop工具中的规定。MSFT编程标准要求即使不需要将字段与局部变量区分开,也要使用“this.”前缀。 - Steve Gilham
@SteveGilham是正确的,不要在您的C#代码中使用m_前缀。 - Jon

0
在你的例子中,如果你不使用"this",会发生更糟糕的事情:"变量隐藏"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接