2013-02-09 144 views
1

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

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

请参阅[此(C#参考)](http://msdn.microsoft.com/en-us/library/dk1507sz.aspx)。 – 2013-02-09 19:19:12

+0

否则,您将无法区分参数和类别字段?您可以将它们命名为_name,但它不是“漂亮”,并且说“_name = name” – TryingToImprove 2013-02-09 19:25:58

+0

这只是命名习惯..请看这里:http://msdn.microsoft.com/en-us/library/xzf533w0 %28VS.71,经典%29.aspx – TryingToImprove 2013-02-09 19:40:18

回答

1

我的名字私有成员变量_x为了避免这样的情况下。 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因为参数名合同 公众的一部分。这个合同应该是干净的,稳定的,并且应该由包含成员变量名称的内部实现来决定是否而不是

在过去,我使用employeeName,aNametheAlias这样的名称来表示这种情况下的参数,但我不喜欢最终被使用的人为修饰符。如果我不能使用私人变量的下划线,我会使用this.x而不是三思而后行。


需要这种形式是由于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; 
} 

我认为,强调在名称打破“CLS兼容”,但不是一个问题对我来说,只有采用这种约定私人成员变量避免公开揭露这种不兼容的名字。

+0

根据来自Microsoft的指导原则,他们在字段前加上前缀。“不要将字首应用于字段名称或静态字段名称。具体而言,请勿将字首应用于字段名称以区分静态字段和非静态字段。例如,应用g_或s_前缀不正确。http://msdn.microsoft.com/en-us/library/ta31s3bc%28VS.71%29.aspx,但许多用户(http://stackoverflow.com/questions/1630844/c-sharp-member-variables-fields-naming-convention)前缀..我反对前缀.. ;-) – TryingToImprove 2013-02-09 19:38:53

+1

@TryingToImprove我不会使用'g_'或's_'。这显然是错误的(对我来说),特别是当表示静态/非静态时。 'm_'太吵了,但我发现'_'用于*私有成员变量*恰到好处。我实际上添加了[这个答案的摘录](http://stackoverflow.com/a/1630928/166390),并遵循[链接的文章准则](http://10rem.net/articles/net-naming-conventions -and-programming-standards --- best-practices):D – 2013-02-09 19:40:16

+1

我不想和你争论:-)我可以看到赞成/反对这样做。我用'_'在JavaScript中加上“privates”。但在C#中,我的私有是camelCase,而public是CamelCase。我不记得上次我必须有一个“公共”字段。 – TryingToImprove 2013-02-09 19:44:48

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();