正确使用“this”。关键字在C#中?

问题描述:

我正在研究Head First C#(到目前为止它已经进行得很顺利),但是我在使用“this”的语法时遇到了很多麻烦。关键词。正确使用“this”。关键字在C#中?

概念,我得到我应该用它来避免参数掩盖同名的领域,但我无法真正通过自己的例子(也,他们似乎没有跟踪它有一个专用于该特定关键字的部分,他们只是解释它并在他们的示例中开始使用它)。

在应用“这个”时,有没有人有任何好的经验法则?或者网上的任何教程,以不同的方式解释它,头First C#?

谢谢!

+0

的[你什么时候使用 “this” 关键字?](http://stackoverflow.com/questions/23250/when-do-you-use-the-this-keyword) – nawfal 2013-11-13 18:06:56

我写this.当且仅当它增强了可读性,例如,实现Comparable接口时(Java的,但这个想法是一样的):

public void compareTo(MyClass other) { 
    if (this.someField > other.someField) return 1; 
    if (this.someField < other.someField) return -1; 
    return 0; 
} 

至于参数阴影(例如,在构造函数) :我通常给这些相应的场的一个较短的名称,例如:

class Rect { 
    private int width, height; 
    public Rect(int w, int h) { 
    width = w; 
    height = h; 
    } 
} 

个人时,我有我只用它来它是:

  • 构造链接:

    public Foo(int x) : this(x, null) 
    { 
    } 
    
    public Foo(int x, string name) 
    { 
        ... 
    } 
    
  • 复制从参数名称到字段(不是在C#作为共同在Java中,如你平时使用属性 - 但常见于构造函数)

    public void SetName(string name) 
    { 
        // Just "name = name" would be no-op; within this method, 
        // "name" refers to the parameter, not the field 
        this.name = name; 
    } 
    
  • 参照该对象,而无需涉及任何成员:

    Console.WriteLine(this); 
    
  • 声明的扩展方法:

    public static TimeSpan Days(this int days) 
    { 
        return TimeSpan.FromDays(days); 
    } 
    

其他一些人总是使用它(例如对于其他方法调用) - 我个人发现有点混乱。

+1

可能重复关键字也用于扩展方法。 – masfenix 2010-02-21 19:32:53

+0

@Jon,我对你对第二个例子的想法很感兴趣。就个人而言,我只是将支持字段命名为不同以避免冲突,并删除对“this”关键字的需求。 (通常像私人成员字段'_name') – 2010-02-21 19:40:32

+1

@masfenix:谢谢,将补充说。 @西蒙:不,我喜欢这个。我不喜欢前缀(我发现干扰了我的阅读),如果我为一个概念选择了一个名字,那么推测它是我能想到的最好的一个。写作“这个”的痛苦。偶尔相对较小。 – 2010-02-21 19:47:45

基本上,this为您提供了当前对象的参考。您可以使用它来访问对象上的成员,或将当前对象作为参数传递给其他方法。

它在几乎所有情况下的访问成员变量或方法调用之前将其完全没有必要,但也有一些风格指南推荐它的各种原因。

就个人而言,我要确保我的名字我的成员变量是明显不同的从我的参数,以避免以往任何时候都不必使用“本”。例如:

private String _someData; 
public String SomeData 
{ 
    get{return _someData;} 
    set{_someData = value;} 
} 

这是非常个人的偏好,虽然,有些人会建议你命名的财产和成员变量一样(只是大小写不同 - “someData”和“SomeData”),并使用该关键字在访问私有成员以指示区别时。

因此,根据经验法则 - 避免使用它。如果你发现自己使用它来区分本地/参数变量和成员变量,然后重命名其中一个,所以你不必使用'this'。

我将使用它的情况是多个构造函数,将引用传递给其他方法和扩展方法。 (见Jon's answer的例子)

StyleCop的默认编码风格强制执行以下规则:

A1101:为{方法或属性名称 }调用必须与开始‘这个’ 前缀以指示该项目是该类的一个 成员。

这意味着属于当前类的每个方法,属性,属性都将以此为前缀。我最初对这个规则有抵触情绪,这使得你的代码更加冗长,但是它已经增长了,因为它使得代码非常清晰。 This thread discusses the question

+1

我认为这是最糟糕的StyleCop规则之一,仅次于对每个私人领域发表评论。 – 2010-02-21 19:52:16

如果你在一个使用相同类的字段的类中有一个方法,你可以使用它。

public class FullName 
    { 
     public string fn { set; get; } 
     public string sn { set; get; } 

     //overriding Equals method 
     public override bool Equals(object obj) 
     { 
      if (!(obj is FullName)) 
       return false; 

      if (obj == null) 
       return false; 

      return this.fn == ((FullName)obj).fn && 
      this.sn == ((FullName)obj).sn; 
     } 

     //overriding GetHashCode 
     public override int GetHashCode() 
     { 
      return this.fn.GetHashCode()^this.sn.GetHashCode(); 
     } 
    }