しばたテックブログ

気分で書いている技術ブログです。

「C#できます」と言い放ったあいつがJavaプログラマであることを見分ける10の質問 に答えてみる

お題はこちら
http://d.hatena.ne.jp/matarillo/20110307/p1
正直難しいです…が、「C#できます」と言える様になりたいので恥を承知で答えて行きたいと思います。
わからない・自信がない部分に関しては後で調べて補足を追記していく予定です。


2011/03/08 補足を追記しました。

  • Q. 演算子のオーバーロードを実装してEqualsメソッドと同じ処理を実行するようにしてもよい場合はどのような時か?
    • A. Object.Equalsメソッドをオーバーライドした時。
      • (調べました)Immutableなオブジェクトの場合。
        まだなにもしてないよね さんで詳しい回答をされていますので詳細はそちらをご覧ください。
  • Q. ループ内でなければ、たとえ100個の文字列型変数であってもまとめて+演算子で連結してよい理由を説明せよ。
    • A. わかりませんでした。
      • (調べました)コンパイル時に一回のString.Concatメソッドの呼び出しに最適化されるから。
        こちらも まだなにもしてないよね さんの回答が詳しく記載されていて参考になります。
  • Q. Listのように値型を格納するジェネリックコレクションを使ってもボックス化/ボックス化解除が発生しない理由を説明せよ。
    • A. JITコンパイル時に値型の配列に変換されるから?
      • (調べる予定)
  • Q. Full GC(Gen2 GC)が動作したときに断片化していてもコンパクションされないヒープ領域はどのような領域か?
    • A. わかりませんでした。
      • (調べました)ラージオブジェクトヒープ領域。 85,000byte以上の大きなオブジェクトの場合はこの領域に確保されコンパクションされません。コンパクションされない理由はパフォーマンス確保のためだそうです。
  • Q. throw; とthrow ex; の違いをスタックトレースの観点で説明せよ。
    • A. throw;だと下位の例外がそのまま伝播されるが、throw ex;だとexで指定された型の例外が上書かれて伝播される。
      • (調べました)throw;はスタックの開始位置をリセットしないが、throw ex;の場合はスタックの開始位置がリセットされる。
  • Q. フィールドのアクセス修飾子をprivateにしプロパティのgetter/setterではそのフィールドを読み書きするだけというコードが馬鹿馬鹿しい理由を説明せよ。
    • A. 自動プロパティがあるから。かな?
      プロパティだけを実装するコードが馬鹿馬鹿しいという意味だったらわかりません。
      • (調べました)自動プロパティがあるから。で良さそうです。
  • Q. nullを参照している参照型変数のメソッドを呼び出そうとした場合でもNullReferenceExceptionが発生しないのは主にどういう状況か?
    • A. クラスメソッドをインスタンスから呼び出している場合(警告になるけどできたはず)?
      • (調べました)私の答えはVB.NETの場合だけ(インスタンスを経由する共有メンバへのアクセス)で、C#ではできませんでした。
        他の方の答えだとインスタンスがNullでもNullReferenceExceptionが発生しない拡張メソッドを実行している場合等が挙げられており、こちらが正しいと思います。
  • Q. クラスと構造体の違いは何か?(「スタックとヒープ」以外で)
    • A. クラスは参照型で構造体は値型。
      • (調べる予定)
  • Q. デストラクタとは何か?
  • Q. インターフェースの明示的実装を利用する目的を1つ説明せよ。
    • A. 明示的なリソースの解放の為にIDisposableインターフェイスを実装する。とか。
      • (調べる予定。なんか題意を勘違いしている気がする…)


やっぱりまだまだですね…精進します(´・ω・`)