यह भी याद रखें कि लिनेक क्वेरी को अधिक पठनीय बनाने में मदद करने के लिए एक विस्तार तरीके के रूप में जोड़ा गया था, जब उनका सी # शैली में उपयोग किया जाता था।
ये 2 प्रभाव बिल्कुल समतुल्य हैं, फिर भी पहले से बहुत अधिक पठनीय है (और पठनीयता में अंतर अधिक विधियों के साथ बढ़ेगा)।
int n1 = new List<int> {1,2,3}.Where(i => i % 2 != 0).Last();
int n2 = Enumerable.Last(Enumerable.Where(new List<int> {1,2,3}, i => i % 2 != 0));
ध्यान दें कि पूरी तरह से योग्य सिंटैक्स भी होना चाहिए:
int n1 = new List<int> {1,2,3}.Where<int>(i => i % 2 != 0).Last<int>();
int n2 = Enumerable.Last<int>(Enumerable.Where<int>(new List<int> {1,2,3}, i => i % 2 != 0));
संयोग से, के प्रकार के मापदंडों Where
और Last
स्पष्ट रूप से उल्लेख किया जाना के रूप में वे इन दोनों तरीकों के पहले पैरामीटर (पैरामीटर जो कीवर्ड द्वारा शुरू की है की उपस्थिति के लिए धन्यवाद infered किया जा सकता है की जरूरत नहीं हैthis
है और उन्हें विस्तार तरीकों बनाने)।
यह बिंदु स्पष्ट रूप से विस्तार के तरीकों का एक फायदा (दूसरों के बीच) है, और आप हर समान परिदृश्य में इसका लाभ उठा सकते हैं जहां विधि का समावेश होता है।
विशेष रूप से, यह अधिक सुंदर और आश्वस्त करने वाला तरीका है जो मुझे किसी भी उपवर्ग द्वारा एक बेस क्लास विधि को अदृश्य करने के लिए मिला है और इस उपवर्ग (उपवर्ग प्रकार के साथ) को दृढ़ता से टाइप किया गया संदर्भ लौटाता है।
उदाहरण (ठीक है, यह परिदृश्य पूरी तरह से लजीज है): एक अच्छी रात के बाद, एक जानवर आँखें खोलता है फिर रोता है; हर जानवर उसी तरह से आँखें खोलता है, जबकि एक कुत्ता भौंकता है और एक बत्तख का बच्चा।
public abstract class Animal
{
}
public static class AnimalExtension
{
public static TAnimal OpenTheEyes<TAnimal>(this TAnimal animal) where TAnimal : Animal
{
return animal;
}
}
public class Dog : Animal
{
public void Bark() { }
}
public class Duck : Animal
{
public void Kwak() { }
}
class Program
{
static void Main(string[] args)
{
Dog Goofy = new Dog();
Duck Donald = new Duck();
Goofy.OpenTheEyes().Bark();
Donald.OpenTheEyes().Kwak();
}
}
सैद्धांतिक रूप OpenTheEyes
से एक होना चाहिए Animal
विधि है, लेकिन यह तो अमूर्त वर्ग का एक उदाहरण वापसी होगी Animal
, जो जैसे विशिष्ट उपवर्ग तरीकों पता नहीं है Bark
या Duck
या जो कुछ भी। 2 पंक्तियों के रूप में टिप्पणी * 1 और * 2 तब एक संकलन त्रुटि उठाएगा।
लेकिन विस्तार के तरीकों के लिए धन्यवाद, हमारे पास एक प्रकार की "आधार विधि हो सकती है जो उपवर्ग प्रकार को जानता है जिस पर इसे कहा जाता है"।
ध्यान दें कि एक सामान्य सामान्य विधि काम कर सकती थी, लेकिन कहीं अधिक अजीब तरीके से:
public abstract class Animal
{
public TAnimal OpenTheEyes<TAnimal>() where TAnimal : Animal
{
return (TAnimal)this;
}
}
इस बार, कोई पैरामीटर नहीं है और इस प्रकार कोई संभावित वापसी प्रकार का अनुमान नहीं है। कॉल के अलावा कुछ नहीं हो सकता है:
Goofy.OpenTheEyes<Dog>().Bark();
Donald.OpenTheEyes<Duck>().Kwak();
... जो कोड को बहुत अधिक वजन कर सकता है यदि अधिक चैनिंग शामिल है (विशेष रूप से यह जानते हुए कि प्रकार पैरामीटर हमेशा <Dog>
नासमझ की लाइन <Duck>
पर और डोनाल्ड एक पर होगा ...)