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

SMU*_*hah 12 c# this this-keyword

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

什么时候使用这个关键字
C#何时使用此关键字
在C#中使用静态方法的形式参数中的"this"关键字在C#中
正确使用"this."关键字?

我的问题是何时不使用'this'关键字.
或者
在代码之类的情况下始终使用此关键字是否正确

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:在类中为自己的变量使用'this' 是没用的吗?

Dan*_*ner 23

总是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这听起来更像白痴,而不是防止虫子. (3认同)
  • 就个人而言,我喜欢下划线,因为打字很难看,看起来很难看.它提醒我尽可能封装字段并遍历属性访问器,即使在类中也是如此.还有这个." 我只需要输入五个字符. (2认同)

Chr*_*ich 16

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

这是个人品味的问题(没有性能损失),但我发现this如果你有一个坚实的命名约定,那么显式更难维护并且增加很少的价值.有些人只会this在调用成员方法时使用,例如,this.Foo(_bar)而不是Foo(_bar),但我再也不认为它增加了很多.

如果您正在使用现有代码,请遵循其中的约定,否则,选择哪个使您最有效率和最有效.

  • 只是为了补充一点,使用`this`的另一个好理由是传入一个与你设置的私有字段同名的参数. (3认同)

Bri*_*sio 13

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


rec*_*ive 9

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