यहां पहले से ही कई अच्छे जवाब हैं, जो चेतावनी और इसके कारण को स्पष्ट करते हैं। इनमें से कई राज्य एक सामान्य प्रकार में एक स्थिर क्षेत्र होने की तरह आम तौर पर एक गलती है ।
मैंने सोचा कि मैं एक उदाहरण जोड़ूंगा कि यह सुविधा कैसे उपयोगी हो सकती है, यानी एक ऐसा मामला जहां आर # दबाने से समझ में आता है।
कल्पना कीजिए कि आपके पास इकाई-वर्गों का एक सेट है जिसे आप क्रमबद्ध करना चाहते हैं, एक्सएमएल से कहें। आप इस का उपयोग करने के लिए एक serializer बना सकते हैं new XmlSerializerFactory().CreateSerializer(typeof(SomeClass))
, लेकिन फिर आपको प्रत्येक प्रकार के लिए एक अलग serializer बनाना होगा। जेनेरिक का उपयोग करते हुए, आप इसे निम्नलिखित के साथ बदल सकते हैं, जिसे आप एक सामान्य वर्ग में रख सकते हैं, जो निकाय इससे प्राप्त कर सकते हैं:
new XmlSerializerFactory().CreateSerializer(typeof(T))
चूँकि आपका संभवत: हर बार आपको किसी विशेष प्रकार की आवृत्ति को क्रमबद्ध करने के लिए एक नया धारावाहिक बनाने की ज़रूरत नहीं है, आप इसे जोड़ सकते हैं:
public class SerializableEntity<T>
{
// ReSharper disable once StaticMemberInGenericType
private static XmlSerializer _typeSpecificSerializer;
private static XmlSerializer TypeSpecificSerializer
{
get
{
// Only create an instance the first time. In practice,
// that will mean once for each variation of T that is used,
// as each will cause a new class to be created.
if ((_typeSpecificSerializer == null))
{
_typeSpecificSerializer =
new XmlSerializerFactory().CreateSerializer(typeof(T));
}
return _typeSpecificSerializer;
}
}
public virtual string Serialize()
{
// .... prepare for serializing...
// Access _typeSpecificSerializer via the property,
// and call the Serialize method, which depends on
// the specific type T of "this":
TypeSpecificSerializer.Serialize(xmlWriter, this);
}
}
यदि यह वर्ग सामान्य नहीं था, तो कक्षा का प्रत्येक उदाहरण उसी का उपयोग करेगा _typeSpecificSerializer
।
हालांकि, यह सामान्य है, लेकिन इसके लिए एक ही प्रकार के उदाहरणों का एक सेट (जो उस विशिष्ट प्रकार के लिए बनाया गया है) T
का एक उदाहरण साझा _typeSpecificSerializer
करेगा, जबकि विभिन्न प्रकार के लिए T
उदाहरणों के विभिन्न उदाहरणों का उपयोग करेगा _typeSpecificSerializer
।
एक उदाहरण
दो वर्गों का विस्तार किया है SerializableEntity<T>
:
// Note that T is MyFirstEntity
public class MyFirstEntity : SerializableEntity<MyFirstEntity>
{
public string SomeValue { get; set; }
}
// Note that T is OtherEntity
public class OtherEntity : SerializableEntity<OtherEntity >
{
public int OtherValue { get; set; }
}
... चलो उनका उपयोग करें:
var firstInst = new MyFirstEntity{ SomeValue = "Foo" };
var secondInst = new MyFirstEntity{ SomeValue = "Bar" };
var thirdInst = new OtherEntity { OtherValue = 123 };
var fourthInst = new OtherEntity { OtherValue = 456 };
var xmlData1 = firstInst.Serialize();
var xmlData2 = secondInst.Serialize();
var xmlData3 = thirdInst.Serialize();
var xmlData4 = fourthInst.Serialize();
इस मामले में, हुड के तहत, firstInst
और secondInst
एक ही वर्ग (अर्थात् SerializableEntity<MyFirstEntity>
) के उदाहरण होंगे , और जैसे, वे एक उदाहरण साझा करेंगे _typeSpecificSerializer
।
thirdInst
और fourthInst
एक अलग वर्ग (के उदाहरण हैं SerializableEntity<OtherEntity>
), और इसलिए एक उदाहरण साझा करेंगे की _typeSpecificSerializer
वह यह है कि विभिन्न अन्य दो से।
इसका मतलब है कि आपको अपने प्रत्येक इकाई प्रकार के लिए अलग-अलग क्रमबद्ध-इंस्टेंसेस मिलते हैं , जबकि अभी भी उन्हें प्रत्येक वास्तविक प्रकार के संदर्भ में स्थिर रखा जाता है (यानी, एक विशिष्ट प्रकार के उदाहरणों के बीच साझा किया जाता है)।