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

posted @ 2021-02-22 16:17  未闻花开  阅读(471)  评论(0编辑  收藏  举报