15

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

何时使用 this 关键字
C# 何时使用 this 关键字
在 C# 中静态方法的形式参数中使用“this”关键字
正确使用“this”。C#中的关键字?

我的问题是什么时候不使用 '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;
    }
}

在这里,我没有将“this”与“_xn”和“_count”一起使用,也没有与“_rssDoc.Load(_rssReader);”一起使用 好吗?我应该在类中所有出现的类变量中使用“this”吗?

编辑:在一个类中使用'this'作为它自己的变量没有用吗?

4

12 回答 12

25

总是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);
    }
}

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

于 2010-05-15T21:40:47.410 回答
18

this几乎总是可选的,不需要指定。如果您想明确指出您指的是成员,请使用this. 如果您有一个命名约定(例如将所有成员字段命名为类似_foo),那么您真的不需要像this._foo.

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

如果您正在使用现有代码,请遵循那里的约定,否则,请选择最有效率和最有效的代码。

于 2010-05-15T21:30:24.420 回答
14

我的经验法则:不要在多余的时候使用“this”。在这种情况下,“this”是多余的,所以我会避免它。像 ReSharper 这样的工具非常擅长告诉你什么时候出现这种情况。

于 2010-05-15T21:25:36.213 回答
9

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

于 2010-05-15T21:45:00.067 回答
3

我会尽量保持一致,这样人们就不会误以为你以其他方式(除了你通常选择的方式)有一些特殊意义。

如果您不使用字段的 _whatever 命名约定,那么您应该始终使用 this.whatever,否则当构造函数采用任何参数并尝试放入任何字段时会出现问题。

于 2010-05-15T21:25:02.123 回答
3

没事。特别是因为您的类没有基类并且私有字段已正确命名。ReSharper 认为this在您的情况下是多余的。

于 2010-05-15T21:25:34.120 回答
3

我应该在类中所有出现的类变量中使用“this”吗?

在您的特定情况下,不。

但是请考虑以下示例:

class RssReader
{
    private String url;

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

        // vs.

        new XmlTextReader (this.url);

        return true;
    }
}

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

于 2010-05-15T21:27:49.533 回答
3

绝对没有理由不使用它。即使是冗余也没有理由不使用它。您可以使用智能感知框安全地完成您的代码,并通过使用向下键选择正确的变量来节省您的时间,而不是一直损坏您的键盘。

于 2010-05-15T21:59:06.233 回答
2

你可以,但不需要,除非它是一个方法,它接受与你的类变量同名的参数(以区分它们)。

于 2010-05-15T21:26:01.340 回答
1

好吧,就我而言,当与以“_”开头的名称一起使用时,'this' 看起来真的很多余。不过,这在您的示例中是绝对合法的。

于 2010-05-15T21:28:14.130 回答
1

这是我的看法。当您调用类似DoMyThing();return Property;在实例范围内的类的成员(无论是方法、属性或字段)时,您不必调用实例成员。DoMyThing或者Property也可以是静态成员。

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. 仅实例成员的前缀

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

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

    public void Test()
    {
        var xyz = this.Instance; // prefixes 'this'
        Abc.Static(); //prefixes class
    }
    

这个答案并不是说一种风格比另一种更好。这只是个人喜好。每个都有自己的正确性和可读性要求。

我的看法:

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

湾。1. 对我来说更具可读性。前缀使它更多地是关于定义而不是意图。

C。4. 一切都是为了正确。它具有极其一致的优点,特别是考虑到无论如何您都将被迫为实例静态成员添加前缀。base当涉及到关键字base时,这一点更为重要.

就个人而言,我会选择 1。当我被迫使用时,我会使用this或谨慎使用。Abc它对我来说更具可读性,对我来说是一个好处,足以弥补它可能导致的一点点不一致。

于 2013-12-16T12:21:29.657 回答
0

尽管您的代码在没有“this”的情况下也可以工作,但它明确告诉您您的意思是“this”类的特定实例。有些人发现它更容易阅读,而且它可以帮助避免错误。

想象一下你犯了一个错误并写了……</p>

public string Name
  { get; private set; }

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

考虑到它本质上是同一个词,这是一个容易犯的错误。不幸的是,编译器不会捕捉到它——它不会抛出错误。结果,您的实例将被创建,但该属性不会被分配其值。另一方面,如果你在使用 'this' 时犯了同样的错误……</p>

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...
  }

编译器会抛出一个错误,告诉您您正在尝试为不存在的属性赋值。

于 2020-12-06T20:14:57.873 回答