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 -- */ String str = map.get("def"); // -> null
/* -- C# -- */ string str = dictionary["def"]; // NG -> KeyNotFoundException
てっきりJavaと同じ挙動をするものだと思っていたので、すごいびっくりしました。
感想
Java も C# もオブジェクト指向言語というところは同じなのでとっつきやすいんですが、こういった微妙な違いで結構戸惑っています。
でも、同じことをするのに表現が違うというのは、自然言語と同じですごく面白いです!*2