(二十六)C#编程基础复习——构造函数
特此声明:本教程内容可能有部分参照其他博主的观点或描述,但始终不影响我学习的热情,代码全部自己手工敲打,编辑此教程目的不是为了博取大家眼球,也不是为利益所驱,只是纯属为了方便自己学习,编辑的过程中也让自己加深了对C#各个基础的印象,同时也让自己编码过程更加流畅顺利,最后还能帮助到有需要的人,代码都是自己亲测有效,如有侵权可以联系本人删除。
在C#中,构造函数就是与类(或结构体)具有相同名称的成员函数,它在类中的地位比较特殊,不需要我们主动调用,当创建一个类的对象时会自动调用类中的构造函数。在程序开发的过程中,我们通常使用类中的构造函数来初始化类中的成员属性。
C#中的构造函数有三种:
- 实例构造函数;
- 静态构造函数;
- 私有构造函数;
一、实例构造函数
构造函数时类中特殊的成员函数,它的名称与它所在类的名称相同,并且没有返回值。当我们使用New关键字创建类的对象时,可以使用实例构造函数来创建和初始化类中的任意成员属性。
实例代码如下:
public class Person
{
private string name;
private int age;
public Person(string n, int a)
{
name = n;
age = a;
}
}
只要创建Person类的对象,就会调用类中的实例构造函数,我们只需要在实例化对象时将具体的值传递给类中的构造函数即可,如下:
Person P=new Person("张三",18)
如果没有为类显式的创建构造函数,那么C#将会为这个类隐式的创建一个没有参数的构造函数(无参数构造函数),这个无参的构造函数构造函数会在实例化对象时为类中的成员属性设置默认值(关于C#中类型的默认值大家可以查阅《数据类型》一节)。在结构体中也是如此,如果没有为结构体创建构造函数,那么C#将隐式的创建一个无参数的构造函数,用来将每个字段初始化为其默认值。
若要初始化静态类或非静态类中的静态属性,则需要使用下面将要介绍的静态构造函数。
二、静态构造函数
静态构造函数用于初始化类中的静态数据或执行仅需执行一次的特定操作。静态构造函数将在创建第一个实例或应用类中的静态成员之前自动调用。
静态构造函数具有以下特性:
- 静态构造函数不使用访问权限修饰符修饰或不具有参数;
- 类或结构体中只能具有一个静态构造函数;
- 静态构造函数不能直接调用,仅可以由公共语言运行时(CLR)调用;
- 用户无法控制程序中静态构造函数的执行时间;
- 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类;
- 静态构造函数会在实例构造函数之前运行。
namespace _015
{
internal class Demo
{
public static int num = 0;//构造函数
Demo()
{
num = 1;
}
//静态构造函数
static Demo()
{
num = 2;
}
static void Main(string[] args)
{
Console.WriteLine("num={0}",num);
Demo Obj = new Demo();
Console.WriteLine("num={0}",num);
Console.Read();
}
}
}
运行结果:
当执行上面程序时,会首先执行public static int num=0
,接着执行类中的静态构造函数,此时num=2,然后执行Main函数里面的内容,此时打印num的值为2,接着初始化Demo类,这时会执行类中的构造函数,此时num会重新赋值为1。
三、私有构造函数
私有构造函数是一种特殊的实例构造函数,通常用在只包含静态成员的类中。如果一个类中具有一个或多个私有构造函数而没有公共构造函数的话,那么其他类(除嵌套类外)则无法创建该类的实例。例如:
clas Nlog
{
//私有构造函数
private Nlog()
{
}
public static double c=Math.E;
}
上例中定义了一个空的私有构造函数,这么做的好处就是空构造函数可组织自动生成无参数构造函数。需要注意的是,如果不对构造函数使用访问权限修饰符,则默认它为私有构造函数。
示例代码如下:
namespace _015
{
public class Student
{
private Student() { }
public static int id;
public static string name;
public static void Display()
{
Console.WriteLine("姓名:"+name+"编号:"+id);
}
}
internal class Demo
{
static void Main(string[] args)
{
Student.id = 101;
Student.name = "张三";
Student.Display();
Console.ReadKey();
}
}
}
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了