give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

C#プログラマのための理解度チェックリスト

前回のエントリでは「新しい言語を勉強したって、前に使ってた言語と同じような書き方をしてたら意味がない」という話をしました。
そこでC#を題材にして、C#を本質からマスターできているかどうかを確認するためのチェックリストを作ってみました。
これらの質問に対してすべて自分の言葉で説明できるのであれば、あなたはきっとC#をC#らしく使えているはずです。

  • interfaceって何のためにある?どういうときに使う?それがあったら何が嬉しい?
  • 抽象クラスや抽象メソッドって何のためにある?どういうときに使う?それがあったら何が嬉しい?
  • virtualって何?なんでJavaにはvirtualがない?
  • 名前空間って何?それがあったら何が嬉しい?
  • クラスって何?自分で新しくクラスを作る場合の注意点は何?(オブジェクト指向設計的な観点から)
  • クラスと構造体の違いって何?参照型と値型の違いって何?
  • フィールドやメソッドの可視性って何?可視性にはどんな種類がある?全部public宣言しちゃうとどんな問題が起きる?
  • staticを付けているメソッドや変数は付けないときと何が違ってくる?
  • newっていったい何してるんでしょう?
  • コンストラクタって何?普通のメソッドとどう違う?
  • thisっていったい何なんでしょう?
  • 配列、リスト、ディクショナリの違いってそれぞれ何?どういう用途で使い分ける?
  • ジェネリッククラスって何?ジェネリッククラスがあると何が嬉しい?IListとIList(T)の違いは何?
  • 下のコードはどうして左辺と右辺のクラスが違うの?
IList<string> hoge = new List<string>();
  • 以下のようなコードの問題点はどこでしょう?(ヒント:例外の使い方)
public bool DoSomething()
{
  try
  {
    DoIt();
  }
  catch (Exception e)
  {
    Log(e.Message);
    return false;
  }
  return true;
}
  • 「disposeパターン」「using文」「ガーベッジコレクタ」という言葉を織り交ぜて、C#におけるリソース管理について説明してください
  • ローカル変数、インスタンス変数、クラス変数の違いはそれぞれ何でしょう?
  • プロパティとメソッドの違いは何でしょう?
  • Javaでよく使われるgetter/setterメソッドとC#のプロパティの違いは何でしょう?
  • 下のコードは一見するとどちらもキャストを行っているように見えるが、後者は実際には型変換を行っていないのはなぜ?
int i = 30;
short s = (short)i;

object obj = GetSomeObject();
MyClass myClass = (MyClass)obj;
  • 下のコードは実行時にどのような違いが現れる?(ヒント:GetSomeTextMaybeNullというメソッド名からリスクを推測する)
object obj = GetSomeTextMaybeNull();
string s1 = obj.ToString();
string s2 = (string)obj;
  • 文字列の連結は「+演算子」ではなく、StringBuilderを使えって言われる理由は何?
  • 下のコードを実行したときに現れる違いは何?また、違いが現れるのはなぜ?「参照」という言葉を織り交ぜて説明してください。
string str = "Hello,";
AppendToString(str);
Console.WriteLine(str); // 文字列を表示

StringBuilder sb = new StringBuilder("Hello,");
AppendToStringBuilder(sb);
Console.WriteLine(sb.ToString()); // 文字列を表示

private void AppendToString(string str)
{
  str += "World!";
}

private void AppendToStringBuilder(StringBuilder sb)
{
  sb.Append("World!");
}
  • 不変クラス(immutableなクラス)って何?
  • ステートレスなクラス、ステートフルなクラスってそれぞれ何?
  • 深いコピー(Deep Copy)、浅いコピー(Shallow Copy)って何?
  • 以下のようなメンバを宣言するときはアッパーキャメルケース(AbcXyz)、ローワーキャメルケース(abcXyz)のどちら?
    • クラス
    • メソッド
    • プロパティ
    • インスタンス変数
    • メソッド引数
    • ローカル変数


チェックリストは以上です。
回答例はここには挙げませんが、以下のような本を読むとおそらく大半の問題に回答できるはずです。


Effective C#

Effective C#

More Effective C#

More Effective C#

.NETのクラスライブラリ設計 (Microsoft.net Development Series)

.NETのクラスライブラリ設計 (Microsoft.net Development Series)


そして回答できるようになればきっと、あなたが以下のリンクにあるようなコラムを書くことはないと思います。。。


http://el.jibun.atmarkit.co.jp/minagawa/2010/04/post-ebc4.html