this 关键字

什么是 this 关键字

在 C# 中,this 关键字代表当前对象的实例。当一个类被实例化后,一个对象就被创建了。该对象包含了该类的所有属性和方法。this 关键字可以用来引用当前对象的属性和方法,以及传递当前对象给其他方法。

  1. 引用当前对象的属性和方法

    当一个方法或构造函数需要引用当前对象的属性和方法时,可以使用 this 关键字。

    class Person {
        private string name;
    
        public Person(string name) {
            this.name = name;
        }
    
        public void SayHello() {
            Console.WriteLine("Hello, my name is " + this.name);
        }
    }
    

    在上面的例子中,构造函数使用 this 关键字来引用当前对象的 name 属性,并将传入的参数赋值给该属性。SayHello 方法也使用 this 关键字来引用当前对象的 name 属性。

  2. 传递当前对象给其他方法

    有时候,需要将当前对象传递给其他方法,以便在该方法中可以引用当前对象的属性和方法。在这种情况下,可以使用 this 关键字来传递当前对象。

    class Person {
        private string name;
    
        public Person(string name) {
            this.name = name;
        }
    
        public void SayHello() {
            Console.WriteLine("Hello, my name is " + this.name);
            this.SaySomething();
        }
    
        private void SaySomething() {
            Console.WriteLine("Something!");
        }
    }
    

    在上面的例子中,SayHello 方法使用 this 关键字来调用当前对象的 SaySomething 方法。

  3. 指定当前对象的实例

    在某些情况下,需要在类中创建一个新的对象实例。可以使用 this 关键字来指定当前对象的实例。

    class Person {
        private string name;
    
        public Person(string name) {
            this.name = name;
        }
    
        public Person CreateNewPerson() {
            Person newPerson = new Person("New Person");
            return newPerson;
        }
    }
    

    在上面的例子中,CreateNewPerson 方法使用 this 关键字来指定当前对象的实例,并创建一个新的 Person 对象。

  4. 区分局部变量和成员变量

    在一个类中,可能会有多个具有相同名称的变量,一个是类的成员变量,另一个是方法或构造函数中的局部变量。使用 this 关键字可以帮助我们区分这两种变量,从而避免命名冲突。

    public class Person
    {
        private string name;
    
        public Person(string name)
        {
            // 使用 this 关键字区分成员变量和局部变量
            this.name = name;
        }
    }
    

    在上面的例子中,通过使用 this 关键字,我们可以区分成员变量 name 和构造函数中的参数 name,从而将参数值赋值给成员变量。

  5. 作为参数传递当前对象

    在某些情况下,我们需要将当前对象作为参数传递给另一个方法。此时,可以使用 this 关键字来传递当前对象。

    public class Person
    {
        private string name;
    
        public Person(string name)
        {
            this.name = name;
        }
    
        public void PrintName()
        {
            Print(this);
        }
    
        private void Print(Person person)
        {
            Console.WriteLine(person.name);
        }
    }
    

    在上面的例子中,PrintName 方法使用 this 关键字将当前对象传递给 Print 方法,从而输出当前对象的名字。

代码示例

  1. 用 this 关键字指代类的当前实例

    using System;
    
    namespace ThisKeyword
    {
        class Test
        {
            int num;
            Test(int num)
            {
                // this.num 指向类的当前实例的 num 字段
                this.num = num;
            }
    
            public void Print()
            {
                Console.WriteLine("The value of num is {0}", this.num);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Test t1 = new Test(10);
                t1.Print();
    
                // Output: The value of num is 10
            }
        }
    }
    

    在上面的代码中,this.num 指代类的当前实例的 num 字段。 this 关键字可以用来指代类的当前实例。

  2. 用 this 关键字区分方法参数和类字段。

    using System;
    
    namespace ThisKeyword
    {
        class Student
        {
            int id;
            string name;
    
            Student(int id, string name)
            {
                // 如果它们有相同的名称,使用 this 关键字来区分 类字段 和 构造函数参数
                this.id = id;
                this.name = name;
            }
    
            public void Print()
            {
                Console.WriteLine("Student ID: {0}, Name: {1}", this.id, this.name);
            }
        }
    
        class Program
        {
           static void Main(string[] args)
           {
               Student s1 = new Student(101, "Alice");
               s1.Print();
    
               // Output: Student ID: 101, Name: Alice
           }
       }
    }
    
  3. 用 this 关键字从一个构造函数调用另一个构造函数。

    using System;
    
    namespace ThisKeyword
    {
       class Rectangle
       {
          int length;
          int breadth;
    
          Rectangle()
          {
             length = 10;
             breadth = 5;
          }
    
          /// <summary>
          /// `Rectangle(int l)` 构造函数中 `this()` 关键字 调用了 `Rectangle()` 构造函数
          /// </summary>
          Rectangle(int l) :this()
          {
             length = l;
          }
    
          /// <summary>
          /// `Rectangle(int l,int b)` 构造函数中 `this(l)` 关键字 调用了 `Rectangle(int l)` 构造函数
          /// </summary>
          Rectangle(int l,int b) :this(l)
          {
             breadth = b;
          }
    
         public void Print()
         {
             Console.WriteLine("Length: {0}, Breadth: {1}", length, breadth);
         }
       }
    
       class Program
       {
         static void Main(string[] args)
         {
           Rectangle r1 = new Rectangle();
           r1.Print();
    
           // Output: Length: 10, Breadth: 5
    
           Rectangle r2 = new Rectangle(20);
           r2.Print();
    
           // Output: Length: 20, Breadth: 5
    
           Rectangle r3 = new Rectangle(30,15);
           r3.Print();
    
           // Output: Length: 30, Breadth: 15
    
         }
       }
    }