微软利用面向对象的概念在设计C#语言时充分考虑了这个问题并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作。
构造函数又叫构造方法,它是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化,也就是就是对类进行初始化。
1、构造函数的名字必须与类同名
2、构造函数没有返回类型,它可以带参数,也可以不带参数
3、声明类对象时,系统自动调用构造函数,构造函数不能被显式调用
4、构造函数可以重载,从而提供初始化类对象的不同方法
5、若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空
1、构造函数不允许有返回类型,包括void类型;
2、构造函数的名称必须与雷鸣相同(所以构造函数往往需要使用形参)
构造方法的定义语法形式如下:
访问修饰符 类名 (参数列表)
{
语句块;
}
class Woman
{
public int age;
public string name;
public string country;
public Woman(){}
public Woman(int age, string name , string country)
{
this.age = age;
this.name = name;
this.country = country;
}
}
这里构造方法的访问修饰符通常是public
类型的,这样在其他类中都可以创建该类的对象。
如果将访问修饰符设置成private
类型的,则无法创建该类的对象。构造方法中的参数与其他方法一样,都是 0 到多个参数。
此外,构造方法是在创建类的对象时被调用的。通常会将一些对类中成员初始化的操作放到构造方法中去完成。
创建用户类 User,并创建构造方法为用户类中的属性赋值。在 Main 方法中 调用输出用户信息的方法,用户属性包括用户名、密码、手机号。
class User
{
public User(string name, string password, string tel)
{
this.Name = name;
this.Password = password;
this.Tel = tel;
}
public string Name { get; set; }
public string Password { get; set; }
public string Tel { get; set; }
public void PrintMsg()
{
Console.WriteLine("用户名:" + this.Name);
Console.WriteLine("密 码:" + this.Password);
Console.WriteLine("手机号:" + this.Tel);
}
}
//在 Main 方法中调用方法的代码如下:
class Program
{
static void Main(string[] args)
{
User user = new User("小明","123456","13131351111");
user.PrintMsg();
}
}
构造函数分为实例构造函数、私有构造函数和静态构造函数
实例构造函数是实现对类中实例进行初始化的方法成员。
//首先定义了一个私有成员i,经过初始化给它赋了一个初值4,当实例化类cat时,就会执行实例构造函数。
class Program
{
public class cat
{
int i;
public cat() //定义cat类的构造方法
{
i = 4;
Console.WriteLine("The cat,{0} ", i);
}
static void Main(string[] args)
{
cat cat1 = new cat();
Console.Read();
}
}
}
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。 如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类无法创建该类的实例。
//这是举了一个错误的例子,即使在dog类中添加一个静态成员,依旧无法创建dog类的实例。
class Program
{
public class dog
{
private dog()
{
Console.WriteLine("this is dog");
}
}
public class cat
{
int i;
private cat() //定义cat类的构造方法
{
i = 4;
Console.WriteLine("The cat,{0}", i);
}
static void Main(string[] args)
{
dog dog1 = new dog(); //不可访问,受保护级别限制而无法实例化
cat cat1 = new cat();
Console.Read();
}
}
}
静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初始化。静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的静态构造函数自动被调用。
// 注意静态构造函数只能对静态数据成员进行初始化,而不能对非静态数据成员进行初始化。
//但是,非静态构造函数既可以对静态数据成员赋值,也可以对非静态数据成员进行初始化。
class Program
{
public class dog
{
static int i;
static dog()
{
i = 1;
Console.WriteLine("the dog 默认构造函数 i={0}",i );
}
}
public class cat
{
static void Main(string[] args)
{
dog dog1 = new dog();
Console.Read();
}
}
}
1. 构造方法的本质是一个构造器,是为了类的实例化而产生的。2. 构造方法是一种特殊的方法,它没有返回值,它必须与类重名,它只能在初始化的时候被执行,外部不能调用。3. 构造方法可以不写,系统会默认的为你的类添加一个无参构造方法。4. 如果讲构造函数设为 private ,则不能被外部实例化。
析构函数是实现销毁一个类的实例的方法成员。析构函数不能有参数,不能任何修饰符而且不能被调用。由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
虽然C#(更确切的说是CLR)提供了一种新的内存管理机制——自动内存管理机制,资源的释放是可以通过“垃圾回收器” 自动完成的,一般不需要用户干预,但在有些特殊情况下还是需要用到析构函数的,如在C#中非托管资源的释放。
1. 不能在结构中定义析构方法,只能对类使用析构方法。2. 一个类只能有一个析构方法。3. 无法继承或重载析构方法。4. 无法调用析构方法。5. 它们是被自动调用的。6. 析构方法既没有修饰符,也没有参数。
~类名()
{
语句块;
}
在析构方法中不带任何参数,它实际上是保证在程序中会调用垃圾回收方法 Finalize()。
在 User 类中添加析构方法并验证析构方法的效果。
根据构造方法中的实例,析构方法是在类操作完成后调用的,代码如下:
~User()
{
Console.WriteLine("调用了析构方法");
}
构造函数与析构函数虽然是一个类中形式上较简单的函数,但它们的使用决非看上去那么简单,因此灵活而正确的使用构造函数与析构函数能够更好的管理系统中的资源。