C++->C#の違いの覚書3
- Finalize()とpublic void Dispose()やpublic void Close()
- ファイルや接続を有するクラスではClose()からDispose()を呼び出すことが勧められる。その理由はFinalize()を持つオブジェクトは負荷が高いからでDispose()ではFinalize()が不要である旨をGC.SuppressFinalize( this )を呼び出す必要がある。
public void Close(){
Dispose();
}
public void Dispose(){
xxx.Dispose();
GC.SuppressFinalize( this );
}
- usingステートメント・・・try〜finallyの2つのセクションを内部で実行
using( ResourceConnnector rc = new ResourceConnector() ){
rc.UseResource();
// rc.Dispose()が自動的に呼び出される
}//上記は以下の内容で展開される
ResourceConnector rc = null;
try{
rc = new ResoureceConnector();
} finally {
if( rc != null ){
IDisposable disp = rc as IDisposable;
disp.Dispose();
}
}
- System.GCクラスの使用
- GC.Collect()・・・完全ガベージコレクションが実行される
- GC.Collect(0)・・・ジェネレーション0が実行され、因みにCollect(2)はCollect()と同様の効果を得ることとなる
- GC.GetGeneration( this )・・・現在のジェネレーションを取得することができる
- bool bxx = i = jはコンパイルエラーとなる(型が異なる)
- int i = 10; if( 10 )<--コンパイルエラーとなるので、if( 10 != 0 )とする必要がある
- is演算子・・・・特定の型を判断することができる(オブジェクトの型を実行時に判断できる)
- typeof演算子・・実行時に型情報を取得できる
- sizeof演算子・・値型のサイズを調べることはできるが、参照型のサイズを調べることはできない
- *や->、[]、及び&は安全でないブロックでのみ使用することができる
- キャストできない型へのキャストを行った場合には、InvalidCastException例外が発生する
- 数値演算によるオーバーフローを検出するにはcheckedキーワードを使用し、該スコープ内でオーバーフローが発生すると、OverflowException例外が生成される
(通常はuncheckedに設定されている)
try{
checked{
short max = 32767; ++max;
}
} catch( OverflowException ex ){
}