2011-01-03 21 views
19

मैंने इसे Google पर करने का प्रयास किया, लेकिन मुझे लगता है कि सामान्य वर्ग घोषणाओं पर दस्तावेज थे।सी # कक्षा घोषणा में "कहां" का अर्थ क्या है?

public class DataContextWrapper<T> : IDataContextWrapper where T : DataContext, new() 
{ 

} 

मुझे लगता है कि वर्ग को लागू करता है IDataContextWrapper, DataContext से विरासत है और यह कैसे instantiated है पर निर्भर करता है प्रकार टी के साथ बदलता रहता है।

मुझे नहीं पता कि "where T" या ", new()" का अर्थ हो सकता है।

+7

सी # विनिर्देश पढ़ने जब आप भाषा सिंटैक्स के बारे में एक सवाल है पर विचार करें देखें; यह काफी विस्तृत है। –

उत्तर

38

यह generic constraint है और जेनेरिक पैरामीटर में किस प्रकार को पारित किया जा सकता है प्रतिबंधित करता है।

आपके मामले में यह जरूरी है कि T को indentical या DataContext से प्राप्त होता है और एक डिफ़ॉल्ट (argumentless) निर्माता (new() बाधा) है।

आपको जेनेरिक प्रकार के साथ वास्तव में कुछ गैर-तुच्छ करने के लिए सामान्य बाधाओं की आवश्यकता होती है।

  • new() बाधा आपको new T() के साथ एक उदाहरण बनाने की अनुमति देती है।
  • DataContext बाधा आप T

का एक उदाहरण MSDN लिखा था पर DataContext के तरीकों कॉल करने के लिए अनुमति देता है:

where T : <base class name> प्रकार तर्क है या निर्दिष्ट आधार वर्ग से निकाले जाते हैं चाहिए।

where T : new() प्रकार तर्क में सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए। जब अन्य बाधाओं के साथ एक साथ उपयोग किया जाता है, तो नई() बाधा अंतिम निर्दिष्ट की जानी चाहिए।

+1

+1, लेकिन जहां टी: वर्ग टी: SomeClassName से भिन्न है, इसलिए एमएसडीएन स्निपेट का पहला भाग ओपी के लिए प्रासंगिक नहीं है। – KeithS

+0

@KeithS ओह, इसे – CodesInChaos

+0

@CodeInChaos - उत्कृष्ट उत्तर तय करें। हालांकि मैं उत्सुक हूं, कोई भी वास्तविक प्रकार क्यों निर्दिष्ट करेगा (उदा।, जहां टी: डेटा कॉन्टेक्स्ट)। जेनेरिक का पूरा बिंदु रनटाइम पर प्रकार निर्दिष्ट करना है। –

13

केवल प्रकार टी कि से ली गई या DataContext को लागू कर रहे हैं अनुमति देते हैं, और एक सार्वजनिक निर्माता है कि कोई तर्क लेता है।

+1

'टी' को एक गैर-सार प्रकार का भी प्रतिनिधित्व करना चाहिए। यह महत्वपूर्ण है क्योंकि 'नई टी() 'को कॉल करना कानूनी है जब' नई() 'बाधा लगाई गई है। साथ ही, यदि 'DataContext' एक वर्ग है, तो 'T' * * डेटाकॉन्टेक्स्ट' हो सकता है (इसके बजाय व्युत्पन्न होने के बजाय)। – Ani

5

यह एक सामान्य प्रकार का प्रतिबंध है। इस मामले में, टी को डेटाकॉन्टेक्स्ट से उत्तराधिकारी होना चाहिए और एक ऐसे निर्माता के साथ होना चाहिए जिसमें कोई तर्क न हो।

+3

इसे एक संदर्भ प्रकार की आवश्यकता नहीं है। 'नया()' structs पर भी लागू होता है। –

+0

धन्यवाद। मैंने अपना जवाब सही कर दिया है। –

4

जहां टी: डेटाकॉन्टेक्स्ट इस प्रकार पढ़ता है: टी डेटा कॉन्टेक्स्ट "(नया()" के रूप में पढ़ा जाना चाहिए: जैसा कि एक पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए।

9

यह generic type constraint है और सामान्य प्रकारों पर बाधा निर्दिष्ट करता है (उदाहरण के लिए, केवल कक्षाएं, या एक विशिष्ट इंटरफ़ेस को लागू करना चाहिए)।

इस मामले में, T एक वर्ग है कि या तो DataContext है या यह से विरासत और एक parameterless सार्वजनिक निर्माता (new() बाधा) होना चाहिए होना चाहिए।

4

where कीवर्ड आपके मामले में इसका मतलब है कि प्रकार T एक DataContext होना चाहिए और एक सार्वजनिक डिफ़ॉल्ट निर्माता शामिल होना चाहिए, अपने सामान्य प्रकार चर विवश किया जाता है।

+0

"* होना चाहिए * एक सार्वजनिक डिफ़ॉल्ट कन्स्ट्रक्टर होना चाहिए" – Richard

+0

हां, यह सच है :)। –

2

यह उन प्रकारों में बाधा है जिन्हें सामान्य के रूप में उपयोग किया जा सकता है।यह आपको कंपाइलर चेक और टी

आई के साथ सार्थक कुछ करने की क्षमता देता है Ie। new() संकलक को बताता है कि टी में पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए। इसका मतलब यह है कि आप new T(); लिखकर टी के उदाहरणों को तत्काल कर सकते हैं और टी जानकर डेटाकॉन्टेक्स्ट भी है, आप दोनों टी के उदाहरण बना सकते हैं लेकिन इसके बारे में कॉल भी कर सकते हैं।

2

जहां की टी नई प्रकार पर एक बाधा जगह है का कहना है कि प्रकार टी किसी भी पैरामीटर के बिना instantiable होना चाहिए देखें। यानी टी चीज = नया टी();

अधिक here

संबंधित मुद्दे