C++->C#の違いの覚書3

  • protected void Finalize()
    • デストラクタのようにオブジェクトが破棄される際に実行されるが、デストラクタとの共存はできずコンパイルエラーとなる
  • 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( 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 )・・・現在のジェネレーションを取得することができる

  • int i = 10; if( 10 )<--コンパイルエラーとなるので、if( 10 != 0 )とする必要がある
  • is演算子・・・・特定の型を判断することができる(オブジェクトの型を実行時に判断できる)
  • typeof演算子・・実行時に型情報を取得できる
  • sizeof演算子・・値型のサイズを調べることはできるが、参照型のサイズを調べることはできない
  • C#に::(スコープ解決演算子)は存在しない
  • *や->、[]、及び&は安全でないブロックでのみ使用することができる
  • キャストできない型へのキャストを行った場合には、InvalidCastException例外が発生する
  • 数値演算によるオーバーフローを検出するにはcheckedキーワードを使用し、該スコープ内でオーバーフローが発生すると、OverflowException例外が生成される
    (通常はuncheckedに設定されている)


try{
checked{
short max = 32767; ++max;
}
} catch( OverflowException ex ){
}