构造函数的作用:主要用于创建类的实例对象(初始化对象,给属性中的每个值依次赋值)。当调用构造函数创建一个对象时,构造函数会为对象分配内存空间,并初始化类的成员。构造函数分为实例构造函数和静态构造函数两种。
实例构造函数
实例构造函数用于创建和初始化类的实例。使用new运算符创建对象的过程,其实就是在调用实例构造函数,来初始化类中的所有实例成员。
构造函数特点:
1、构造函数是一个特殊的方法,不允许有返回类型,连void也不能写。
2、构造函数的名称必须跟类名一致。
3、创建对象的时候会执行构造函数。
4、构造函数可以有参数,new对象的时候传递函数参数即可。
5、构造函数可以进行方法重载。实现了方法重载,就可以通过不同的方式来完成类的实例化。
6、如果没有为类显式地定义一个构造函数,则C#编译器会自动生成一个函数体为空的默认无参的实例构造函数。当你显式地定义了一个新的构造函数之后,不管是有参数的还是无参数的,C#编译器都不会再自动生成那个函数体为空默认无参的构造函数了,所以如果需要无参的构造函数,则需要自己来定义。
7、可以对实例构造函数指定访问级别,即可以使用public、protected和private修饰符来修饰。
代码示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { class Person { public string Name { get; set; } public char Sex { get; set; } public int Age { get; set; } public Person() //定义一个无参数的构造函数 { this.Name = "张三"; this.Sex = '男'; this.Age = 22; } public Person(string name,char sex,int age) //定义一个有参数的构造函数 { this.Name = name; this.Sex = sex; this.Age = age; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { class Program { static void Main(string[] args) { //new关键字帮我们做了三件事:(1)在内存中开辟一块空间 (2)在开辟的空间中创建对象 (3)调用对象的构造函数,进行初始化对象 //创建对象的时候会执行构造函数 Person p1 = new Person(); Person p2 = new Person("王燕",'女',18); Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", p1.Name, p1.Sex, p1.Age); Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", p2.Name, p2.Sex, p2.Age); Console.ReadKey(); } } }
运行结果:
上面的代码定义的都是公共构造函数(即使用public关键字修饰的构造函数),在介绍实例构造函数特点时我们曾提到,也可以使用private、protected关键字来修饰实例构造函数。
使用private关键字修饰的构造函数称为私有构造函数。如果类只定义了一个或多个私有构造函数,而没有其他公共构造函数,则其他类不能通过调用该类的私有构造函数来创建类的实例。私有构造函数最典型的应用是设计模式中的单例模式的实现。
私有构造函数,将构造函数申明为私有的,则不能通过new运算符在外部代码中实例化(但可以编写一个静态方法或属性在其内部实例化一个对象,再将结果返回给外部代码)。
私有构造函数的作用:
1、永远不会实例化,因为它仅用作某些静态成员的容器。
2、希望类只能通过调用某个静态方法来实例化(即所谓的对象实例化的类工厂方法)。
代码示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { //下面实现也是设计模式中单例模式的实现 class Person { public string Name { get; } public char Sex { get; } public int Age { get; } public static Person person; private Person() //私有构造函数,只能在类内部调用。也就是说类的实例化只能在类定义时被实例化。 { Console.WriteLine("私有构造函数被调用了!"); this.Name = "张三"; this.Sex = '男'; this.Age = 22; } public static Person GetInstance() //静态方法,用于返回类的实例。 { if (person == null) person = new Person(); return person; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { class Program { static void Main(string[] args) { //通过调用GetInstance()静态方法来返回一个Person的实例 //此时不能通过new运算符来创建实例 //即不能使用 Person p1 = new Person(); 的代码来创建实例 Person p1 = Person.GetInstance(); Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", p1.Name, p1.Sex, p1.Age); Console.ReadKey(); } } }
运行结果:
静态构造函数
除了实例构造函数之外,构造函数还包括静态构造函数。静态构造函数用于初始化类中的静态成员,在创建第一个实例或引用任何静态成员之前,CLR都将自动调用静态构造函数。
静态构造函数特点:
1、静态构造函数不能使用任何访问修饰符。
2、静态构造函数不能带有任何参数。
3、静态构造函数只执行一次。
4、不能直接调用静态构造函数,因为静态构造函数不是我们程序员调用的,是由CLR在合适的时机自动调用的。
5、执行时机:是在类被实例化或者静态成员被调用的时候由CLR自动进行调用的,所以在程序中,我们无法控制执行静态构造函数的时机。
6、一个类中只能有一个静态构造函数。
7、静态构造函数前面必须是static 关键字。如果不加这个关键字,那就是普通的构造函数了。
8、无参数的静态构造函数和无参数的构造函数是可以并存的。因为它们一个属于类级别,一个属于实例级别,并不冲突。
9、如果我们在类中定义了静态变量,但是又没有定义静态构造函数,那么C#编译器也会自动帮助我们来生成一个静态构造函数来让框架自身来调用。
代码示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { class Person { public static string Name { get; } public static char Sex { get; } public static int Age { get; } static Person() //静态构造函数只执行一次 { Console.WriteLine("静态构造函数被调用了!"); Name = "张三"; Sex = '男'; Age = 22; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { class Program { static void Main(string[] args) { Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", Person.Name, Person.Sex, Person.Age); Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", Person.Name, Person.Sex, Person.Age); Console.ReadKey(); } } }
运行结果:
文章评论