代码之家  ›  专栏  ›  技术社区  ›  SMUsamaShah

何时不使用“this”关键字?

  •  11
  • SMUsamaShah  · 技术社区  · 14 年前

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

    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”关键字 .

    在代码这样的情况下使用这个关键字可以吗

    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”一起使用,也没有将“this”与“rssdoc.load(rssreader);”一起使用,可以吗?我应该将“this”用于类中所有出现的类变量吗?

    编辑: 它是 无用的 在类中为自己的变量使用“this”?

    11 回复  |  直到 10 年前
        1
  •  14
  •   Chris Schmich    14 年前

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

    这是个人品味的问题(没有表演惩罚),但我发现 如果您有一个可靠的命名约定,那么很难维护它,并且增加的值很小。有些人只会使用 调用成员方法时,例如 this.Foo(_bar) 而不是 Foo(_bar) 但我个人并不认为这会增加很多。

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

        2
  •  19
  •   Daniel Brückner Pradip    14 年前

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

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

        3
  •  12
  •   Brian Genisio    14 年前

    我的经验法则:当它是多余的时候,永远不要使用“这个”。在这种情况下,“这”是多余的,所以我会避免它。像Resharper这样的工具很善于告诉你什么时候会发生这种情况。

        4
  •  9
  •   recursive    14 年前

    我总是使用 this. 为了说明我指的是类成员,而不是局部变量。

        5
  •  3
  •   Doug McClean    14 年前

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

    如果您不为字段使用whatever命名约定,那么您应该使用它。无论是否一致,因为否则,当构造函数接受一个whatever参数并尝试放入一个whatever字段时,会出现问题。

        6
  •  3
  •   Yuriy Faktorovich    14 年前

    很好。尤其是因为您的类没有基类,并且私有字段的名称也相应。雷斯哈珀认为 this 在你的情况下是多余的。

        7
  •  3
  •   user151323    14 年前

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

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

    但是,请考虑以下示例:

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

    这里你需要说明 this 访问与方法参数同名的实例变量。

        8
  •  3
  •   OlimilOops    14 年前

    完全没有理由不使用这个。即使是冗余也没有理由不使用它。您可以利用IntelliSense框安全地完成代码,并通过使用向下键选择正确的变量来节省时间,而不必一直敲打键盘。

        9
  •  2
  •   mingos    14 年前

    您可以,但不需要,除非它是一个使用与类变量同名的参数的方法(为了区分它们)。

        10
  •  1
  •   n535    14 年前

    对我来说,用以“_uu”开头的名字时,“this”看起来真的很多余。不过,在您的示例中,这是绝对合法的。

        11
  •  1
  •   Community Egal    7 年前

    这是我的看法。当您像这样调用类的成员(无论是方法、属性还是字段)时 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
      }
      

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

    我的拿手:

    我一个人不喜欢前后不一致的风格。3。

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

    C. 4。一切都是为了正确。它的优点是非常一致,特别是考虑到您将被迫为两者加前缀 instance static 无论如何,在某个时候成员。当涉及到 base 关键字如果不加前缀 基础 关键字表示基类成员,然后在当前派生类中添加具有相同名称的成员将导致它重写上一个调用,从而更改整个动态。

    就个人而言,我会选择1。 使用 this Abc 当我被迫这样做的时候,我会小心翼翼的。它对我来说更具可读性,对我来说是一个好处,足以弥补它的不一致性。 可以 原因。

    推荐文章