जवाबों:
यह सामान्य पैरामीटर पर एक बाधा है T
। यह एक class
(संदर्भ प्रकार) होना चाहिए और इसमें एक सार्वजनिक पैरामीटर-कम डिफ़ॉल्ट निर्माता होना चाहिए।
मतलब यह है कि T
एक नहीं हो सकता int
, float
, double
, DateTime
या किसी अन्य struct
(मूल्य प्रकार)।
यह एक string
या कोई अन्य कस्टम संदर्भ प्रकार हो सकता है , जब तक कि इसमें एक डिफ़ॉल्ट या पैरामीटर-कम निर्माता है।
new()
ठीक निर्दिष्ट करता है "एक सार्वजनिक पैरामीटर रहित निर्माता होना चाहिए"
वे सामान्य प्रकार की बाधाएँ हैं। आपके मामले में उनमें से दो हैं:
where T : class
इसका मतलब है कि प्रकार T
एक संदर्भ प्रकार (एक मूल्य प्रकार नहीं) होना चाहिए।
where T : new()
इसका मतलब है कि टाइप T
में एक पैरामीटर-कम कंस्ट्रक्टर होना चाहिए। इस बाधा के होने से आप T field = new T();
अपने कोड में कुछ ऐसा कर पाएंगे, जिसे आप अन्यथा नहीं कर पाएंगे।
फिर आप दोनों को मिलाने के लिए अल्पविराम का उपयोग कर जोड़ते हैं:
where T : class, new()
जहां टी: संरचना
प्रकार तर्क का मान प्रकार होना चाहिए। Nullable को छोड़कर कोई भी मूल्य प्रकार निर्दिष्ट किया जा सकता है। अधिक जानकारी के लिए अशक्त प्रकार (C # प्रोग्रामिंग गाइड) का उपयोग करना देखें।
जहाँ टी: क्लास
प्रकार तर्क किसी भी वर्ग, इंटरफ़ेस, प्रतिनिधि, या सरणी प्रकार सहित एक संदर्भ प्रकार होना चाहिए। (नीचे दिए गए नोट देखें।)
जहां T: नया () प्रकार तर्क में एक सार्वजनिक पैरामीटर रहित निर्माता होना चाहिए। जब अन्य बाधाओं के साथ संयोजन में उपयोग किया जाता है, तो नए () बाधा को अंतिम रूप से निर्दिष्ट किया जाना चाहिए।
जहां T: [आधार वर्ग का नाम]
प्रकार का तर्क निर्दिष्ट आधार वर्ग से होना चाहिए या प्राप्त होना चाहिए।
जहां T: [इंटरफ़ेस का नाम]
प्रकार तर्क निर्दिष्ट इंटरफ़ेस को होना चाहिए या लागू करना चाहिए। एकाधिक इंटरफ़ेस बाधाओं को निर्दिष्ट किया जा सकता है। विवश करने वाला इंटरफ़ेस सामान्य भी हो सकता है।
जहां टी: यू
T के लिए दिया गया प्रकार तर्क U के लिए दिए गए तर्क से होना चाहिए या प्राप्त होना चाहिए। इसे नग्न प्रकार की बाधा कहा जाता है।
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
}
नया (): नया निर्दिष्ट करते हुए () बाधा का अर्थ है कि टाइप 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();
}
}
इसका मतलब है कि प्रकार T
एक वर्ग होना चाहिए और एक निर्माता होना चाहिए जो कोई तर्क नहीं लेता है।
उदाहरण के लिए, आपको ऐसा करने में सक्षम होना चाहिए:
T t = new T();
नया () अवरोधक संकलक को बताता है कि आपूर्ति की गई किसी भी प्रकार के तर्क में एक सुलभ पैरामीटर - या डिफ़ॉल्ट - कंस्ट्रक्टर होना चाहिए
तो यह होना चाहिए, T
एक वर्ग होना चाहिए, और एक सुलभ पैरामीटर रहित होना चाहिए - या डिफ़ॉल्ट निर्माता।
"जहाँ" के बाद आता है जेनेरिक प्रकार T पर एक अड़चन है जिसे आपने घोषित किया है, इसलिए:
वर्ग का अर्थ है कि T एक वर्ग होना चाहिए न कि एक मूल्य प्रकार या एक संरचना।
नया () इंगित करता है कि T वर्ग में एक सार्वजनिक पैरामीटर-मुक्त डिफ़ॉल्ट कंस्ट्रक्टर परिभाषित होना चाहिए।
इसे जेनेरिक पैरामीटर T पर एक 'बाधा' कहा जाता है। इसका मतलब है कि T एक संदर्भ प्रकार (एक वर्ग) होना चाहिए और इसका सार्वजनिक डिफ़ॉल्ट निर्माता होना चाहिए।
यह जेनरिक मेकेनिज्म का एक हिस्सा है, जहां कीवर्ड उन बाधाओं को जोड़ता है, जिन्हें टाइप पैरामीटर के रूप में उपयोग करने के लिए किस प्रकार को लागू करना चाहिए।