简介
C#中struct和class的访问权限级别是一样,默认都是private;都是通过new来分配,其区别是:
- struct定义的是值类型,其实例在栈上分配内存;
- class定义的是引用类型,其实例在堆上分配内存;
使用资源后,需要释放:
- 托管资源:即由CLR里new出来的对象,由CLR管理分配和释放;
- 非托管资源:不受CLR管理的对象;Windows内核对象,如文件、数据库连接、套接字、COM对象等;
构造函数
C#中每个类型都有构造函数;构造函数的顺序:
- 静态构造函数:先初始化类型的静态变量,再执行函数体内语句;
- 普通构造函数:先初始化成员变量,再执行函数体内的语句;
class First
{
public First(string strTag)
{
Console.WriteLine("First-construct: {0}", strTag);
}
}
class Second
{
static First fOne = new First("Static");
First fTwo = new First("Normal");
static Second()
{
Console.WriteLine("Static second-construct");
}
public Second()
{
Console.WriteLine("Normal second-construct");
}
}
static void Main(string[] args) {
Second sOne = new Second();
// 输出:
// First-construct: Static
// Static second-construct
// First-construct: Normal
// Normal second-construct
}
资源释放
C#可以定义一个Finalizer和Dispose方法以释放资源。
- Finalizer样式与C++的类似(~后跟类名),但是其调用时间不确定,是在运行时(CLR)垃圾回收时才会被调用;
- Dispose:需要继承接口IDisposable,标识需要显式释放资源;
public class MyObject : IDisposable{
private bool _disposed;
~MyObject() {
Dispose(false);
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
public void Close() {
Dispose();
}
protected virtual void Dispose(bool disposing) {
if (_disposed) return;
if (disposing) {
// 清理托管资源
}
// 清理非托管资源
// 标记已经被释放。
_disposed = true;
}
}
using(var obj=new MyObject()){
// 完成后自动调用Dispose释放资源
}