"टी: क्लास, न्यू ()" का क्या मतलब है?


300

क्या आप कृपया मुझे समझा सकते हैं कि where T : class, new()कोड की निम्नलिखित पंक्ति में क्या मतलब है?

void Add<T>(T item) where T : class, new();

9
बाद में उपयोग के लिए: msdn.microsoft.com/en-us/library/d5x73970.aspx
अहमत काकेशिक

जवाबों:


329

यह सामान्य पैरामीटर पर एक बाधा है T। यह एक class(संदर्भ प्रकार) होना चाहिए और इसमें एक सार्वजनिक पैरामीटर-कम डिफ़ॉल्ट निर्माता होना चाहिए।

मतलब यह है कि Tएक नहीं हो सकता int, float, double, DateTimeया किसी अन्य struct(मूल्य प्रकार)।

यह एक stringया कोई अन्य कस्टम संदर्भ प्रकार हो सकता है , जब तक कि इसमें एक डिफ़ॉल्ट या पैरामीटर-कम निर्माता है।


5
बस स्पष्ट करने के लिए, यदि आपके पास टी के हिस्से के रूप में क्लास क्लॉज नहीं है ... तो यह इंट, फ्लोट, डबल आदि का उपयोग करने के लिए सुरक्षित है
लगभग

1
@AboutDev सही है, आपको अपने सामान्य प्रकार के पैरामीटर पर अड़चन नहीं डालनी है। लेकिन अगर आप एक ऐसी जेनेरिक बना रहे हैं जो केवल संदर्भ या मूल्य प्रकारों पर काम करने की उम्मीद करती है, तो आपको निर्दिष्ट करना चाहिए। एक बाधा के बिना, आप संदर्भ प्रकार (वर्ग) या मूल्य प्रकार (संरचनाएं (इंट, फ्लोट, डबल ...)) की अपेक्षा कर सकते हैं।
NerdFury

1
टी: [इंटरफ़ेस नाम], नया () के बारे में क्या? क्या आपको अभी भी एक पैरामीटर-कम निर्माता की आवश्यकता है?
विंस टिनो

3
जस्टिन की टिप्पणी को स्पष्ट करने के लिए, एक खाली कंस्ट्रक्टर के पास कोई कथन नहीं है (जैसे डिफॉल्ट कंस्ट्रक्टर) जबकि एक पैरामीटर रहित कंस्ट्रक्टर में कथन हो सकते हैं (जैसे किसी सूची को इनिशियलाइज़ करना)।
धर्मतुरल

@VinceTino: new()ठीक निर्दिष्ट करता है "एक सार्वजनिक पैरामीटर रहित निर्माता होना चाहिए"
Flater

162

वे सामान्य प्रकार की बाधाएँ हैं। आपके मामले में उनमें से दो हैं:

where T : class

इसका मतलब है कि प्रकार Tएक संदर्भ प्रकार (एक मूल्य प्रकार नहीं) होना चाहिए।

where T : new()

इसका मतलब है कि टाइप Tमें एक पैरामीटर-कम कंस्ट्रक्टर होना चाहिए। इस बाधा के होने से आप T field = new T();अपने कोड में कुछ ऐसा कर पाएंगे, जिसे आप अन्यथा नहीं कर पाएंगे।

फिर आप दोनों को मिलाने के लिए अल्पविराम का उपयोग कर जोड़ते हैं:

where T : class, new()

दूसरे और तीसरे के लिए अच्छे अंक, बस जानकारी जोड़ने के लिए, मुझे लगता है कि सामान्य बिंदु में प्रतिबिंब करते समय दूसरा बिंदु उपयोगी होता है। जैसे। टी टी = नया टी (); t.GetType ()। GetProperty ("ID")। SetValue (t, uniqueId, null);
जेरी लियांग

1
मेरा मानना ​​है कि यह कहना निरर्थक है कि T: वर्ग, नया (), चूंकि नया () पहले से ही वर्ग का अर्थ है क्योंकि संरचना में डिफ़ॉल्ट निर्माता नहीं हो सकते।
धर्मट्रेल

@DharmaTurtle, "स्ट्रक्चर्स में स्पष्ट पैरामीटर रहित कंस्ट्रक्टर नहीं हो सकते हैं", इसका मतलब यह नहीं है कि उनके पास एक नहीं है, यह कहता है कि आप किसी को परिभाषित नहीं कर सकते। स्रोत: msdn.microsoft.com/tr-tr/tribrary/aa288208(v=vs.71).aspx
rustem

121

जहां टी: संरचना

प्रकार तर्क का मान प्रकार होना चाहिए। Nullable को छोड़कर कोई भी मूल्य प्रकार निर्दिष्ट किया जा सकता है। अधिक जानकारी के लिए अशक्त प्रकार (C # प्रोग्रामिंग गाइड) का उपयोग करना देखें।

जहाँ टी: क्लास

प्रकार तर्क किसी भी वर्ग, इंटरफ़ेस, प्रतिनिधि, या सरणी प्रकार सहित एक संदर्भ प्रकार होना चाहिए। (नीचे दिए गए नोट देखें।)

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

जहां T: [आधार वर्ग का नाम]

प्रकार का तर्क निर्दिष्ट आधार वर्ग से होना चाहिए या प्राप्त होना चाहिए।

जहां T: [इंटरफ़ेस का नाम]

प्रकार तर्क निर्दिष्ट इंटरफ़ेस को होना चाहिए या लागू करना चाहिए। एकाधिक इंटरफ़ेस बाधाओं को निर्दिष्ट किया जा सकता है। विवश करने वाला इंटरफ़ेस सामान्य भी हो सकता है।

जहां टी: यू

T के लिए दिया गया प्रकार तर्क U के लिए दिए गए तर्क से होना चाहिए या प्राप्त होना चाहिए। इसे नग्न प्रकार की बाधा कहा जाता है।


23
यह उपयोगी था, लेकिन स्रोत के लिए लिंक
स्केन

26

class& सामान्य प्रकार के पैरामीटर परnew 2 बाधाएंT हैं ।
क्रमशः वे सुनिश्चित करते हैं:

class

प्रकार तर्क एक संदर्भ प्रकार होना चाहिए; यह किसी भी वर्ग, इंटरफ़ेस, प्रतिनिधि या सरणी प्रकार पर भी लागू होता है।

new

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

उनके संयोजन का अर्थ है कि प्रकार Tएक संदर्भ प्रकार ( मान प्रकार नहीं हो सकता है ) होना चाहिए, और एक पैरामीटर रहित निर्माता होना चाहिए।

उदाहरण:

struct MyStruct { } // structs are value types

class MyClass1 { } // no constructors defined, so the class implicitly has a parameterless one

class MyClass2 // parameterless constructor explicitly defined
{
    public MyClass2() { }
}

class MyClass3 // only non-parameterless constructor defined
{
    public MyClass3(object parameter) { }
}

class MyClass4 // both parameterless & non-parameterless constructors defined
{
    public MyClass4() { }
    public MyClass4(object parameter) { }
}

interface INewable<T>
    where T : new()
{
}

interface INewableReference<T>
    where T : class, new()
{
}

class Checks
{
    INewable<int> cn1; // ALLOWED: has parameterless ctor
    INewable<string> n2; // NOT ALLOWED: no parameterless ctor
    INewable<MyStruct> n3; // ALLOWED: has parameterless ctor
    INewable<MyClass1> n4; // ALLOWED: has parameterless ctor
    INewable<MyClass2> n5; // ALLOWED: has parameterless ctor
    INewable<MyClass3> n6; // NOT ALLOWED: no parameterless ctor
    INewable<MyClass4> n7; // ALLOWED: has parameterless ctor

    INewableReference<int> nr1; // NOT ALLOWED: not a reference type
    INewableReference<string> nr2; // NOT ALLOWED: no parameterless ctor
    INewableReference<MyStruct> nr3; // NOT ALLOWED: not a reference type
    INewableReference<MyClass1> nr4; // ALLOWED: has parameterless ctor
    INewableReference<MyClass2> nr5; // ALLOWED: has parameterless ctor
    INewableReference<MyClass3> nr6; // NOT ALLOWED: no parameterless ctor
    INewableReference<MyClass4> nr7; // ALLOWED: has parameterless ctor
}

1
अच्छा प्रदर्शन। धन्यवाद।
सुभान अली

15

नया (): नया निर्दिष्ट करते हुए () बाधा का अर्थ है कि टाइप T को एक पैरामीटर रहित कंस्ट्रक्टर का उपयोग करना चाहिए, इसलिए किसी ऑब्जेक्ट को उससे तत्काल बनाया जा सकता है - डिफ़ॉल्ट कंस्ट्रक्टर देखें ।

वर्ग: माध्य T एक संदर्भ प्रकार होना चाहिए ताकि यह एक int, float, double, DateTime या अन्य संरचना (मान प्रकार) नहीं हो सके।

public void MakeCars()
{
    //This won't compile as researchEngine doesn't have a public constructor and so can't be instantiated.
    CarFactory<ResearchEngine> researchLine = new CarFactory<ResearchEngine>();
    var researchEngine = researchLine.MakeEngine();

    //Can instantiate new object of class with default public constructor
    CarFactory<ProductionEngine> productionLine = new CarFactory<ProductionEngine>();
    var productionEngine = productionLine.MakeEngine();
}

public class ProductionEngine { }
public class ResearchEngine
{
    private ResearchEngine() { }
}

public class CarFactory<TEngine> where TEngine : class, new()
{
    public TEngine MakeEngine()
    {
        return new TEngine();
    }
}

6

इसका मतलब है कि प्रकार Tएक वर्ग होना चाहिए और एक निर्माता होना चाहिए जो कोई तर्क नहीं लेता है।

उदाहरण के लिए, आपको ऐसा करने में सक्षम होना चाहिए:

T t = new T();

1
सिर्फ एक कंस्ट्रक्टर नहीं, एक कंस्ट्रक्टर है जो कोई तर्क नहीं लेता है।
NerdFury

@NerdFury: धन्यवाद। वह एक महत्वपूर्ण बिट है। सही किया।
इवान मुलवस्की

5

कहाँ (C # संदर्भ)

नया () अवरोधक संकलक को बताता है कि आपूर्ति की गई किसी भी प्रकार के तर्क में एक सुलभ पैरामीटर - या डिफ़ॉल्ट - कंस्ट्रक्टर होना चाहिए

तो यह होना चाहिए, Tएक वर्ग होना चाहिए, और एक सुलभ पैरामीटर रहित होना चाहिए - या डिफ़ॉल्ट निर्माता।


4

"जहाँ" के बाद आता है जेनेरिक प्रकार T पर एक अड़चन है जिसे आपने घोषित किया है, इसलिए:

  • वर्ग का अर्थ है कि T एक वर्ग होना चाहिए न कि एक मूल्य प्रकार या एक संरचना।

  • नया () इंगित करता है कि T वर्ग में एक सार्वजनिक पैरामीटर-मुक्त डिफ़ॉल्ट कंस्ट्रक्टर परिभाषित होना चाहिए।


1

इसे जेनेरिक पैरामीटर T पर एक 'बाधा' कहा जाता है। इसका मतलब है कि T एक संदर्भ प्रकार (एक वर्ग) होना चाहिए और इसका सार्वजनिक डिफ़ॉल्ट निर्माता होना चाहिए।


1

यह जेनरिक मेकेनिज्म का एक हिस्सा है, जहां कीवर्ड उन बाधाओं को जोड़ता है, जिन्हें टाइप पैरामीटर के रूप में उपयोग करने के लिए किस प्रकार को लागू करना चाहिए।


0

अवरोधों में कक्षा का उपयोग करते समय इसका मतलब है कि आप केवल संदर्भ प्रकार का उपयोग कर सकते हैं, जोड़ने के लिए एक और बात यह है कि बाधा नए () का उपयोग करने के लिए , यह आखिरी चीज होनी चाहिए जो आप बाधाओं के संदर्भ में लिखते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.