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

“this”关键字在C中的用途是什么?#

c#
  •  20
  • andrewWinn  · 技术社区  · 15 年前

    因为在方法中声明的变量只能在该方法中使用,而在类中声明为私有的变量只能在类中使用。目的是什么 this 关键词?为什么我想要以下内容:

    private static class SomeClass : ISomeClass
    {
        private string variablename;
        private void SomeMethod(string toConcat)
        {
            this.variablename = toConcat+toConcat;
            return this.variablename;
        }
    }
    

    当这将做完全相同的事情时:

    private static class SomeClass : ISomeClass
    {
        private string variablename;
        private void SomeMethod(string toConcat)
        {
            variablename = toConcat+toConcat;
            return variablename;
        }
    }
    

    练习打字技巧?

    19 回复  |  直到 13 年前
        1
  •  36
  •   Stack Overflow is garbage    15 年前

    有几个情况很重要:

    • 如果函数参数和成员变量具有相同的名称,则需要能够区分它们:

      class Foo {
        public Foo(int i) { this.i = i; }
      
        private int i;
      }
      
    • 如果你真的需要参考 当前对象 而不是它的一个成员。也许您需要将它传递给另一个函数:

      class Foo {
        public static DoSomething(Bar b) {...}
      }
      
      class Bar {
        public Bar() { Foo.DoSomething(this); }
      }
      

      当然,如果你想 返回 对当前对象的引用

        2
  •  28
  •   R. Martinho Fernandes    15 年前

    在您的示例中,这纯粹是一个品味问题,但这里的情况并非如此:

    private string SomeMethod(string variablename)
    {
        this.variablename = variablename;
        return this.variablename;
    }
    

    没有 this 代码将以不同的方式工作,将参数分配给自己。

        3
  •  15
  •   Tarydon    15 年前

    在许多情况下,这是有用的。以下是一个例子:

    class Logger { 
       static public void OutputLog (object someObj) {
          ...
       }
    }
    
    class SomeClass { 
       private void SomeMethod () { 
          Logger.OutputLog (this);
       } 
    }
    

    这是另一个例子。假设我正在编写一个stream.out方法,该方法输出一个对象,并返回对流本身的引用,如下所示:

    class Stream {
       public Stream Out (object obj) { 
          ... code to output obj ...
          return this; 
       }
    }
    

    然后,可以在链接模式下使用这个out调用:

    Stream S = new Stream (...);
    S.Out (A). Out (B). Out (C);
    
        4
  •  5
  •   Marc Gravell    15 年前

    除了“字段消除歧义”和“传递当前Istance的引用”答案(已给出),还有一个附加场景,其中 this 是必需的;要在当前实例上调用扩展方法(我忽略了 在里面 宣告 一种扩展方法,因为它与问题的含义不完全相同):

    class Foo
    {
        public void Bar()
        {
            this.ExtnMethod(); // fine
            ExtnMethod(); // compile error
        }
    }
    static class FooExt
    {
        public static void ExtnMethod(this Foo foo) {}
    }
    

    公平地说,这不是常见的情况。更可能的方法是简单地提高代码的可读性,例如:

    public bool Equals(Foo other) {
        return other != null && this.X == other.X && this.Y == other.Y;
    }
    

    在上面(或类似的 Compare , Clone 等等),没有 this. 我觉得有点……”“不平衡”。

        5
  •  4
  •   Matt Davis    15 年前

    在大多数情况下,使用 this 只是把代码弄乱了。不过,我见过其他程序员使用它,可能是为了触发本地类成员的IntelliSense。

    这个 在扩展方法中使用关键字也是必需的。

    public static class MyExtensions
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }  
    
        6
  •  4
  •   Will Vousden    15 年前

    首先,您的示例是有缺陷的,因为您已经将类标记为静态的,所以它不能被实例化。

    无论如何, this 只是对当前实例的引用。它可以用来解决局部变量和成员变量之间的冲突,例如:

    public class Foo
    {
        private string baz;
    
        public void Bar(string baz)
        {
            this.baz = baz;
        }
    }
    

    它也可以简单地作为一个对象来使用,例如:

    public class Foo
    {
        public List<Foo> GetList(string baz)
        {
            var list = new List<Foo>();
            list.Add(this);
    
            return list;
        }
    }
    

    (不是说这个例子特别有用,但你知道这个想法。)

    编辑: 更现实的例子是.NET中的事件模型:

    public class Foo
    {
        public EventHandler SomeEvent;
    
        public void Bar()
        {
            if (SomeEvent != null)
            {
                SomeEvent(this, EventArgs.Empty);
            }
        }
    }
    
        7
  •  4
  •   Arjan Einbu    15 年前

    你需要 this 如果方法参数与字段同名。

    private string variablename;
    private void SomeMethod(string variablename)
    {
        this.variablename = variablename+variablename;
        return this.variablename;
    }
    
        8
  •  3
  •   Kris Krause    15 年前

    我首先想到的是可读性和/或个人偏好。

    有时当我在一个相当大的班级工作时…或者一个带有基类的类(在这里我看不到一些变量)。我用这个关键词…至少对于Visual Studio中的IntelliSense。

        9
  •  3
  •   M. Ryan    15 年前

    除了可能的javascript之外,“this”主要是一个占位符关键字,最有用的是在编写一段代码时使您的意图变得明显。

    基本上,它将有助于可读性。

        10
  •  3
  •   Yuriy Faktorovich    15 年前
    1. this 表示当前类实例成员不是
      A.你的基层成员
      B.范围成员
      c.静态构件
    2. 使代码更可读。
        11
  •  3
  •   Seva Alekseyev    15 年前

    首先, 当类方法需要将对对象的引用传递给另一个类中的某个方法时是必需的。

    例如:

    class Image
    {
        void Refresh()
        {
            Screen.DrawImage(this);
        }
    }
    

    与其他一些使用或不使用“this”的场景不同,它是一种风格问题,或解决人为模糊性的方法。

        12
  •  2
  •   Ed Altorfer    15 年前

    我尊重地不同意其他一些海报。在C中,这不仅仅是一个品味问题,它还符合微软的C风格指导原则(内部和外部,尽管他们似乎不符合自己的指导原则)。

    例如,当您使用的符号不起作用时:

    private void DoSomething(object input) 
    { 
        input = input; 
    } 
    

    相反,您需要使用以下符号:

    private void DoSomething(object input) 
    { 
        this.input = input; 
    } 
    
        13
  •  2
  •   Arjan Einbu    15 年前

    this 引用类的实例,并在示例中向我们展示:使用 引用调用的字段 variablename .

    如果您有一个同名的局部变量或参数,那么您需要有一种区分它们的方法。那样的话 将引用字段,而不是使用 引用局部变量或参数。

    您应该有一个命名约定来帮助您区分字段和本地变量。如果您以后在方法中添加一个同名的本地变量,这将使您免受可能发生的问题的影响。(因为代码没有 然后会断开……)

        14
  •  0
  •   Eric Minkes    15 年前

    常用于具有相同名称的构造函数参数:

    public SomeClass(string variablename)
    {
       this.variablename = variablename;
    }
    
        15
  •  0
  •   cjk    15 年前

    它主要是一个风格问题。如果您的方法有一个与私有类成员相同的变量名,那么使用它有助于消除歧义。这有可能防止愚蠢的错误。

        16
  •  0
  •   George Polevoy    15 年前

    1)首先,也是最重要的,是当一个对象需要传递对其自身的引用时:

    public class Element{
    //...
    public Element Parent;
    public Element Root()
    {
     if( Parent == null )
      return this;
     return Parent.Root();
    }
    }
    public void OnEvent()
    {
     Event(this, new EventArgs());
    }
    

    在Fluent界面中:

    公共类查询{ 公共查询添加(参数参数)列表.添加(参数);返回此; }

    2)二次进展法:

    public class Extension
    {
     public Element Root(this Element element) {
      if( element.Parent == null )
       return element;
      return element.Parent.Root();
     }
    }
    

    3)第三,你真的不需要它来区分参数和类成员。 您不需要它,因为良好的编码约定可以避免使用“this”关键字。

    public class Element
    {
     public Element Parent;
     publlc void SetParent(Element parent)
     {
       // this.Parent = parent; // see, you don't need it
       Parent = parent;
     }
    }
    //...
    public class Element
    {
     public Element _parent;
     public Element Parent { get { return _parent; } }
     publlc void SetParent(Element parent)
     {
       // this._parent = parent; // see, you don't need it
       _parent = parent;
     }
    }
    
        17
  •  0
  •   Matt J.    15 年前

    有一个原则可以指导您决定是否使用“this”。您需要具体地引用这个类的实例吗?如果你这样做了,那就用“这个”。否则,就把它忘了。

    记录器示例提供的另一个海报就是一个很好的例子。因为他需要物体本身,所以他不能依赖于一个隐含的事实。

    在类本身中,使用“this”作为类本身的方法的前缀是没有意义的,因为它是隐式的。

        18
  •  0
  •   Andrei Rînea    14 年前

    我忍不住…

    if (this == null)
        throw new NullReferenceException();
    

    [孩子们!!!!]

        19
  •  0
  •   Velocoder    13 年前

    我已经找到另一个场景:

    private int value;
    public int Value
    {
        get { return this.value; }
        set { this.value = value; } //without this it doesn't make sense
    }