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

古本:プログラミングMicrosoftVisual C#.NET(MickeyWilliams記)を読んでの覚書
 (C++でできることがあるかもしんないけど、知らんことはしらん)

  • ヘッダーがない・・定義と実装は同じ個所で行う
  • #Includeがない・・C#コンパイラが依存関係を自動的に解決する
  • クラス宣言の後にセミコロンが不要・・コンパイラがえらい
  • メンバのアクセスには::演算時や->演算子を使用しない
  • 抽象クラスの導入・・abstract class xxx{}
  • 実装しないメソッド・・abstract public void hoge();
  • シールクラス・・基本クラスになれないsealed class hoge{}
  • シールメソッド・・シールクラスのメソッド版でオーバライド不可
  • 基本クラスへのアクセスはbase.hoge()・・直接の基本クラスのみが参照可能で2つ上は見えない
  • objectクラス・・C#の全クラスの本尊でビルトイン型もobjectクラスより派生
    • ex) string sHoge = 5.ToString();
  • フィールドのreadonly・・コンストラクタ、或いは最初に宣言される時のみ代入ができるフィールド
  • フィールドのstatic・・C++からあるが、オブジェクトの参照ではなく、クラスの参照としてアクセス
  • フィールドのconst・・C++からあるが、オブジェクト内にスペースを消費せず、クラス参照によりアクセス
  • staticメソッドもクラスによる参照・・staticメソッドの参照はクラスによる参照を行う
  • デフォルトパラメータはない・・オーバロードにより実装する
  • パラメータの参照渡しの方法はref(参照初期値必須)
    • hoge(ref xxx);で参照渡しとなる。勿論定義側にもhoge(ref int xxx){}を指定
  • パラメータの参照渡しの別の方法out(参照初期値不可)
    • hoge(out xxx);の前にxxxに値を設定することはできず、呼び出される側で設定が必須
  • 可変長パラメータparams


ex)hoge(a, b, c);
hoge(params int[] paList){
foreach( int val in paList){}
};

    • 可変長パラメータはパラメータリストの最後でなくてはならず、どのメソッドでも1つだけparams修飾子を使用できる
  • 明示的な基本クラスのコンストラクタ指定
    • コンパイラに任せるのではなく、明示的に基本クラスのコンストラクタを指定
    • ex) public hoge(xxx): base(xxx){}<---このようにオーバーロードコンストラクタを使用している場合、誤ったものを指定されずに済む
  • メンバー初期化子はコンストラクタ中ではない
    • クラスのメンバ宣言時に初期値を与えることができる(コンストラクタ起動前に実行)
    • ex) class hoge{ int a = 1
  • 静的メンバの初期化はクラスのメンバ宣言時にできる
  • 静的コンストラクタはクラスが最初に使用される前に実行されるコンストラク
  • デストラクタは必ず読みだされるとは限らない
    • デストラクタを用いてリソースを解放してはならない(Close()やDispose()を使用)
  • 抽象メソッドを用いることで、基本クラスが未実装のメソッドへの対応
    • ex) class hoge: xxx{ override public void yyy(){}