Son zamanlarda, ifadeler Dictionaries
yerine 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