C#中的析构函数:
1、析构函数由系统调用,故不能用任何访问修饰符(private public internal protected)等修饰。
2、析构函数不能存在参数(系统自身调用,语法类似静态构造函数)。
3、析构函数只能用于引用类型(值类型由于是栈类型,超出作用域就释放内存了)。
只有在运行时回收对象时,析构器才被执行(如果存在析构函数)。而垃圾回收器是不定时运行的,所以析构器的运行时间也很难确定。
由于系统会为声明了析构函数的类单独启用一块内存去存放相关数据,这某种程度上降低了性能,而且编写析构函数会出现各种问题。因此建议手动释放内存,这就用到了Dispose()形式的方法。例如 dispose() close()等。
建议使用using(){}语句结构释放资源。
但使用using(var){}结构的var必须实现IDisposable接口。因为using语句自动调用该对象的Dispose方法。
C#属性:
1、属性不能是Const,l例如 public const int ID{get;set}错误!因为const是定义一个内存常量,二属性本质上是方法。
2、属性中的访问器不能两个同时都具有显示的访问修饰符。例如:
public String Name
{
private get{ return name;}
private set{ name = value;}
}//错误。两个访问器不能同时具有访问修饰符,去掉一个即可(对外只读或只写),并且,访问器访问修饰符应该比属性或索引器有更低级的访问级别。
例如:
public String Name
{
public get{ return name;}//Error!public级别大于等于属性本身访问级别public。应该为private或internal或无。
set{ name = value;}
}//错误。
存取访问修饰符级别高地:public -> internal (程序集本身无限制访问)->= protected(子类访问,不限程序集)->private
3、仅当属性同时具有色条和get两个访问器时才可使对其中之一使用访问修饰符。
public String Name
{
private set{name = value;}//error:由于只有一个访问器,故不能使用访问级别修饰符
}
4、对象初始化器:
ScreenPoint sp = new ScreenPoint(0, 0) { X = 100, Y=200};
ScreenPoint sp = new ScreenPoint { X = 100, Y=200};
X,Y为属性,且具有可外部访问的set存取器。否则不能用于初始化构造器。