• C# 构造函数初始化器 this base


    1 this 

    指的是这个对象本身,用于:

    (1) 在定义类时,写this. 后vs会出现这个类的非静态成员;

    (2) 一般在构造函数中使用,区分字段和局部变量;

    (3) 用作构造函数初始化器,用于在一个构造函数中调用另一个构造函数;这个关键字指定在调用的构造函数前,.NET 实例化过程对当前类使用非默认的构造函数。

    class Person
    {
        private string _name;
        private int _age;
        public Person(string name)
        {
            this._name = name;
        }
        public Person(string name,int age):this(name)
        {
            this._age = age;
        }   
        public virtual void Foo()
        {
            Console.WriteLine("Foo");
        }
    }

    2 base

    指的是父类对象,在子类中使用base,调用父类的成员;

    (1) 子类调用父类的构造函数;

    (2) 在子类中调用父类的方法与成员;

    class Chinese : Person
    {
        public Chinese(string name): base(name){}
        public override void Foo()
        {
            base.Foo();
            Console.WriteLine("再调用子类方法");
        }
    }

    3 构造函数的执行序列

    • 构造函数初始化器在构造函数的函数体之前执行。var myChinese = new Person("name", 25);是先调用一个参数的构造函数再调用2个函数的。
    • 为了实例化派生的类,必须先实例化它的基类;要实例化基类,必须实例化这个基类的基类,一直到实例化System.Object为止。结果是无论使用什么构造函数实例化个类,总是首先调用System.Object.Object()。
    • 无论在派生类上使用什么构造函数(默认的构造函数或非默认的构造函数),除非明确指定,否则就使用基类的默认构造的数。
    public class MyBaseClass
        {
            public MyBaseClass() { }
            public MyBaseClass(int i) { }
        }
     
        public class MyDerivedClass : MyBaseClass
        {
            public MyDerivedClass() { }
            public MyDerivedClass(int i) { }
            public MyDerivedClass(int i, int j) { }
        }

    (1) MyDerivedClass myobj = new MyDerivedClass();执行顺序:

    • 执行 System.Object.Object() 构造函数
    • 执行 MyBaseClass.MyBaseClass() 构造函数
    • 执行 MyDerivedClass.MyDerivedClass() 构造函数

    (2) MyDerivedClass myobj = new MyDerivedClass(1);

    • 执行 System.Object.Object() 构造函数执行
    • MyBaseClass.MyBaseClass() 构造函数执行
    • MyDerivedClass.MyDerivedClass(int i) 构造函数

    (3) 有时需要对发生的事件进行更多的控制。例如,在上面的实例化示例中,可能想得到如下所示的执行顺序:

    • 执行 System.Object.Object() 构造函数执行
    • MyBaseClass.MyBaseClass(int i) 构造函数执行
    • MyDerivedClass.MyDerivedClass(int i,int j) 构造函数

    使用这个顺序,可以把使把 int i参数的代码放在MyBaseClass(int i)中,即MyDerivedClass(int i ,int j) 构造函数要做的工作比较少,只需要处理int j参数(假定 int i 参数在两种情况下含义相同)

    为此,只需使用构造的数初始化器,它把代码放在方法定义的冒号后面。例如,可以在派生类的构造函数定义中指定所使用的基类构造函数。

    public class MyDerivedClass : MyBaseClass
    {
        public MyDerivedClass() { }
        public MyDerivedClass(int i) { }
        public MyDerivedClass(int i, int j):base(i) { }
    }

    其中,base关键字指定.NET实例化过程使用基类中具有指定参数的构造函数。这里使用了一个int参数(其值通过参数i 传送给MyDerivedClass构造函数),所以将使用MyBaseClass(int i)。这么做将不会调用MyBaseClass()。

     4 初始化器

    using System;
    
    namespace 初始化器
    {
        class Program
        {
            static void Main(string[] args)
            {
                //1. 常见的初始化方式,将类实例化,并通过构造函数将参数传递进类中,此方式通过 public StudentName(string first, string last)生效
                var student1 = new StudentName("Meimei", "Wang");
    
                //2. 没有小括号,直接通过大括号调用类的属性,并将赋值,此即为对象的初始化器,此方式通过 public StudentName() { }
                var student2 = new StudentName { FirstName = "Meimei", LastName = "Wang" };
    
                //3. 初始化器也就是默认的构造函数,因而可以用来对任意公共属性进行操作,而指定的构造函数指定按照类中指定的结构进行操作
                var student3 = new StudentName { ID = 5 };  //student3 = new StudentName(100) 这是错误的
    
                //4. 另外构造函数和初始化器可以一起使用
                var student4 = new StudentName("Lei", "Li") { ID = 122 };
    
                Console.WriteLine(student1.ToString());
                Console.WriteLine(student2.ToString());
                Console.WriteLine(student3.ToString());
                Console.WriteLine(student4.ToString());
                Console.ReadKey();
            }
        }
    
        public class StudentName
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int ID { get; set; }
    
            public StudentName() { }    //初始化器,其实也就是默认的构造函数
    
            public StudentName(string first, string last)  //该类构造函数
            {
                FirstName = first;
                LastName = last;
            }
    
            public override string ToString()
            {
                return FirstName + " " + ID;
            }
        }
    }

    转载自:

    https://blog.csdn.net/weixin_41707267/article/details/84206254?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&dist_request_id=394fc46a-98a8-4368-a4fb-2f911e2da608&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

    https://blog.csdn.net/qq_34344665/article/details/82847035

    https://www.cnblogs.com/ahoka/p/12380078.html

  • 相关阅读:
    我爬取了爬虫岗位薪资,分析后发现爬虫真香
    红薯,撑起父亲的快乐,让我揪心
    跨域问题服务端解决办法 Request header field Authorization is not allowed by Access-Control-Allow-Headers
    antdvue2.x 使用阿里iconfont自定义组件iconfont
    前端 crypto-js aes 加解密
    jsencrypt加密解密字符串
    CryptoJS base64使用方法
    客户端js生成rsa 密钥对
    js动态添加style样式
    PHP 使用非对称加密算法(RSA)
  • 原文地址:https://www.cnblogs.com/straight/p/14430971.html
Copyright © 2020-2023  润新知