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