1

我知道关键字“this”是指类变量中构造函数之外的变量。但是为什么不只是将参数的名称更改为 (string _name, string _alias) ,教程中“this”的所有示例都说明了这一点,但我想知道为什么在某些情况下需要这个关键字的工作用途情况。

private string name;
private string alias;
   public Employee(string name, string alias) 
    {
       this.name = name;
       this.alias = alias;
    }
4

2 回答 2

3

在您的示例中,您可以在字段名称上加上下划线,因此this不需要(仍然允许,但不需要,因为如果与局部变量没有冲突,则可以推断出来)。事实上,微软的标准鼓励这样做。

但是,仍有很多情况下您可能需要this关键字。

一个例子是,如果您在另一个接受 的类中有一个实用程序Employee,例如:

public static class Utility
{
    public static void SomeMethod(Employee employee)
    {
    }
}

并且您想从Employee类中调用此实用程序,则必须将其称为Utility.SomeMethod(this);.

此外,在当前实例上调用的扩展方法必须以this.. 给定以下扩展方法:

public static class UtilityExtensionMethods
{
    public static void SomeExtensionMethod(this Employee employee)
    {
    }
}

如果您想从Employee类中调用此扩展方法,则必须将其称为this.SomeExtensionMethod();.

于 2013-02-09T19:34:05.557 回答
1

我命名私有成员变量 _x以避免这种情况1支持/反对这一点的论据比比皆是

private string _name;
public Employee(string name, string alias) 
{       
   // Equivalent to `this._name = name`, as _name is not shadowed
   _name = name;
}

另一方面,我反对命名参数_x,因为参数名称是公共合约的一部分2。这个契约应该是干净、稳定的,并且应该由包含成员变量名称的内部实现来决定。

过去,在这种情况下,我使用 、 和 等名称employeeName作为aName参数theAlias,但我不喜欢最终使用的人工修饰符。如果我不能对私有变量使用下划线,我会使用this.x并且不会三思而后行。


1需要这种形式是因为this在 C# 中是“隐式的”和变量阴影。也就是说,this.x它是需要的,因为x它会引用一个局部变量/参数,如果它存在的话 - 它在这里。

private string name;
public Employee(string name, string alias) 
{
   // Re-assignes parameter to itself.
   // Does NOT assign member variable!
   name = name;
}

2我相信名称中的下划线会破坏“CLS 兼容性”,但这不是我关心的问题,并且仅对私有成员变量使用此约定可避免公开暴露此类不兼容的名称。

于 2013-02-09T19:29:42.347 回答