目录
构造函数用来创建对象,并且可以在构造函数中对此对象进行初始化。构造函数具有与类相同的名称,它通常用来初始化对象的数据成员。
C#中构造函是在创建给定类型的对象时执行的类方法。构造函数是一个特殊的方法,无论什么时候,只要使用new运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。除非类是静态的,否则C#编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。在new实例化类的过程中,会执行类内对应的构造函数进行初始化,若无构造函数的,则会自动调用无参默认构造函数,静态构造函数会在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类。
构造函数的分类可以为:实例构造函数、静态构造函数、私有构造函数
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace ConsoleApp1
- {
- class Program
- {
- static void Main(string[] args)
- {
- student st = new student(10, "lihua") { ID = 10, number = 5 };
- //构造函数可以在实例化过程中初始化私有的属性,{ }大括号可以初始化公有属性的数据
- st.ccn();
- st.Info();
- Console.Read();
- }
- }
- public class student
- {
- private string name;
- private int age;
- public int ID;
- public int number;
- public student()
- {
-
- }
- public student(int age,string name)
- {
- this.age = age;
- this.name = name;
- }
- public void ccn()
- {
- Console.WriteLine("该学生的名字为:"+name+" "+"年龄为:"+age);
- }
- public void Info()
- {
- Console.WriteLine("该学生的学号为:" + ID + " " + "名次为:" + number);
- }
- }
- }
-
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace _2022_07_19
- {
- class Student
- {
- public Student(string name, int age, char gender, int id)
- {
- this.Name = name;
- this.Age = age;
- this.Gender = gender;
- this.Id = id;
- }
- public string Name;
- public int Age;
- public char Gender;
- public int Id;
-
- public Student(string name, int age, char gender)
- {
- this.Name = name;
- this.Age = age;
- this.Gender = gender;
- }
- public void SayHello1()
- {
- Console.WriteLine("我叫{0},我今年{1},我是{2}生,我的学号是{3}。",Name,Age,Gender,Id);
-
- }
- public void SayHello2()
- {
- Console.WriteLine("我叫{0},我今年{1},我是{2}生。", Name, Age, Gender);
- }
- }
- }
注意:1、定义了有参构造函数,则不能再使用无参默认构造函数,也就是在new实例化的时候必须在构造函数内传入参数。
2、构造函数可以重载,在定义了有参构造函数后可以重写一个无参构造函数,就可以使用无参构造函数了,否则将报错。
在C#中,可以为类定义静态构造函数,这种构造函数只执行一次。编写静态构造函数的主要原因是类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段或属性。在定义静态构造函数时,不能设置访问修饰符,因为其他C#代码从来不会调用它,它只在引用类之前执行一次;另外,静态构造函数不能带任何参数,而且一个类中只能有一个静态构造函数,它只能访问静态成员,不能访问实例成员。 在类中,静态构造函数和无参数的实例构造函数是可以共存的,因为静态构造函数是在加载类时执行的,而无参数的实例构造函数是在创建类的对象时执行的。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace ConsoleApp1
- {
- class Program
- {
- static void Main(string[] args)
- {
- student st = new student(10, "lihua") { ID = 10, number = 5 };
- st.ccn();
- st.Info();
- Console.Read();
- }
- }
- public class student
- {
- private string name;
- private int age;
- public int ID;
- public int number;
- public student()
- {
-
- }
- static student()
- {
- Console.WriteLine("这里是静态构造函数");
- }
- public student(int age,string name)
- {
- this.age = age;
- this.name = name;
- }
- public void ccn()
- {
- Console.WriteLine("该学生的名字为:"+name+" "+"年龄为:"+age);
- }
- public void Info()
- {
- Console.WriteLine("该学生的学号为:" + ID + " " + "名次为:" + number);
- }
- }
- }
-
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace ConsoleApp2
- {
- class Program
- {
- public static int X = 0;//静态变量
- //实例构造函数
- public Program()
- {
- X = 1;
- }
- //静态构造函数
- static Program()
- {
- X = 2;//第二步,执行静态构造函数
- }
- //第一步,程序入口Main最先执行,然后执行静态变量public static int X = 0
- static void Main(string[] args)
- {
- Console.WriteLine(X);//结果为2
- Program dd = new Program();//第三步,执行构造函数
- Console.WriteLine(X);//结果为1
- Console.ReadLine();
- }
- }
- }
调用类的静态函数时的执行顺序:
那么调用类的实例函数时的执行顺序则是:
私有构造函数是一种特殊的实例构造函数。 它通常只在包含静态成员的类中。 如果类具有一个或多个私有构造函数而没有公共构造函数,则在其他类(除嵌套类外)中无法进行实例化。
-
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace ConsoleApp2
- {
- class Program
- {
- int i = 0;
- private Program()
- {
- i = 9;
- }
- static void Main(string[] args)
- {
- Program ss = new Program();
- Console.WriteLine($"i={ss.i}");//运行结果:i=9
- Console.ReadLine();
- }
- }
- class person
- {
- //Program ddd = new Program();//注释打开会报错,错误信息:不可访问,因为它受保护级别限制。因为私有构造函数无法在类的外面实例化。
- }
参考文献: