我理解关键字“this”是指类变量中构造函数外部的变量。但为什么不只是将参数的名称更改为(string _name,string _alias),教程中“this”的所有示例都只是说明了,但我想知道为什么需要这个关键字的工作用途情况。
private string name;
private string alias;
public Employee(string name, string alias)
{
this.name = name;
this.alias = alias;
}
答案 0 :(得分: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();
。
答案 1 :(得分:1)
我命名私有成员变量 _x
以避免此类情况 1 。 Arguments for/against this abound
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兼容性”,但这对我来说不是一个问题,只有使用私有成员变量的这种约定才能避免公开披露这些不相容的名字。