在C的构造函数和析构函数#使用
关键词:构造函数;析构函数;垃圾回收器;非托管资源;资源管理
第一.构造函数和析构函数的原理
作为一种更高级的语言比C,C #提供更好的机制来提高程序的安全性。C #编译器具有严格的类型安全检查功能,它几乎可以找到程序中所有的语法问题,这确实有助于程序员,但程序已经通过编译检查并不意味着不存在错误。在错误的大家庭中,语法错误的位置只能是冰山一角,高水平的错误通常是隐藏的,不容易找到。
根据经验,许多检测的程序错误引起的变量未初始化或清除正确,并初始化和消除是很容易被忘记。面向对象的概念是在C语言#设计充分考虑,并很好的解决:把对象的初始化在构造函数和析构函数中的结算工作。创建对象时,构造函数自动执行。当目标死亡,析构函数自动执行。这样,你不用担心忘记初始化和清理的对象。
两。在C #构造函数的使用
构造函数的名字不能随便对待,必须由编译器识别是自动执行。其命名方法既简单又合理:让构造函数有类相同的名称。除了名字,构造函数的另一特色是没有返回值类型,它不同于返回无效型的功能。如果它有一个返回值类型,编译器会不知所措。在你访问一个类的方法,属性,或是其他的什么,第一个声明构造函数包含相应的类。即使你不自己写一个构造函数,你将会有一个默认构造函数。
TestClass类
{
(但):公共基础(){ } / /由CLR
}
下面列出了几种类型的构造函数
1)默认构造函数
TestClass类
{
(但):公共基础(){ }
}
如上所述,它由系统(CLR)提供。
2)实例构造函数
实例构造函数是实现类中实例初始化的方法的一个成员:
使用系统;
类点
{
公共双x,y;
公共点()
{
这个,x=0;
这个,y=0;
}
公共点(双x,双Y)
{
这个;
这个,y = y;
}
…
}
类测试
{
静态空隙主()
{
点=新点();
点b =新点(3, 4);使用构造函数初始化对象
…
}
}
一类是宣称,它提供了两个构造函数。他们是沉重的负担。一个是点构造函数没有参数和一个双参数点的构造函数。如果这些构造函数不在类提供,CLR会自动提供一个默认构造函数,但是一旦一个自定义的构造函数是类提供,如点()和点(x,y),默认构造函数将不提供,应注意。
3)静态构造函数
静态构造函数是初始化类的方法的成员,通常用于初始化静态数据。静态构造函数不能有参数,不能有修饰符,不能调用,当装入类时,自动调用类的静态构造函数:
使用系统数据;
员工类
{
专用静态数据集DS;
静态员工()
{
DS =新的数据集(…);
}
…
}
声明一个具有静态构造函数的类雇员,指出静态构造函数只能初始化静态数据成员,而不能初始化非静态数据成员。但是,非静态构造函数可以将值赋给静态数据成员或初始化非静态数据成员。
如果类只包含静态成员,您可以创建一个私有构造函数:私人TestClass(){…},但私人意味着它是不可能从类的外部访问构造函数。因此,它不能被调用的,没有对象可以被实例化的类定义。
这些是几种类型构造函数的简单应用程序。接下来,我们将重点讨论在类的层次结构中使用基类和派生类的构造函数的方法。派生类对象的初始化是由基类和派生类一起完成的。基类的成员是由基类的构造函数初始化的,派生类的成员是由派生类的构造函数初始化的。
当创建派生类的对象时,系统将调用基类的构造函数和派生类的构造函数。构造函数的执行顺序是执行基类的构造函数的第一,然后执行派生类的构造函数,如果派生类对象的成员,它执行基类的构造函数的第一,然后执行成员对象类的构造函数,最后执行派生类的构造函数。
对于执行基类的任何构造函数,默认情况是执行基类的无参数构造函数。如果要执行基类的参数构造函数,必须在派生类构造函数的初始化表中指出:
班上的一个
{私有int;
公共a(){ x=0;}
公共a(int)x i =;}
};
乙类:A
{私人int;
公共b(){ = 0;}
公共b(int)
公共b(int i,int):a(i){ j=;}
};
b =新(b); A(基类构造函数执行),然后派生类构造函数执行(b)
b =新的b(1);;a(基类构造函数的执行),然后派生的类构造函数被执行B(int)
B B3 =新的B(0,1); / /一个基类的构造函数被执行(int),然后派生类
Constructor B(int,int)
这里必须清楚地分析构造函数的执行顺序。此外,如果基类A中没有参数构造函数,公共A()= 0;},在派生类的所有构造函数成员的初始化表中,我们必须指出基类A有一个参数构造函数A(i),如下所示:
班上的一个
{私有int;
公共a(int)x i =;}
};
乙类:A
{私人int;
公共b():a(i)=y=0;}
公共b(int):a(i){ i =;}
公共b(int i,int):a(i){ j=;}
};
三。析构函数和C #垃圾收集器的使用
析构函数是实现破坏类的实例的方法的一个成员。析构函数没有参数,没有修饰符,也不能调用。因为析构函数的目的与构造函数相反,我们添加前缀~表示差异。
虽然C #(特别是CLR)提供了一种新的内存管理机制,自动内存管理(自动内存管理),释放资源可以被垃圾回收器自动完成,无需用户干预,但在某些特殊情况下或需要使用析构函数,在C #在非托管资源的释放。
资源的释放通常是由垃圾回收器自动完成的。
1。值类型和引用类型引用不需要任何垃圾收集器来释放内存,因为当它们超出范围时,它们将自动释放内存,因为它们都存储在堆栈(堆栈)中。
2。只是引用一个引用类型,把一个对象的实例存储在堆(堆)中,并且因为堆栈是一个空闲的存储空间,所以它不象一个堆栈作为生存(堆栈元素的弹出后生存期,也代表内存的释放)。值得注意的是,垃圾收集器只在这个区域起作用;
然而在某些情况下,当非托管资源发布,代码必须解决。通常,析构函数来释放非托管资源,这是由用户编写的释放非托管资源的代码段放置在析构函数。注意,如果使用非托管资源不是一类,那你一定没有定义析构函数,这是因为执行对象的析构函数,然后垃圾收集器在析构函数释放资源的管理在叫,然后第二次真正释放非托管资源,作为一个结果,两缺失。超过一次的成本。使用一段代码来显示如何使用析构函数:
resourceholder公共类
{
…
~ resourceholder()
{
下面是用户代码清理非托管资源
}
}
四。总结
尽管构造函数和析构函数函数类是非常简单的,但是它们的使用并不像看上去那么简单,因此使用构造函数和析构函数的内存管理机制是灵活的,正确的可以帮助您更好地理解CLR,更好地理解资源管理系统。