JavaプログラマーがC#でプログラムを書いて引っかかったところ その1

案件が変わり、仕事で使う言語がJavaからC#に変わりました。
その際に、C#でプログラムを書いていて引っかかったところをメモしておきます。


とりあえず、連想配列(Dictionary)を使ったときのことをメモ。

書き方の違い

C#は、連想配列用に言語仕様が用意されています(インデクサ―)。

/* -- Java -- */
String str = map.get("abc");
/* -- C# -- */
string str = dictionary["abc"];

最初に書いた際、このことを忘れて取得メソッドを探してしまいました・・・*1

挙動の違い

要素を登録する際に、すでに同じキーを持つ要素が登録されていた場合、

  • Javaは、新しい要素を登録する。このとき、すでにある要素を戻り値として返す
  • C#は、新しい要素を登録する。このとき、すでにある要素を戻り値として返さない
    • ただし、Dictionary.Add(key, value)だと登録できない(例外 (ArgumentException) が発生する)。
/* -- Java -- */
map.put("abc", "001");
map.put("abc", "002");    // -> "001"
/* -- C# -- */
dictionary["abc"] = "001";
dictionary["abc"] = "002";    // -> void

dictionary.Add("abc", "002");    // throw ArgumentException


また、取得の際に該当のキーを持つ要素がない場合、

  • Java は、null を返す。
  • C# は、例外 (KeyNotFoundException) が発生する。
/* -- Java -- */
String str = map.get("def");    // -> null
/* -- C# -- */
string str = dictionary["def"];    // NG -> KeyNotFoundException


てっきりJavaと同じ挙動をするものだと思っていたので、すごいびっくりしました。



感想

JavaC#オブジェクト指向言語というところは同じなのでとっつきやすいんですが、こういった微妙な違いで結構戸惑っています。
でも、同じことをするのに表現が違うというのは、自然言語と同じですごく面白いです!*2

*1:ちなみに、C#にはJavaのような取得メソッドは無いようです。

*2:日本語と英語で同じことを言い表しているのに全然違う表現に変わることがあります。それを知った時と同じ感覚です。