- finalクラス、メソッド -> sealedクラス、メソッドとして記述される。 - package -> namespaceで実現。 - import -> usingで名前空間の使用を宣言。 - 派生 -> class 派生クラス : 基本クラス { ... }として宣言される。 - 実装 -> class 派生クラス : インタフェース { ... }として宣言される。 - オーバーライド -> 基本クラスのメソッドを、virtualで宣言すると、派生クラスのメソッドに実装を許可し、overrideをつけて実装する。 -> 基本クラスのメソッドを、abstractで空宣言すると、派生クラスのメソッドに実装を強制し、overrideをつけて実装する。 -> 基本クラスのメソッドを、virtualで宣言しても、派生クラスのメソッドにnewをつけるとオーバーライドせず、隠蔽する。    この場合、newをつけないと警告がでる。newは基本クラスのメンバを隠蔽するという意味を持つ    この不要にも思える冗長さは、「壊れやすい基本クラスの問題」への対処法のために導入されたらしい。 - 明示的なインタフェース実装 -> インタフェース名を指定して明示的な実装が可能。    このメソッドには派生型からはアクセスできない。アクセス修飾子は省略される。   (外部からは)インタフェースのキャストを介してのみ使用可能。   列挙子を自分で実装する場合、このテクニックを使う必要がある。 - 基本コンストラクタ引数 -> コンストラクタの宣言のお尻に、: base(引数)とする。 - final変数 -> readonly修飾子を使う - staticフィールド -> クラス名からしかアクセスできない。 - staic final -> const(コンパイル時定数)もしくはstatic readonly(読み取り専用)で実現する。   constはstaticとして記述できないが、実質staticとなる。 - メソッドの引数 -> 値渡し。ただし、オブジェクトの場合、Javaと同じで参照変数のビッドパターンが渡されるので、 呼ばれたメソッドからもヒープ上に存在する同じオブジェクトにアクセスできる。 - メソッド引数参照渡し -> メソッドの引数は参照渡しすることもでき、refキーワードをメソッドの宣言と、実際にメソッドを呼び出す所で使う。 - メソッド引数 out -> outでメソッドから引数を通じて値を返すこともできる。 - メソッドの可変長引数 -> paramsキーワードを使って渡す。同一シグネチャの中で一回しか使えない。   Javaの可変長引数と同じように呼び出せる。メソッドの最後の引数としてのみ指定可能。 - 静的初期化ブロック-> C#では、静的コンストラクタとして実現する。   静的フィールド、静的コンストラクタ、インスタンスフィールド、インスタンスコンストラクタの順に初期化される。 - finalize -> デストラクタにより実現される。~(チルダ)クラス名で宣言する。ガーベジコレクションにより回収されるときに呼ばれる。   ただし、ファイナライザ(protected void Fianlize())も宣言することが出来、両方宣言するとエラーになる。 - パッケージアクセス-> キーワードinternalを使うと、同一アセンブリ内からのアクセスを許可する。 - コード補完機能 -> IntelliSenceにより実現される。 - jar -> アセンブリとして表現される。典型的には.dllや.exeなどのファイル。 - instanceof -> asキーワードを後置して代入し、nullか否かで判定できる。    または、isキーワードをinstanceofと全く同じ使い方で使える。 - 文字列エスケープ回避 -> @"文字列リテラル"とすると、文字列リテラル内で\をエスケープしない。 - 文字列比較 -> (a == b) で文字列が同じ内容かどうかを、   ((object)a == (object)b)で文字列が同じオブジェクトを指すかどうかを判断する。 - ガベージコレクタ -> ジェネレーション別ガベージコレクタ(0,1,2) - ラッパー -> intはSystem.Intであってもスタックに作成される。 - 演算子オーバーロード -> Javaにはないが、C#ではサポートしている。 - 書式出力 -> Console#WriteLineで{0:D}等を使って、実現可能。 - GC -> Collect()で強制実行が可能。SuppressFinalize()でファイナライザ(デストラクタ)の実行不要指定が可能。   ただし、その場合でも、GCはメモリの解放はちゃんと行う。 - オブジェクトの破棄 -> Dispose()で行う。IDisposableをマーカインタフェースとして実装し、usingブロック内で宣言すると、   Disposeメソッドが暗黙のtry/finally実装のfinally句内で、自動的に呼び出される。(逆に、実装していないとusingは使えない) - jvmstat -> CLRプロファイラでメモリ統計情報の入手が可能。 - 新しい値型 -> 構造体(struct)として宣言する。 - 型情報演算子 -> 型名を返すtypeof、サイズを返すsizeofがある。(sizeofはunsafeブロック内のコードに対してのみ有効) - オーバーフロー -> checkedキーワードを用いてキャストし、その中でオーバーフローが起こると、OverflowExceptionを投げるようになる。 uncheckedキーワードを用いてキャストし、その中でオーバーフローが起こっても、OverflowExceptionを投げず、未定義の代入を行う。      キーワードを設けていない場合の振る舞いは既定の設定による。 - 演算子オーバーロード -> <を実装したら>も実装しなくてはならない。 <=を実装したら>=も実装しなくてはならない。 ==を実装したら!=も実装しなくてはならず、さらにEquals()とGetHashCode()も実装しなくてはならない。 public staticとして宣言する。sealedやvirtualは指定できない。   パラメータにrefまたはoutを指定できない。   trueとfalseもオーバーロードできる。単項で真偽値が判定できるようになる。 - 型変換演算子 -> キャストのオーバーロード。implicitとexplicitがあるが、なるべくexplicitを使うべき。 - プロパティ -> 特殊な構文get{}とset{}を用いて、フィールドをプロパティとして外部に公開することが出来る。   setでは隠しパラメータvalueが使われる。 - switch/case -> 暗黙的なフォールスルーは許されていないが、gotoを用いてほかのcase句に飛ぶことが出来る。    文字列をcase句の定数値として指定できる。 - null許容型 -> int? とすると、nullを許容する値型が宣言できる。   int i = variable ?? 0; とすると、variableがnullのとき、代わりに0を代入する。 - インナークラス -> C#では、Outher.thisの様な形での、インナークラスからのアウタークラスへの参照は入手できない。   コンストラクタか何かで渡す必要あり。 - クラス分割 -> partialキーワードを宣言することで、クラスや構造体の定義を複数のファイルに分割することが出来る。 - Flags属性 -> 列挙体をビットフィールド、つまりフラグのセットとして扱える属性。 - ReferenceEquals -> Objectの静的メソッドで、二つのオブジェクトがヒープ上で同一のものかどうかを判別する。 TODO: 2005 160P クラスダイアグラム - usingの自動挿入 -> まだバインドされていない新しく使用するクラスの赤波線の終わりにカーソルを持っていって、    小さく現れる長方形をクリックすると、ショートカットメニューが現れる。 - ブロックコードの自動挿入 -> 囲みたい部分を反転表示し、Ctrl+K,Ctrl+Xでスニペットメニューから選択。 - スニペットのショートカット -> スニペットキーワード(cw=Console.WriteLine())を入力し、Tabを2回たたく。 - リファクタリング -> 名前の変更はF2キーで。 TODO: 2005 195P MSBuild -> Ant - インデクサ -> 配列とプロパティを組み合わせたもの。データは一般に配列またはコレクション。thisに対して、set/getを定義する。    実質的には、[]のオーバーロード。 - 配列引数 -> 配列はSystem.Arrayから派生しているので、Method(Array a)として渡すことが出来る。   もちろん、(int[] ia)などでもよい。 - default() -> default(値型)は0、default(参照型)はnull、default(string)もnull。 - ジェネリクスのエイリアス -> usingで型のエイリアスが宣言できる。 - ジェネリクスオーバーロード -> ジェネリクスメソッドが非ジェネリクスメソッドをオーバーロードしたとき、あいまいさがある場合は、   非ジェネリクスメソッドが優先される。 - ジェネリクスの型制約 -> Javaの は、 where T : something として記述される。   派生制約、インタフェース制約、値型制約(struct)、参照型制約(class)、コンストラクタ制約(new())がある。 - 反復子 -> Javaの反復子はC#では列挙子として提供される。   C#の反復子はJavaには無い概念で、反復子ブロック内でyield return itemとすることで、呼出元のforeachループと   呼出先のforeachループが連携して、itemを一つずつ返す仕組みになっている。   これにより具体的なIEnumeratorの実装を返す代わりに、yield return itemをIEnumerator戻り値を介して   返すことが出来るようになり、コードの大幅な簡略化が図れる。 - 反復子の中断 -> yield breakとすると、反復がそれを最後に中断し、その後は反復しない。 - 反復子ブロック -> yieldキーワードを含むブロックを反復子ブロックという。 - 反復子メソッドの複数実装 -> 複数の実装を公開できるが、呼び出し元で反復子メソッド名を指定しない場合はGetEnumerator()メソッドを必要とする。 - デリゲート -> タイプセーフな関数ポインタ。Javaにはない。 - デリゲート結合 -> MulticastDeligateの場合、一つのデリゲート変数に複数のメソッドを登録できる。   +=もしくはDelegate#Combineで連結できる。 - デリゲート削除 -> Delegate#Removeで呼び出しリスト内にある指定したメソッドのうち、最後に現れるメソッドが削除される。 - デリゲート呼び出しリスト -> GetInvocationList()でデリゲートに登録されたメソッドの一覧を持つ配列が入手できる。   この要素を使って、直接メソッド呼び出しを行い戻り値を入手できる。 - デリゲートとジェネリクス -> デリゲートの宣言、使用のどちらでもジェネリクスと関連付けることが出来る。 - BeginInvoke -> シングルキャストデリゲートに対してのみ使用可能。   引数に(デリゲートメソッドの引数、コールバックメソッド名、コールバックでの状態を記述させたいオブジェクト)を取る。   IAsyncResultを結果に返す。 - IAsynchResult -> IsCompleted()で非同期メソッドが完了したかどうか判定する。   AsyncWaitHandle.WaitOne()で待機する。 - 同期ブロック -> lock(オブジェクト)で同期ブロックを開始する。 - EndInvoke -> BeginInvokeで起動した非同期スレッドの結果を得ることが出来る。BeginInvokeと対にして呼び出すほうがよい。 - BeginInvokeの例外 -> BeginInvokeから起動したメソッドの例外は、メインスレッドに投げ返される。 - 普通のマルチスレッドの例外 -> はサブスレッド内でスタックトレースに向かって投げられる - 外部変数 -> メソッドがデリゲートを返す場合、そのメソッド内にで使われているが、デリゲート宣言の外に存在するローカル変数を   外部変数という。外部変数の寿命は、デリゲートの寿命まで延びる。 - スレッド -> フォアグラウンドとバックグラウンドスレッドがあり、全てのフォアグラウンドスレッドが終了すると、   バックグラウンドスレッドは自動的に終了する。 - Runnable -> ThreadのジョブとしてJavaではRunnableを渡していたが、C#ではdelegateを渡す。 - スレッドの開始 -> Thread t = new Thread(new ThreadStart(Run));   ここで、ThreadStartは定義済みデリゲート、Runは自分で定義したジョブを表すメソッドである。   Thread t = new Thread(new ParameterizedThreadStart(Run));でもよい。   こちらはパラメタ付デリゲートで、Startに引数が渡せる。   さらに、これらは推論が可能で、Thread t = new Thread(Run);でもよい。 - スレッドの生存確認-> IsAlive()で都度確認するか、Join()で終了を待つ。 - synchronized -> C#では、lock(object) { } として同期ブロックを表現する。 - スレッドの待機と通知 -> MonitorクラスのWait(), Pulse(), PulseAll()がこの待機と通知を担う。    これらはlockブロック内からのみ呼び出すことが出来て、lockで指定したオブジェクトを引数に取る。 - Mutex -> 名前付きMutexを使うと、プロセス間での同期通信が行える。 - FileStream -> ファイルの読み書きに使用。using句内で宣言するべき。UTF8Encodingで文字列とbyte配列の変換を行う必要あり。 - .NETのオブザーバパターン -> 旧来のオブザーバパターンの代わりに、delegateとeventを用いて実装する。delegateとeventは従来のSubject役に内包する。 - .NETのイベントパターン -> .NETのオブザーバパターンを実装する際に、命名規約等を設けたもの。  (規約1)イベント名を「対象となるフィールド(又はプロパティ)+ Changedなど」とする。 (規約2)デリゲート名を「イベント名 + Handler」とし、引数を(Object sender, イベント名+EventArgs e)とする。   戻り値は持たない。  (規約3)イベントを発火するメソッドとして、Subject役内に「protected void On+イベント名」メソッドを用意する。   こうすることで、Subjectの派生クラスも一貫した方法でイベントを発火できる。 - ボックス化 -> 値型から参照型に暗黙に変換されること。 - SuppressWarnings -> C#では#pragma warning disable 0168などとして、警告メッセージを抑制する。この0168はコンパイラがコンパイル時に出力している 警告番号(例:CS0168)などのことである。 - dynamic型 -> C#2010から導入された型。静的な型だが、dynamic型のオブジェクトは静的な型チェックをバイパスする。