一
.
构造函数
何时调用构造函数:
Class1 cl=new Class1();
New
运算符为对象分配内存,然后再调用对象的构造函数。
1.
构造函数:无返回值
与类同名,可以重载,在生成类的实例时调用,可以初始化字段,当然也可以加入代码获取目前生成的实例数
class mode
{
Public mode() //
当然也可以是
private
类型
{
}
}
2
.静态构造函数:初始化静态成员变量
class mode
{
Public mode() //
当然也可以是
private
类型
{
}
static
mode() //
可以无类型修饰符,只在类加载时调用一次
{
}
}
2.
const
和
readonly
字段
1
)
const
隐式静态
,
必须
/
只能在声明时赋初值,每个类只有一个拷贝
public const uint ex=10;
public static const uint ex=10; //
错误
2
)
readonly
字段更加灵活,
1
)可以在构造函数中赋初值,可以是实例字段,
和字段类似,不过在构造函数外不能更改值
2
)如果要把
readonly
设置为静态,就必须显式声明
public static readonly uint ex=10; //
正确
4
从其他构造函数中调用构造函数(利用方法的重载)
class mode
{
Public mode():this(2) //
{
}
Public mode(int a) //
可以无类型修饰符,只在类加载时调用一次
{
}
}
5
派生类的构造函数
构造函数的调用顺序是先调用
System.Object ,
再按照层次结构由上向下进行,直到到达要实例化的类为止。还要注意在这个过程中,每个构造函数都初始化它自己类中的字段。(可见,若有派生类构造函数不能声明为
private
)
在类中定义有参构造函数可以强制用户初始化字段
(而不是由系统设为空)
派生类默认调用其基类的无参构造函数。若其基类无无参构造函数(即显式定义了有参构造函数),则需要在派生类的构造函数中显式调用其基类的有参构造函数。
Class Base
{
Public Base(int a) //
{
}
}
class mode
:
Base
{
Public mode():base(2) //
{
}
}
二
析构函数
清理:析构函数
(C++
开发人员扩展了析构函数的用法,不仅用于清理资源,还提供调试信息
)
C#
中由无用存储单元收集系统清理资源,不能预计析构函数会在什么时候运行,一般情况下不鼓励使用。
但在几种情况下使用:当删除变量时,需要采取一些措施(例如文件、数据库的闭合连接
:
是否无用存储单元收集系统无法处理,无用存储单元收集系统只是清理内存不用的
/
超过作用域的对象、变量。而文件、数据库是不由。
NET
管理的资源。在操作系统中还保持连接状态
)
1)
200
页
Finalize()
方法:传统意义的析构函数(工作方式:由无用存储单元收集系统在检测到实例已不再被引用时,就隐式调用
Finalize()
方法(客户程序无法控制)
)
但
Finalize()
方法缺乏确定性和对无用存储单元收集器性能的影响。所以应使用
Dispose()
和
Close()
方法
2)
200
页
Dispose()
和
Close()
方法
很大程度上是一种约定,不是
C#
语言的一部分,但对于
Dispose()
方法,在
C#
中有一些内部支持。
工作方式:应该明白任何客户机代码都应显式调用这个方法,来释放资源。
优点:资源在不需要时立即被释放,这对于象独占文件锁那样的对象来说是非常好的
缺点:客户机代码必须正常工作,并且调用该方法,如果不是这样,就被捆在这里
Dispose()
和
Close()
方法之间的区别大体上是一个约定:
Close()
:主要用于指定资源可能以后会再次打开。适合于关闭文件、数据库的连接
Dispose()
:是一种最终处理,调用
Dispose()
意味着客户机代码最终会删除这个对象。适合于释放各种
GDI
或其他
Windows
对象的句柄
,
详细
202
页
如果要利用
Idisposable
结构,也可以自动
Dispose()
,即通过
using
关键字。
总结:可见对于存在文件、数据库、
GDI
或其他
Windows
对象的句柄是不由。
NET
管理的资源,在对象销毁后,要
显式调用这个
Dispose()
方法。或
Close()
(
不需要重写析构函数)