• 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.

  • 相关阅读:
    CodeForces 510C Fox And Names (拓扑排序)
    Codeforces 1153D Serval and Rooted Tree (简单树形DP)
    HDU 6437 Problem L.Videos (最大费用)【费用流】
    Luogu P3381 (模板题) 最小费用最大流
    Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses (并查集+分组背包)
    Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)
    HDU 2204 Eddy's 爱好 (容斥原理)
    Codeforces 939E Maximize! (三分 || 尺取)
    Codeforces 938D. Buy a Ticket (最短路+建图)
    CodeForces 959E Mahmoud and Ehab and the xor-MST (MST+找规律)
  • 原文地址:https://www.cnblogs.com/kekelele/p/14419462.html
Copyright © 2020-2023  润新知