C# 中的 base和this

     某天看代码的时候,突然发现了这样的一句话:

 

  完全不知道this在这里的作用和意义。借此,一起捋一下 this和base的使用和区别。

  首先,base和this 在C#中都被定义为访问关键字:

base(C# 参考)

访问基类的成员。

base 关键字用于从派生类中访问基类的成员:

  • 调用基类上已被其他方法重写的方法。

  • 指定创建派生类实例时应调用的基类构造函数。

仅允许基类访问在构造函数、实例方法或实例属性访问器中进行。

从静态方法中使用 base 关键字是错误的。

所访问的基类是类声明中指定的基类。 例如,如果指定 class ClassB : ClassA,则从 ClassB 访问 ClassA 的成员,而不考虑 ClassA 的基类。

Q:根据上面的描述,我们在此提一个问题:在多层继承的情况下,生成最外层的实例的时候,实例化过程应该是怎么样的顺序呢?

 

this(C# 参考)

引用类的当前实例。

this 关键字指代类的当前实例,还可用作扩展方法的第一个参数的修饰符。

以下是 this 的常见用法:(此处不包含this的扩展方法!)

  • 限定类似名称隐藏的成员,例如:

    public class Employee
    {
        private string alias;
        private string name;
    
        public Employee(string name, string alias)
        {
           
            this.name = name;
            this.alias = alias;
        }
    }
    
  • 将对象作为参数传递给方法,例如:

    CalcTax(this);
    
  • 声明索引器,例如:

    public int this[int param]
    {
        get { return array[param]; }
        set { array[param] = value; }
    }
  • 注:静态成员函数,因为它们存在于类级别且不属于对象,不具有 this 指针。 在静态方法中引用 this 会生成错误。      

总结

1.this 用于当前类内,base用于派生类中

2.实例化过程首先要先实例化其基类,并且依此类推,一直到实例化System.Object为止。例如:

 

 //第一级
 public class One
    {
        public One()
        {
            Console.WriteLine("这是第一级");
        }

        public One(string name)
        {
            Console.WriteLine($"这是第一级,带有name参数的构造函数{name}");
        }

        public virtual void Show()
        {
            Console.WriteLine("这是第一级的show方法");
        }

    }
//第二级
    public class Two : One
    {
        public Two()
        {
            Console.WriteLine("这是第二级");
        }

        public Two(string name):this()
        {
            Console.WriteLine($"这是第二级的带有name参数的构造函数{name}");
        }

        public override void Show()
        {
            Console.WriteLine("这是第二级的show方法");
        }
    }
//第三级
    public class Three : Two
    {
        public Three()
        {
            Console.WriteLine("这是第三级");
        }

        public Three(string name) : base(name)
        {
            Console.WriteLine($"这是第三级的带有name参数的构造函数:{name}");
        }

        public override void Show()
        {
            base.Show();
            Console.WriteLine("这是第三级的show方法");
        }
    }
//调用测试 class Program { static void Main(string[] args) { var test = new Three("测试"); Console.ReadKey(); } }

执行结果:

 

 可以复制以上代码,自己运行一下看看,基本就都了解了。

以上,over.

posted @ 2021-02-20 17:54  keke..lele  阅读(665)  评论(0编辑  收藏  举报