概述
C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙。
但是程序通过了编译检查并不表示错误已经不存在了,
在“错误”的大家庭里,“语法错误”的地位只能算是冰山一角。级别高的错误通常隐藏得很深,不容易发现。
根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。
微软利用面向对象的概念在设计C#语言时充分考虑了这个问题并很好地予以解决:
- 把对象成员的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。
- 当对象生命周期结束时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作。
构造函数
在C#语言中,每当实例化类或结构时,都会调用它的构造函数。一个类或结构可能有多个接受不同参数的构造函数。构造函数使程序员能够设置默认值、限制实例化和编写灵活且易于阅读的代码。
构造函数是一种方法,其名称与其类型的名称相同。其方法签名仅包含方法名及其参数列表;它不包含返回类型。
如果一个类没有显示创建构造函数,则编译器会为此类创建一个默认的构造函数。
构造函数的语法为:<access modifiers> <class name>(){ }
,示例如下:
class MyClass
{
public MyClass()
{
}
}
包含多个构造函数的House
类:
class House
{
public House()
{
}
public House(string owner)
{
}
public House(string owner,float area)
{
}
}
我们可以利用构造函数在对象实例化的时候对对象的成员进行赋值,或者调用内部方法。比如以上的House
类,我们稍加改造,在House
类内部创建私有变量,示例代码如下:
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
House unknownHouse = new House();
House jimHouse = new House("Jim");
House tomHouse = new House("Tom",200);
}
}
class House
{
private string _owner = "无名";
private float _area = 80;
public House()
{
Console.WriteLine("无参数构造函数被执行");
ShowMessage();
}
public House(string owner)
{
Console.WriteLine("有参数[owner]构造函数被执行");
_owner = owner;
ShowMessage();
}
public House(string owner,float area)
{
Console.WriteLine("有参数[owner, area]构造函数被执行");
_owner = owner;
_area = area;
ShowMessage();
}
private void ShowMessage()
{
Console.WriteLine($"您好,{_owner} 先生,欢迎您来我家作客,我家的面积是{_area}平米,请随意参观。");
}
}
}
运行结果如下:
无参数构造函数被执行
您好,无名 先生,欢迎您来我家作客,我家的面积是80平米,请随意参观。
有参数[owner]构造函数被执行
您好,Jim 先生,欢迎您来我家作客,我家的面积是80平米,请随意参观。
有参数[owner, area]构造函数被执行
您好,Tom 先生,欢迎您来我家作客,我家的面积是200平米,请随意参观。
从上面示例代码可以看到:
unknownHouse
实例化时调用了House
的无参构造函数,其中的私有字段值未被修改,即_owner
是无名
,_area
等于80
;jimHouse
实例化时调用了一个参数的构造函数,私有字段_owner
被赋值成了Jim
;tomHouse
实例化时调用了两个参数的构造函数,私有字段_owner
被赋值成了Tom
,_area
被赋值成了200
。
析构函数
析构函数是类的一个特殊函数,当其类的对象超出作用域时就会执行该函数。析构函数的名称与带前缀波浪号(~)的类的名称完全相同,它既不能返回值,也不能接受任何参数。
构造函数的语法为:~ <class name>(){ }
,示例为:
class MyClass
{
~ MyClass()
{
}
}
class House
{
~ House()
{
}
}
总结
构造函数
- 构造函数的名字不能随便起,构造函数与类同名
- 没有返回值类型,这与返回值类型为void的函数不同
- 如果没有显示构造函数,编译会造成一个缺省构造函数
- 构造函数可以有多个重载
析构函数
- 析构函数是实现销毁一个类的实例的方法成员
- 析构函数不能有参数,不能任何修饰符而且不能被调用
- 析构函数的前缀为
~
- 析构函数是在程序结束时执行,一般时候析构函数里面写的都是一些资源回收之类的东西。不过C#的析构函数并不能保证每次都会调用,所以最好不要利用C#的析构函数来回收资源
发表评论
登录用户才能发表评论, 请 登 录 或者 注册