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

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

你什么时候使用这个关键字
C#何时使用此关键字
在C#中的静态方法的forms参数中使用“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; } } 

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

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

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

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

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

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

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

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

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

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

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

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

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

在你的特殊情况下,没有。

但请考虑以下示例:

 class RssReader { private String url; public bool FetchFeed (String url) { new XmlTextReader (url); // vs. new XmlTextReader (this.url); return true; } } 

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

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

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

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

这是我看待它的方式。 当您调用类的成员(无论是方法,属性或字段)时,如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. 单独为实例成员的前缀

     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.当我被迫时,请谨慎使用thisAbc 。 它对我来说更具可读性,对我来说是一个好处,足以弥补它可能造成的微小不一致。