का विस्तार इससे पहले कि आप की आलोचना और C# specification की §8.7.2 मुझे इशारा करते हुए शुरू करते हैं, ध्यान से पढ़ें :)स्विच बयान - सी #/आईडीई क्षमता
हम सभी जानते हैं कि कैसे स्विच सी # में की तरह दिखता है। ठीक है तो "बुरा" बार विधि
static int barCounter = 0;
public static int Bar()
{
return ++barCounter;
}
इस वर्ग में कहीं न कहीं साथ वर्ग MainWindow
पर विचार हम इस
Action switchCode =() =>
{
switch (Bar())
{
case 1:
Console.WriteLine("First");
break;
case 2:
Console.WriteLine("Second");
break;
}
};
switchCode();
switchCode();
कंसोल विंडो में की तरह कोड है हम देखेंगे
First
Second
सी # में अभिव्यक्तियों का उपयोग करके हम वही कर सकते हैं - एक ही कोड लिखना
var switchValue = Expression.Call(typeof(MainWindow).GetMethod("Bar"));
var WriteLine = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) });
var @switch = Expression.Switch(switchValue,
Expression.SwitchCase(
Expression.Call(WriteLine, Expression.Constant("First")),
Expression.Constant(1)
),
Expression.SwitchCase(
Expression.Call(WriteLine, Expression.Constant("Second")),
Expression.Constant(2)
)
);
Action switchCode = Expression.Lambda<Action>(@switch).Compile();
switchCode();
switchCode();
हम देख सकता है DebugView में इस अभिव्यक्ति
.Switch (.Call WpfApplication1.MainWindow.Bar()) {
.Case (1):
.Call System.Console.WriteLine("First")
.Case (2):
.Call System.Console.WriteLine("Second")
}
Ehmm, क्या हुआ अगर हम Expression.Call
बजाय Expression.Constant
का उपयोग करें "के पीछे कोड"?
public static bool foo1() { return false; }
public static bool foo2() { return true; }
// .....
var foo1 = Ex.Call(typeof(MainWindow).GetMethod("foo1"));
var foo2 = Ex.Call(typeof(MainWindow).GetMethod("foo2"));
var switchValue = Ex.Call(typeof(MainWindow).GetMethod("Bar"));
var WriteLine = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) });
var @switch = Ex.Switch(Ex.Constant(true),
Ex.SwitchCase(
Ex.Call(WriteLine, Ex.Constant("First")),
foo1
),
Ex.SwitchCase(
Ex.Call(WriteLine, Ex.Constant("OK!")),
Ex.Equal(switchValue, Ex.Constant(2))
),
Ex.SwitchCase(
Ex.Call(WriteLine, Ex.Constant("Second")),
foo2
)
);
Action switchCode = Ex.Lambda<Action>(@switch).Compile();
switchCode();
switchCode();
कंसोल खिड़की से पता चलता है, हम
Second
OK!
और अपेक्षा के अनुरूप DebugView
.Switch (True) {
.Case (.Call WpfApplication1.MainWindow.foo1()):
.Call System.Console.WriteLine("First")
.Case (.Call WpfApplication1.MainWindow.Bar() == 2):
.Call System.Console.WriteLine("OK!")
.Case (.Call WpfApplication1.MainWindow.foo2()):
.Call System.Console.WriteLine("Second")
}
तो यह मामला बयान :)
में गैर निरंतर अभिव्यक्ति उपयोग करना संभव है ठीक है, मुझे पता है कि यह छोटा 'गन्दा' कोड है। लेकिन यहां मेरा प्रश्न आता है (अंत में: पी):
क्या ऐसा करने के लिए आईडीई/विजुअलस्टूडियो/कंपाइलर की कार्यक्षमता बढ़ाने का कोई तरीका है, लेकिन अधिक सुरुचिपूर्ण कोड के साथ?
कुछ इस
switch (true)
{
case foo1():
Console.WriteLine("First");
break;
case Bar() == 2:
Console.WriteLine("OK!");
break;
case foo2():
Console.WriteLine("Second");
break;
}
की तरह मैं यह जानता हूँ कुछ विस्तार किया जाएगा और कोड एक ही (नहीं एक ही प्रदर्शन) नहीं होगा। लेकिन मुझे आश्चर्य है कि क्या ऑन-द-फ्लाई पर "चेंज" कोड भी संभव है - जैसे अज्ञात फ़ंक्शन या उपज वापसी नेस्टेड क्लास में बदल जाती है।
मुझे आशा है कि कोई उपरोक्त पाठ से गुजरता है और कुछ सुराग छोड़ देता है।
ऐसी समस्या को हल करने के लिए बहुत सारे प्रयासों की तरह लगता है जो अस्तित्व में नहीं है। स्विच लगातार लुकअप समय की पेशकश कर सकते हैं। परिदृश्यों में यह एक बड़ी बात है जहां आपके पास बड़ी संख्या में संभावित मूल्य हैं। बस 'if/else if' की श्रृंखला का उपयोग करें और वास्तविक समस्याओं को हल करने के लिए आगे बढ़ें (या ऐसी भाषा का उपयोग करें जो बोर्ड में प्रदर्शन पर अभिव्यक्ति का पक्ष लेती है)। –
@EdS। आपको लगता है कि मुझे
if/else if
के बारे में पता नहीं है? यह "चुनौती" है कि यह कैसे करें, समस्या नहीं है "मैं बुलियन-कंडीशन-स्टेटमेंट का समूह कैसे उपयोग कर सकता हूं"। असल में मैंने PHP और जावास्क्रिप्ट का उपयोग किया, बहुत कुछ ऊपर जैसा है। यदि आप कुछ वास्तविक समस्या चाहते हैं: http://stackoverflow.com/q/9536087/1245315 – Carnifexनहीं, मुझे लगता है कि आप अपना समय बर्बाद कर रहे हैं और वास्तविक समस्याओं को हल करने के लिए इसका उपयोग नहीं कर रहे हैं। हां, ऐसी भाषाएं हैं जो आप प्रस्तावित कर सकते हैं, वे निरंतर समय की तलाश भी नहीं कर सकते हैं। इस जीवन में आपके पास केवल सीमित समय है, मेरी सलाह है कि इस तरह की चीजों पर इसे न खोएं, जिसका किसी के लिए कोई प्रशंसनीय लाभ नहीं है। एक प्रोग्रामिंग भाषा सिर्फ एक उपकरण है, न कि खुद के लिए एक लक्ष्य। आपके अन्य प्रश्न के लिए ... कोई धन्यवाद नहीं, यूआई क्विर्क मुझे रूचि नहीं देते हैं, यही कारण है कि मैं जीवित रहने के लिए यूआई का निर्माण नहीं करता :) –