最近、ステートメントのDictionaries
代わりに1-1の関係をマッピングすることを好むようになりましたSwitch
。書くのが少し速く、精神的に処理するのが簡単だと思います。残念ながら、オブジェクトの新しいインスタンスにマッピングするとき、次のように定義したくありません。
var fooDict = new Dictionary<int, IBigObject>()
{
{ 0, new Foo() }, // Creates an instance of Foo
{ 1, new Bar() }, // Creates an instance of Bar
{ 2, new Baz() } // Creates an instance of Baz
}
var quux = fooDict[0]; // quux references Foo
そのコンストラクトを考えると、CPUサイクルとメモリを無駄にして3つのオブジェクトを作成し、コンストラクターに含まれている可能性のある処理をすべて実行し、そのうちの1つだけを使用することになりました。またfooDict[0]
、この場合、他のオブジェクトをマッピングするとFoo
、意図したとおりの新しいインスタンスを作成するのではなく、同じものを参照することになります。解決策は、代わりにラムダを使用することです:
var fooDict = new Dictionary<int, Func<IBigObject>>()
{
{ 0, () => new Foo() }, // Returns a new instance of Foo when invoked
{ 1, () => new Bar() }, // Ditto Bar
{ 2, () => new Baz() } // Ditto Baz
}
var quux = fooDict[0](); // equivalent to saying 'var quux = new Foo();'
これはあまりにも混乱を招くポイントになっていますか?()
最後に見逃すのは簡単です。または、関数/式へのマッピングはかなり一般的な習慣ですか?別の方法は、スイッチを使用することです。
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
どの呼び出しがより受け入れられますか?
- 辞書、より高速な検索とより少ないキーワード(大文字と小文字の区別)
- スイッチ:コードでより一般的に見られますが、間接指定にFunc <>オブジェクトを使用する必要はありません。
fooDict[0] is fooDict[0]
)。ラムダとスイッチの両方では、そうではありません