zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    【Eclipse】怎样把代码复制到word中并保持颜色
    windows下配置gvim
    这是给开发者的弥天大谎还是至理名言?
    Linux中常用软件安装(基于Ubuntu)
    MyEclipse 9.1优化技巧
    【数据库复习】函数依赖
    Windows下使用Flex入门
    【数据库复习】SQL
    浏览器中的“Linux”
    Unity开发原则
  • 原文地址:https://www.cnblogs.com/kekelele/p/14419462.html
Copyright © 2011-2022 走看看