辞書(C#またはそれ以外)は、単にキーに基づいて値を検索するコンテナーです。多くの言語では、最も一般的な実装がHashMapであるマップとしてより正確に識別されます。
考慮すべき問題は、キーが存在しない場合に何が起こるかです。一部の言語は返すことで振る舞うnull
か、nil
または他の同等の値。値が存在しないことを通知する代わりに、値をサイレントにデフォルト設定します。
良くも悪くも、C#ライブラリデザイナーはこの動作に対処するイディオムを思いつきました。彼らは、存在しない値を検索するデフォルトの動作は例外をスローすることであると推論しました。例外を回避したい場合は、Try
バリアントを使用できます。文字列を整数または日付/時刻オブジェクトに解析するために使用するのと同じアプローチです。基本的に、影響は次のようになります。
T count = int.Parse("12T45"); // throws exception
if (int.TryParse("12T45", out count))
{
// Does not throw exception
}
そして、それはディクショナリに引き継がれました。ディクショナリのインデクサーは次のものに委任しGet(index)
ます。
var myvalue = dict["12345"]; // throws exception
myvalue = dict.Get("12345"); // throws exception
if (dict.TryGet("12345", out myvalue))
{
// Does not throw exception
}
これは単に言語の設計方法です。
out
変数は落胆すべきですか?
C#は最初の言語ではなく、特定の状況で目的を持っています。高度な同時実行システムを構築しようとしている場合out
、同時実行境界で変数を使用することはできません。
多くの方法で、言語およびコアライブラリプロバイダーによって支持されているイディオムがある場合、APIでそれらのイディオムを採用しようとします。これにより、APIの一貫性が向上し、その言語に馴染みやすくなります。そのため、Rubyで記述されたメソッドは、C#、C、またはPythonで記述されたメソッドのようには見えません。それらはそれぞれ、コードを構築する好ましい方法を備えており、それを使用することで、APIのユーザーはより迅速にコードを学習できます。
一般的なマップはアンチパターンですか?
それらには目的がありますが、多くの場合、彼らはあなたが持っている目的に対する間違った解決策かもしれません。特に、双方向のマッピングが必要な場合。多くのコンテナとデータを整理する方法があります。使用できるアプローチは多数ありますが、場合によってはそのコンテナを選択する前に少し考える必要があります。
双方向マッピング値の非常に短いリストがある場合は、タプルのリストのみが必要な場合があります。または、構造体のリスト。マッピングの両側で最初の一致を簡単に見つけることができます。
問題のあるドメインを考えて、仕事に最適なツールを選択してください。存在しない場合は、作成します。