स्टेटिक सी # में जेनेरिक क्लास के मुख्य उपयोग क्या हैं? उन्हें कब उपयोग किया जाना चाहिए? उनके उपयोग का सबसे अच्छा उदाहरण क्या है?
मुझे लगता है कि सामान्य रूप से, आपको स्थिर वर्गों पर प्रकार पैरामीटर बनाने से बचना चाहिए, अन्यथा आप अपने ग्राहक कोड को अधिक संक्षिप्त बनाने के लिए प्रकार-अनुमान पर निर्भर नहीं हो सकते हैं।
एक ठोस उदाहरण देने के लिए, मान लीजिए कि आप सूचियों पर संचालन को संभालने के लिए एक स्थिर उपयोगिता कक्षा लिख रहे हैं। आप कक्षा को दो तरीकों से लिख सकते हैं:
// static class with generics
public static class ListOps<T>
{
public static List<T> Filter(List<T> list, Func<T, bool> predicate) { ... }
public static List<U> Map<U>(List<T> list, Func<T, U> convertor) { ... }
public static U Fold<U>(List<T> list, U seed, Func<T, U> aggregator) { ... }
}
// vanilla static class
public static class ListOps
{
public static List<T> Filter<T>(List<T> list, Func<T, bool> predicate) { ... }
public static List<U> Map<T, U>(List<T> list, Func<T, U> convertor) { ... }
public static U Fold<T, U>(List<T> list, U seed, Func<T, U> aggregator) { ... }
}
लेकिन कक्षाएं बराबर हैं, लेकिन कौन सा उपयोग करना आसान है? की तुलना करें:
// generic static class
List<int> numbers = Enumerable.Range(0, 100).ToList();
List<int> evens = ListOps<int>.Filter(numbers, x => x % 2 = 0);
List<string> numberString = ListOps<int>.Map(numbers, x => x.ToString());
int sumOfSquares = ListOps<int>.Fold(numbers, 0, (acc, x) => acc + x*x);
// vanilla static class
List<int> numbers = Enumerable.Range(0, 100).ToList();
List<int> evens = ListOps.Filter(numbers, x => x % 2 = 0);
List<string> numberString = ListOps.Map(numbers, x => x.ToString());
int sumOfSquares = ListOps.Fold(numbers, 0, (acc, x) => acc + b * b);
मेरी राय में, ListOps<someType>
भारी और अनाड़ी है। वेनिला वर्ग की परिभाषा थोड़ी बड़ी है, लेकिन क्लाइंट कोड पढ़ने में आसान है - अनुमान लगाने के लिए धन्यवाद।
सबसे बुरे मामले में, सी # प्रकारों का अनुमान नहीं लगा सकता है, और आपको उन्हें हाथ से निर्दिष्ट करना होगा। क्या आप ListOps<A>.Map<B>(...)
या ListOps.Map<A, B>(...)
लिखेंगे? मेरी वरीयता बाद की ओर है।
रणनीति ऊपर विशेष रूप से अच्छी तरह से जब अपने स्थिर वर्ग रखती कोई परिवर्तनशील राज्य, या उसके परिवर्तनशील राज्य संकलन समय पर में जाना जाता है काम करता है।
यदि स्थैतिक वर्ग में उत्परिवर्तनीय राज्य होता है जिसका प्रकार संकलन समय पर निर्धारित नहीं होता है, तो संभवतः आपके पास सामान्य पैरा के साथ स्थिर वर्ग के लिए उपयोग का मामला है। उम्मीद है कि ये मौके कुछ और बहुत दूर हैं, लेकिन जब ऐसा होता है, तो आप खुश होंगे सी # कार्यक्षमता का समर्थन करता है।
उत्तर के हिस्से के रूप में स्थिर लैम्ब्डा अभिव्यक्ति बनाने वाले निर्माता का नमूना रखना जानकारीपूर्ण होगा। – Jim