नीचे दिए गए उत्तर को वर्षों पहले लिखा गया था और समय के साथ अद्यतन किया गया था। C # 7 के अनुसार, आप पैटर्न मिलान का उपयोग कर सकते हैं:
if (animal is Dog dog)
{
// Use dog here
}
ध्यान दें कि बयान के dog
बाद भी गुंजाइश है if
, लेकिन निश्चित रूप से असाइन नहीं किया गया है।
नहीं, वहाँ नहीं है। हालांकि इसे लिखना अधिक मुहावरेदार है:
Dog dog = animal as Dog;
if (dog != null)
{
// Use dog
}
यह देखते हुए कि "जैसा कि यदि बाद में" लगभग हमेशा इस तरह से उपयोग किया जाता है, तो यह एक ऑपरेटर होने के लिए और अधिक समझ में आता है जो एक ही बार में दोनों भागों का प्रदर्शन करता है। यह वर्तमान में C # 6 में नहीं है, लेकिन पैटर्न मिलान प्रस्ताव लागू होने पर C # 7 का हिस्सा हो सकता है।
समस्या यह है कि आप एक कथन 1 के हालत भाग में एक चर घोषित नहीं कर सकते । निकटतम दृष्टिकोण जो मैं सोच सकता हूं वह यह है:if
// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
...
}
यह सिर्फ बुरा है ... (मैंने अभी इसकी कोशिश की है, और यह काम करता है। लेकिन कृपया, कृपया ऐसा न करें। ओह, और आप पाठ्यक्रम dog
का उपयोग करने var
की घोषणा कर सकते हैं ।)
बेशक आप एक विस्तार विधि लिख सकते हैं:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
T t = value as T;
if (t != null)
{
action(t);
}
}
फिर इसके साथ कॉल करें:
animal.AsIf<Dog>(dog => {
// Use dog in here
});
वैकल्पिक रूप से, आप दोनों को जोड़ सकते हैं:
public static void AsIf<T>(this object value, Action<T> action) where T : class
{
// EVIL EVIL EVIL
for (var t = value as T; t != null; t = null)
{
action(t);
}
}
आप लूप्ड एक्सप्रेशन के बिना एक लूप एक्सप्रेशन को लूप के लिए क्लीनर तरीके से उपयोग कर सकते हैं:
public static IEnumerable<T> AsOrEmpty(this object value)
{
T t = value as T;
if (t != null)
{
yield return t;
}
}
फिर:
foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
// use dog
}
1 आप कथनों में मूल्यों को निर्दिष्ट कर सकते हैंif
, हालांकि मैं शायद ही कभी ऐसा करता हूं। हालांकि यह वैरिएबल घोषित करने के समान नहीं है। डेटा की धाराओं को पढ़ते समय यह मेरे लिए बहुत असामान्य नहीं है while
। उदाहरण के लिए:
string line;
while ((line = reader.ReadLine()) != null)
{
...
}
इन दिनों मैं आम तौर पर एक रैपर का उपयोग करना पसंद करता हूं जो मुझे उपयोग करने देता है foreach (string line in ...)
लेकिन मैं ऊपर एक सुंदर मुहावरेदार पैटर्न के रूप में देखता हूं। यह आम तौर पर अच्छा एक शर्त के भीतर दुष्प्रभाव के लिए नहीं है, लेकिन विकल्प आमतौर पर कोड दोहराव शामिल है, और जब आप इस पैटर्न पता है कि यह सही पाने के लिए आसान है।
bool
हालत क्या होगी ?