何时不使用'this'关键字?

时间:2010-05-15 21:22:09

标签: c# this this-keyword

很抱歉再次询问,已经有一些关于此关键字的问题。但他们所有人都说出了“这个”的目的。

When do you use this keyword
C# when to use this keyword
Use of “this” keyword in formal parameters for static methods in C#
Proper usage of “this.” keyword in C#?

我的问题是何时不使用'this'关键字 OR
在代码

之类的情况下始终使用此关键字是否正确
class RssReader
{
    private XmlTextReader _rssReader;
    private XmlDocument _rssDoc;
    private XmlNodeList _xn;

    protected XmlNodeList Item { get { return _xn; } }
    public int Count { get { return _count; } }

    public bool FetchFeed(String url)
    {
        this._rssReader = new XmlTextReader(url);
        this._rssDoc = new XmlDocument();
        _rssDoc.Load(_rssReader);
        _xn = _rssDoc.SelectNodes("/rss/channel/item");
        _count = _xn.Count;
        return true;
    }
}

这里我没有使用'this'和“_xn”和“_count”也没有使用“_rssDoc.Load(_rssReader);”好吗?我应该在类中使用“this”以及所有类变量吗?

编辑:是否无用在类中使用'this'作为自己的变量?

12 个答案:

答案 0 :(得分:22)

总是使用this。我对局部变量和私有字段使用相同的命名约定,它使代码更容易阅读,因为如果使用的标识符是字段或局部变量,它就变得很明显。

此外,它通过添加隐藏字段的新局部变量来防止引入错误。

internal sealed class Foo
{
    private Int32 bar = 42;

    private void Bar()
    {
        // Uncommenting the following line will change the
        // semantics of the method and probably introduce
        // a bug.  
        //var bar = 123;

        Console.WriteLine(bar);

        // This statement will not be affected.
        Console.WriteLine(this.bar);
    }
}

这可以通过对字段和局部变量使用不同的命名约定来避免,但我真的不喜欢下划线前缀名称。单词的第一个字符对于其可读性非常重要,而下划线是最糟糕的选择之一。

答案 1 :(得分:15)

this几乎总是可选的,不需要指定。如果您想明确表示您指的是成员,请使用this。如果您有一个命名约定(例如命名所有成员字段类似_foo),那么您实际上不需要像this._foo那样引用它们。

这是个人品味的问题(没有性能损失),但我发现明确的this更难维护,如果你有一个坚实的命名约定,几乎没有增加价值。有些人在调用成员方法时只会使用this,例如this.Foo(_bar)代替Foo(_bar),但我个人认为它不会增加太多。

如果您正在使用现有代码,请按照惯例进行操作,否则,请选择最能提高效率的代码。

答案 2 :(得分:13)

我的经验法则:永远不要使用'this'。在这种情况下,'this'是多余的,所以我会避免它。像ReSharper这样的工具非常善于告诉你何时是这种情况。

答案 3 :(得分:9)

我总是使用this.来表明我指的是一个类成员,而不是一个局部变量。

答案 4 :(得分:3)

我会尽量保持一致,这样人们就不会感到困惑,认为你用其他方式做的少数(除了你通常选择的方式)有一些特别的意义。

如果你没有对字段使用_whatever命名约定,那么你应该使用this.whatever,因为否则当构造函数接受任何参数并尝试放入任何字段时会出现问题。

答案 5 :(得分:3)

很好。特别是因为您的类没有基类,并且私有字段已正确命名。 ReSharper认为您案件中的this是多余的。

答案 6 :(得分:3)

  

我是否应该在类中使用“this”以及所有类变量?

在您的特定情况下,否。

但请考虑以下示例:

class RssReader
{
    private String url;

    public bool FetchFeed (String url)
    {
        new XmlTextReader (url);

        // vs.

        new XmlTextReader (this.url);

        return true;
    }
}

在这里,您需要指定this来访问与方法参数同名的实例变量。

答案 7 :(得分:3)

绝对没有理由不使用它。甚至冗余也没有理由不使用它。你可以从intellisense盒中获益,安全地完成你的代码并通过使用向下键选择正确的变量来节省你的时间,而不是一直用你的键盘。

答案 8 :(得分:2)

您可以,但不需要,除非它是一个带有与您的类变量相同名称的参数的方法(以区分它们)。

答案 9 :(得分:1)

好吧,就我而言,当使用以“_”开头的名字时,'this'看起来真的很多余。这在你的例子中绝对合法。

答案 10 :(得分:1)

以下是我的看法。当您在实例范围内调用类的成员(无论是方法,属性或字段)时,如DoMyThing();return Property;,您没有必要调用实例成员。 DoMyThingProperty也可以是静态成员。

public class Abc
{
    public static void Static()
    {
    }

    public Xyz Instance;

    public void Test() //instance scope
    {
        var xyz = Instance; //calls instance member
        Static(); //calls static member
    }
}

对于他们两个(静态和实例)我没有前缀任何东西。其实我的选择是:

  1. 根本没有前缀

    public void Test()
    {
        var xyz = Instance;
        Static();
    }
    
  2. 单独为实例成员的
  3. 前缀

    public void Test()
    {
        var xyz = this.Instance; // prefixes 'this'
        Static(); 
    }
    
  4. 仅用于静态成员的
  5. 前缀

    public void Test()
    {
        var xyz = Instance; 
        Abc.Static(); //prefixes class
    }
    
  6. 两种情况下的前缀

    public void Test()
    {
        var xyz = this.Instance; // prefixes 'this'
        Abc.Static(); //prefixes class
    }
    
  7. 这个答案并不是说一种风格比其他风格更好。这只是个人偏好。每个人都有自己的正确性和可读性。

    我的看法:

    一个。我不喜欢2和3的不一致风格。

    湾1.具有对我更具可读性的优点。前缀使其更多地关于定义而非意图。

    ℃。 4.完全是正确的。它具有极其一致的优点,特别是考虑到你无论如何都会被迫为instancestatic成员加前缀。对于base关键字来说,这一点更为重要,如果你没有为基类成员添加base关键字前缀,那么在当前派生类中添加一个具有相同名称的成员将导致它覆盖以前的呼叫,改变整个动态。

    就个人而言,我会选择1。并在我被迫时谨慎使用thisAbc。它对我来说更具可读性,对我来说是一个好处,足以弥补可能造成的微小不一致。

答案 11 :(得分:0)

尽管您的代码无需使用“ this”即可运行,但它明确表明您是指“ this”类的特定实例。有些人发现它更易于阅读,而且可以帮助避免错误。

想象你犯了一个错误并写了……

public string Name
  { get; private set; }

public Forest(string name)
  {
    name = Name;   //these are written in the wrong order...
  }

由于它实际上是相同的词,所以容易犯一个错误。不幸的是,编译器无法捕获它-它不会引发错误。结果,将创建您的实例,但不会分配该属性的值。另一方面,如果您在使用“ this”时犯了相同的错误……

public string Name
  { get; private set; }

public Forest(string name)
  {
    this.name = Name;   //these are still  written in the wrong order but with 'this' prefix...
  }

编译器将引发错误,告诉您您正在尝试将值分配给不存在的属性。