在C#中请问什么是析构函数和构造函数?
它们两个之间有何区别.?如何使用它们.分别用在什么地方.?能否给它们举例说明一下:>!!谢谢拉.....
它们两个之间有何区别.?
如何使用它们. 分别用在什么地方.?
能否给它们举例说明一下:>!! 谢谢拉.. 展开
如何使用它们. 分别用在什么地方.?
能否给它们举例说明一下:>!! 谢谢拉.. 展开
8个回答
展开全部
构造函数与析构函数虽然是一个类中形式上较简单的函数,但它们的使用决非看上去那么简单,因此灵活而正确的使用构造函数与析构函数能够帮你更好的理解CLR的内存管理机制,以及更好的管理系统中的资源。
构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。它的命名方法既简单又合理:让构造函数与类同名。除了名字外,构造函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。如果它有返回值类型,那么编译器将不知所措。在你可以访问一个类的方法、属性或任何其它东西之前, 第一条执行的语句是包含有相应类的构造函数。甚至你自己不写一个构造函数,也会有一个缺省构造函数提供给你。
析构函数是实现销毁一个类的实例的方法成员。析构函数不能有参数,不能任何修饰符而且不能被调用。由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
虽然C#(更确切的说是CLR)提供了一种新的内存管理机制---自动内存管理机制(Automatic memory management),资源的释放是可以通过“垃圾回收器” 自动完成的,一般不需要用户干预,但在有些特殊情况下还是需要用到析构函数的,如在C#中非托管资源的释放。
资源的释放一般是通过"垃圾回收器"自动完成的,但具体来说,仍有些需要注意的地方:
1. 值类型和引用类型的引用其实是不需要什么"垃圾回收器"来释放内存的,因为当它们出了作用域后会自动释放所占内存,因为它们都保存在栈(Stack)中;
2. 只有引用类型的引用所指向的对象实例才保存在堆(Heap)中,而堆因为是一个自由存储空间,所以它并没有像"栈"那样有生存期("栈"的元素弹出后就代表生存期结束,也就代表释放了内存),并且要注意的是,"垃圾回收器"只对这块区域起作用;
构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。它的命名方法既简单又合理:让构造函数与类同名。除了名字外,构造函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。如果它有返回值类型,那么编译器将不知所措。在你可以访问一个类的方法、属性或任何其它东西之前, 第一条执行的语句是包含有相应类的构造函数。甚至你自己不写一个构造函数,也会有一个缺省构造函数提供给你。
析构函数是实现销毁一个类的实例的方法成员。析构函数不能有参数,不能任何修饰符而且不能被调用。由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
虽然C#(更确切的说是CLR)提供了一种新的内存管理机制---自动内存管理机制(Automatic memory management),资源的释放是可以通过“垃圾回收器” 自动完成的,一般不需要用户干预,但在有些特殊情况下还是需要用到析构函数的,如在C#中非托管资源的释放。
资源的释放一般是通过"垃圾回收器"自动完成的,但具体来说,仍有些需要注意的地方:
1. 值类型和引用类型的引用其实是不需要什么"垃圾回收器"来释放内存的,因为当它们出了作用域后会自动释放所占内存,因为它们都保存在栈(Stack)中;
2. 只有引用类型的引用所指向的对象实例才保存在堆(Heap)中,而堆因为是一个自由存储空间,所以它并没有像"栈"那样有生存期("栈"的元素弹出后就代表生存期结束,也就代表释放了内存),并且要注意的是,"垃圾回收器"只对这块区域起作用;
展开全部
析构函数 (destructor) 是一种用于实现销毁类实例所需操作的成员。析构函数不能带参数,不能具有可访问性修饰符,也不能被显式调用。垃圾回收期间会自动调用所涉及实例的析构函数。
垃圾回收器在决定何时回收对象和运行析构函数方面允许有广泛的自由度。具体而言,析构函数调用的时机并不是确定的,析构函数可能在任何线程上执行。由于这些以及其他原因,仅当没有其他可行的解决方案时,才应在类中实现析构函数。
析构函数是自动调用的,它不能被显式调用。当任何代码都不再可能使用一个实例时,该实例就符合被销毁的条件。此后,它所对应的实例析构函数随时均可能被调用。销毁一个实例时,按照从派生程度最大到派生程度最小的顺序,调用该实例的继承链中的各个析构函数。析构函数可以在任何线程上执行。
using System;
class A
{
~A() {
Console.WriteLine("A's destructor");
}
}
class B: A
{
~B() {
Console.WriteLine("B's destructor");
}
}
class Test
{
static void Main() {
B b = new B();
b = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
这个用得不多,一般情况都是自动内存管理,我们不需要干预,记住这个符号~
而构造函数很重要的,用得挺多的,参数不同,上面的例子把~去点就是构造函数。很典型的无参构造函数
垃圾回收器在决定何时回收对象和运行析构函数方面允许有广泛的自由度。具体而言,析构函数调用的时机并不是确定的,析构函数可能在任何线程上执行。由于这些以及其他原因,仅当没有其他可行的解决方案时,才应在类中实现析构函数。
析构函数是自动调用的,它不能被显式调用。当任何代码都不再可能使用一个实例时,该实例就符合被销毁的条件。此后,它所对应的实例析构函数随时均可能被调用。销毁一个实例时,按照从派生程度最大到派生程度最小的顺序,调用该实例的继承链中的各个析构函数。析构函数可以在任何线程上执行。
using System;
class A
{
~A() {
Console.WriteLine("A's destructor");
}
}
class B: A
{
~B() {
Console.WriteLine("B's destructor");
}
}
class Test
{
static void Main() {
B b = new B();
b = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
这个用得不多,一般情况都是自动内存管理,我们不需要干预,记住这个符号~
而构造函数很重要的,用得挺多的,参数不同,上面的例子把~去点就是构造函数。很典型的无参构造函数
参考资料: c#language specification
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
构造函数和析构函数是面向对象的编程技术里面特有的。C++,C#,Java等都有。
面向对象技术编程是以类为基础的,而构造函数和析构函数都是属于类的两个方法。
构造函数顾名思义,就是构造类对象用的。而析构函数则是释放类对象用的,两者正好相反。
构造函数和类名相同,析构函数是在构造函数前面加上“~”表示。
class A{
A();//构造函数,主要用于初始化成员变量
~A();//析构函数,释放类对象
}
使用方法:
A a=new A();//用类A实例化一个对象a,在这里“A()”不就是构造函数吗?
构造函数可以被重载。就算我们写类的时候不写构造函数,编译程序也会自动生成一个默认的构造函数,这个构造函数不带参数。而我们自己写构造函数通常会写带参数,这样可以初始化一些特别的对象。比如说我写了一个正方形类:
class 正方形
{
private int 边长;
private int 面积;
public 正方形(){边长=1;}
public 正方形(int n){边长=n;}
}
这样我们就可以用这个类定义好多正方形对象了:
正方形 z1=new 正方形();//这个正方形边长是1
正方形 z2=new 正方形(2);//这个正方形边长是2
正方形 z3=new 正方形(4);();//这个正方形边长是4
上面的例子就说明了构造函数的重载性。
面向对象技术编程是以类为基础的,而构造函数和析构函数都是属于类的两个方法。
构造函数顾名思义,就是构造类对象用的。而析构函数则是释放类对象用的,两者正好相反。
构造函数和类名相同,析构函数是在构造函数前面加上“~”表示。
class A{
A();//构造函数,主要用于初始化成员变量
~A();//析构函数,释放类对象
}
使用方法:
A a=new A();//用类A实例化一个对象a,在这里“A()”不就是构造函数吗?
构造函数可以被重载。就算我们写类的时候不写构造函数,编译程序也会自动生成一个默认的构造函数,这个构造函数不带参数。而我们自己写构造函数通常会写带参数,这样可以初始化一些特别的对象。比如说我写了一个正方形类:
class 正方形
{
private int 边长;
private int 面积;
public 正方形(){边长=1;}
public 正方形(int n){边长=n;}
}
这样我们就可以用这个类定义好多正方形对象了:
正方形 z1=new 正方形();//这个正方形边长是1
正方形 z2=new 正方形(2);//这个正方形边长是2
正方形 z3=new 正方形(4);();//这个正方形边长是4
上面的例子就说明了构造函数的重载性。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上几位是都复制的 别误导楼主了
构造函数
class A()
{
A()
{Console.write("我是构造函数");}
}
当你在程序种出现 A a=new A();的时候 程序自动执行 构造函数
A()
{Console.write("我是构造函数");}
而析构函数 的写法是
~A() {} 意思是 回收系统不用的内存
但是 C#里 有垃圾自动回收 所以 析构函数 基本不用 在C++用的比较多
接分
构造函数
class A()
{
A()
{Console.write("我是构造函数");}
}
当你在程序种出现 A a=new A();的时候 程序自动执行 构造函数
A()
{Console.write("我是构造函数");}
而析构函数 的写法是
~A() {} 意思是 回收系统不用的内存
但是 C#里 有垃圾自动回收 所以 析构函数 基本不用 在C++用的比较多
接分
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
namespace GXLogic
{
public class GetLogicDisposedList
{
#region 成员变量
public string PeccancyTimeL; //违法时间起
public string PeccancyTimeH; //违法时间迄
public string DisposeTimeL; //处理时间
public string DisposeTimeH; //处理时间
public string PlateType; //号牌种类
public string PlateNumber; //号牌号码
public string PeccancyAdress; //违法地点
public string Derection; //行驶方向
public string PeccancyType; //违法行为
public string DisposedPerson; //处理人(当数据为处理类型时候——处理人)
#endregion
public GetLogicDisposedList()
{
PeccancyTimeL = "";
PeccancyTimeH = "";
DisposeTimeL = "";
DisposeTimeH = "";
PlateType = "";
PlateNumber = "";
PeccancyAdress = "";
Derection = "";
PeccancyType = "";
DisposedPerson = "";
}
这就是构造函数,析构函数C#很少用.你想了解这些可以看看C++
{
public class GetLogicDisposedList
{
#region 成员变量
public string PeccancyTimeL; //违法时间起
public string PeccancyTimeH; //违法时间迄
public string DisposeTimeL; //处理时间
public string DisposeTimeH; //处理时间
public string PlateType; //号牌种类
public string PlateNumber; //号牌号码
public string PeccancyAdress; //违法地点
public string Derection; //行驶方向
public string PeccancyType; //违法行为
public string DisposedPerson; //处理人(当数据为处理类型时候——处理人)
#endregion
public GetLogicDisposedList()
{
PeccancyTimeL = "";
PeccancyTimeH = "";
DisposeTimeL = "";
DisposeTimeH = "";
PlateType = "";
PlateNumber = "";
PeccancyAdress = "";
Derection = "";
PeccancyType = "";
DisposedPerson = "";
}
这就是构造函数,析构函数C#很少用.你想了解这些可以看看C++
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询