Son zamanlarda, ifadeler Dictionariesyerine 1-1 ilişkilerini eşlemeyi tercih ettim Switch. Yazmanın biraz daha hızlı ve zihinsel olarak işlenmesinin daha kolay olduğunu düşünüyorum. Ne yazık ki, bir nesnenin yeni bir örneğiyle eşlerken, bunu şu şekilde tanımlamak istemiyorum:
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
Bu yapı göz önüne alındığında, CPU döngülerini ve belleklerini 3 nesne oluşturarak, kurucularının içerebileceği her şeyi yaptım ve sadece bunlardan birini kullanarak boşa harcadım. Ayrıca fooDict[0], bu durumda diğer nesnelerin eşlenmesinin Foo, amaçlandığı gibi yeni bir örnek oluşturmak yerine, aynı şeye başvurmalarına neden olacağına inanıyorum . Bunun yerine bir çözüm lambda kullanmak olacaktır:
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();'
Bu çok kafa karıştırıcı bir noktaya mı geliyor? Sonunda bunu kaçırmak kolaydır (). Yoksa bir işleve / ifadeye eşleme yapmak oldukça yaygın bir uygulama mıdır? Alternatif bir anahtar kullanmak olacaktır:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
Hangi çağırma daha kabul edilebilir?
- Daha hızlı aramalar ve daha az anahtar kelime için (büyük / küçük harf) sözlük
- Anahtar: Kodda daha yaygın olarak bulunan, dolaylı olarak bir Func <> nesnesinin kullanılmasını gerektirmez.
fooDict[0] is fooDict[0]) aynı örneğe sahip olursunuz . hem lambda hem de anahtar ile durum böyle değil