हाल ही में, मैं बयानों के 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 ऑब्जेक्ट्स को बर्बाद कर दिया है, जो कुछ भी उनके कंस्ट्रक्टरों में हो सकता है, कर रहा है और केवल उनमें से एक का उपयोग करके समाप्त हो गया है। मेरा यह भी मानना है कि 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;
}
कौन सा आह्वान अधिक स्वीकार्य है?
- शब्दकोश, तेज लुकअप और कम कीवर्ड (केस और ब्रेक) के लिए
- स्विच: कोड में आमतौर पर पाया जाता है, अप्रत्यक्ष के लिए एक फंक <> वस्तु के उपयोग की आवश्यकता नहीं होती है।
fooDict[0] is fooDict[0]
) के साथ लुकअप करते हैं । लैम्ब्डा और स्विच दोनों के साथ ऐसा नहीं है