C#构造函数(超详解,建议收藏)
⽬录:
⼀、构造函数的定义
C#中构造函数是在创建给定类型的对象时执⾏的类⽅法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。不带参数的构造函数称为“默认构造函数”。 ⽆论什么时候,只要使⽤new运算符实例化对象,并且不为 new 提供任何参数,就会调⽤默认构造函数。除⾮类是静态的,否则C#编译器将为⽆构造函数的类提供⼀个公共的默认构造函数,以便该类可以实例化。默认构造函数:public 类名(){}
构造函数可分为:实例构造函数,静态构造函数,私有构造函数(下⾯会详细介绍)
⼆、构造函数时的注意事项
构造函数没有返回值(void也不需要)
⼀个类中可以有多个构造函数,可根据其参数个数,参数顺序,参数类型的不同来区分它们,这称作构造函数的重载
构造函数的命名必须和类名相同
调⽤⼦类的构造函数时会先调⽤⽗类的⽆参构造函数
通常使⽤构造函数来进⾏类中字段的赋初值
构造函数不能直接被调⽤,必须通过关键字new在创建对象时⾃动调⽤
当⼀个类没有定义任何构造函数时,C#编译器会⾃动为其⽣成⼀个默认的隐式⽆参构造函数
如果⼀个类中定义了有参构造函数,实例化时需要调⽤⽆参构造函数,这时我们就必须定义⼀个显式⽆参数构造函数,否则运⾏会报错
三、构造函数与⼀般函数的区别
1.声明⽅式不同
构造函数:
[访问修饰符] 类名(参数列表){函数主体}
⼀般函数:
[访问修饰符] 返回类型⽅法名(参数列表){函数主体}
2.调⽤⽅式不同
构造函数:在类实例化时调⽤
⼀般函数:在类实例化后,必须⼿动调⽤
四、构造函数的作⽤
当需要给⼀个类中的字段进⾏初始化时,第⼀种:实例化后⼿动给属性赋值;第⼆种实例化时直接把参数放进去⾃动给属性赋值,显然第⼆种简单省事。下来我们⼀起看看两种⽅法:
第⼀种:
Student stu =new Student();
stu.Id =1807;
stu.Name ="王⿇⼦";
stu.Sex ="男";
stu.Score =88.6;
Console.WriteLine($"学号:{stu.Id}-姓名{stu.Name}-性别:{stu.Sex}-成绩{stu.Score}");
Console.ReadLine();
}
}
class Student
{
public int Id {get;set;}
public string Name {get;set;}
public string Sex {get;set;}
public double Score {get;set;}
}
第⼆种:
class Program
{
static void Main(string[] args)
{
Student stu1 =new Student();//⽆参构造函数调⽤
Student stu =new Student(1807,"王⿇⼦","男",88.6);
Console.WriteLine("学号:{0}-姓名{1}-性别:{2}-成绩{3}",stu.Id,stu.Name,stu.Sex,stu.Score);
Console.ReadLine();
}
}
class Student
{
public int Id {get;set;}
public string Name {get;set;}
public string Sex {get;set;}
public double Score {get;set;}
//⽆参构造函数
public Student()
{
Console.WriteLine("⽆参构造函数被调⽤");
}
/
/有参构造函数
public Student(int id,string name,string sex,double score){
this.Id=id;
this.Name = name;
this.Sex = sex;
this.Score = score;
}
}
五、实例构造函数
构造函数的名字与类名相同
使⽤new表达式创建类的对象时,会调⽤其构造函数。并且通常初始化新对象的数据成员。
除⾮类是静态的,否则会为没有构造函数的类,⾃动⽣成⼀个默认构造函数,并使⽤默认值来初始化对象字段。
构造函数可以有参数,可以以参数个数、参数类型、参数顺序不同的形式存在多个构造函数。
Student stu1 =new Student();//⽆参构造函数调⽤
Student stu2 =new Student(10,"20");
Console.WriteLine($"X={stu1.X}---Y={stu1.Y}");//结果为:X=0---Y=0
Console.WriteLine($"X={stu2.X}---Y={stu2.Y}");//结果为:X=10---Y=20
Console.ReadLine();
}
}
class Student
{
public int X {get;set;}
public string Y {get;set;}
//⽆参构造函数
public Student()
{
this.X =0;
this.Y ="0";
}
writeline函数//有两个参数构造函数
public Student(int x,string y){
this.X = x;
this.Y = y;
}
}
六、静态构造函数
静态构造函数不使⽤访问修饰符或不具有参数。
在创建第⼀个实例或引⽤任何静态成员之前,将⾃动调⽤静态构造函数以初始化类。
不能直接调⽤静态构造函数。
⽆法控制在程序中执⾏静态构造函数的时间。
静态构造函数的⼀种典型⽤法是在类使⽤⽇志⽂件且将构造函数⽤于将条⽬写⼊到此⽂件中时使⽤。
静态构造函数对于创建⾮托管代码的包装类也⾮常有⽤,这种情况下构造函数可调⽤ LoadLibrary ⽅法。
如果静态构造函数引发异常,运⾏时将不会再次调⽤该函数,并且类型在程序运⾏所在的应⽤程序域的⽣存期内将保持未初始化。
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();
}
}
调⽤类的静态函数时的执⾏顺序:
静态变量==>静态构造函数==>实例构造函数
静态变量==>静态构造函数==>静态函数
那么调⽤类的实例函数时的执⾏顺序则是:
⾮静态变量==>实例构造函数==>实例函数
七、私有构造函数
私有构造函数是⼀种特殊的实例构造函数。 它通常只在包含静态成员的类中。 如果类具有⼀个或多个私有构造函数⽽没有公共构造函数,则在其他类(除嵌套类外)中⽆法进⾏实例化。
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();//注释打开会报错,错误信息:不可访问,因为它受保护级别限制。因为私有构造函数⽆法在类的外⾯实例化。
}
觉得博主写的还可以,就点个赞再⾛嗷

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。