फिलहाल यह रोसलिन संकलक द्वारा बॉक्स से बाहर समर्थित नहीं है ...
अब तक, एक्सटेंशन गुण C # मानक के पिछले संस्करणों में शामिल किए जाने के लिए पर्याप्त मूल्यवान नहीं देखे गए थे। C # 7 और C # 8.0 ने इसे प्रस्ताव चैंपियन के रूप में देखा है, लेकिन यह अभी तक जारी नहीं किया गया था, क्योंकि सभी में से अधिकांश यदि पहले से ही एक कार्यान्वयन है, तो वे इसे शुरू से ही सही बनाना चाहते हैं।
लेकिन यह होगा ...
C # 7 कार्य सूची में एक एक्सटेंशन सदस्य आइटम है, इसलिए निकट भविष्य में इसका समर्थन किया जा सकता है। संबंधित संपत्ति की वर्तमान स्थिति Github पर संबंधित मद के तहत पाई जा सकती है ।
हालांकि, एक और भी अधिक आशाजनक विषय है, जो विशेष रूप से गुणों और स्थिर वर्गों या यहां तक कि क्षेत्रों पर ध्यान देने के साथ "सब कुछ का विस्तार" है ।
इसके अलावा आप एक वैकल्पिक हल का उपयोग कर सकते हैं
जैसा कि इस लेख में निर्दिष्ट किया गया है , आप TypeDescriptor
रनटाइम पर किसी ऑब्जेक्ट उदाहरण के लिए एक विशेषता संलग्न करने की क्षमता का उपयोग कर सकते हैं । हालांकि, यह मानक गुणों के सिंटैक्स का उपयोग नहीं कर रहा है।
यह सिंटैक्टिक शुगर से थोड़ा अलग है, एक विस्तारित संपत्ति को परिभाषित करने की संभावना को बढ़ाता है जैसे
string Data(this MyClass instance)
विस्तार विधि के लिए एक उपनाम के
string GetData(this MyClass instance)
रूप में क्योंकि यह डेटा को कक्षा में संग्रहीत करता है।
मुझे उम्मीद है कि C # 7 एक पूर्ण विशेषताओं वाला सब कुछ (गुण और क्षेत्र) प्रदान करेगा, हालांकि उस बिंदु पर, केवल समय ही बताएगा।
और योगदान करने के लिए स्वतंत्र महसूस करें क्योंकि कल का सॉफ्टवेयर समुदाय से आएगा।
अपडेट: अगस्त २०१६
डॉटनेट टीम ने प्रकाशित किया कि C # 7.0 में नया क्या है और मैड्स टॉर्गेंसन की एक टिप्पणी से :
विस्तार गुण: हमारे पास एक शानदार (शानदार!) इंटर्न गर्मियों में प्रयोग के रूप में लागू होता है, साथ ही साथ अन्य प्रकार के विस्तार सदस्य भी होते हैं। हम इसमें रुचि रखते हैं, लेकिन यह एक बड़ा बदलाव है और हमें विश्वास करने की आवश्यकता है कि यह इसके लायक है।
ऐसा लगता है कि विस्तार गुण और अन्य सदस्य, अभी भी रोज़लिन के भविष्य के रिलीज में शामिल होने के लिए अच्छे उम्मीदवार हैं, लेकिन शायद 7.0 नहीं।
अपडेट: मई २०१ May
एक्सटेंशन के सदस्यों को एक्सटेंशन सब कुछ के डुप्लिकेट के रूप में बंद कर दिया गया हैजो कि बंद भी है। मुख्य चर्चा वास्तव में एक व्यापक अर्थ में टाइप एक्स्टेंसिबिलिटी के बारे में थी। इस सुविधा को अब एक प्रस्ताव के रूप में यहां ट्रैककिया गया है और 7.0 मील के पत्थर से हटा दिया गया है।
अपडेट: अगस्त, 2017 - सी # 8.0 प्रस्तावित सुविधा
हालांकि यह अभी भी केवल एक प्रस्तावित विशेषता बनी हुई है , अब हमारे पास एक स्पष्ट दृष्टिकोण है कि इसका सिंटैक्स क्या होगा। ध्यान रखें कि यह विस्तार विधियों के लिए भी नया वाक्यविन्यास होगा:
public interface IEmployee
{
public decimal Salary { get; set; }
}
public class Employee
{
public decimal Salary { get; set; }
}
public extension MyPersonExtension extends Person : IEmployee
{
private static readonly ConditionalWeakTable<Person, Employee> _employees =
new ConditionalWeakTable<Person, Employee>();
public decimal Salary
{
get
{
// `this` is the instance of Person
return _employees.GetOrCreate(this).Salary;
}
set
{
Employee employee = null;
if (!_employees.TryGetValue(this, out employee)
{
employee = _employees.GetOrCreate(this);
}
employee.Salary = value;
}
}
}
IEmployee person = new Person();
var salary = person.Salary;
आंशिक कक्षाओं के समान, लेकिन एक अलग विधानसभा में एक अलग वर्ग / प्रकार के रूप में संकलित। ध्यान दें कि आप स्थैतिक सदस्यों और ऑपरेटरों को भी इस तरह से जोड़ पाएंगे। जैसा कि मैड्स टॉर्गेनसेन पॉडकास्ट में उल्लेख किया गया है , विस्तार में कोई भी राज्य नहीं होगा (इसलिए यह निजी उदाहरण के सदस्यों को कक्षा में नहीं जोड़ सकता है) जिसका अर्थ है कि आप उदाहरण से जुड़े निजी इंस्टेंस डेटा को जोड़ने में सक्षम नहीं होंगे । इसका कारण यह है कि यह आंतरिक रूप से शब्दकोशों का प्रबंधन करने के लिए होगा और यह मुश्किल हो सकता है (स्मृति प्रबंधन, आदि ...)। इसके लिए, आप अभी भी पहले बताई गई TypeDescriptor
/ ConditionalWeakTable
तकनीक का उपयोग कर सकते हैं और संपत्ति के विस्तार के साथ, इसे एक अच्छी संपत्ति के तहत छुपा सकते हैं।
सिंटैक्स अभी भी परिवर्तन के अधीन है जैसा कि इस मुद्दे का तात्पर्य है । उदाहरण के लिए, extends
प्रतिस्थापित किया जा सकता है for
जिससे कुछ अधिक प्राकृतिक और कम जावा संबंधित महसूस कर सकते हैं।
दिसंबर 2018 अपडेट करें - रोल्स, एक्सटेंशन और स्थिर इंटरफ़ेस सदस्य
एक्सटेंशन सब कुछ इसे C # 8.0 करने के लिए नहीं बना, क्योंकि कुछ कमियों के कारण इस GitHub टिकट के अंत के रूप में समझाया गया था । इसलिए, डिजाइन में सुधार करने के लिए एक खोज की गई थी। यहाँ , मैड्स टॉर्गेंसन बताते हैं कि भूमिकाएँ और विस्तार क्या हैं और वे कैसे अलग हैं:
रोल्स किसी दिए गए प्रकार के विशिष्ट मूल्यों पर इंटरफेस को लागू करने की अनुमति देते हैं। एक्सटेंशन किसी विशेष प्रकार के कोड के भीतर दिए गए सभी प्रकारों पर इंटरफेस को लागू करने की अनुमति देते हैं।
इसे दो उपयोग मामलों में पिछले प्रस्ताव के विभाजन पर देखा जा सकता है। विस्तार के लिए नई वाक्य रचना इस तरह होगा:
public extension ULongEnumerable of ulong
{
public IEnumerator<byte> GetEnumerator()
{
for (int i = sizeof(ulong); i > 0; i--)
{
yield return unchecked((byte)(this >> (i-1)*8));
}
}
}
तब आप ऐसा कर पाएंगे:
foreach (byte b in 0x_3A_9E_F1_C5_DA_F7_30_16ul)
{
WriteLine($"{e.Current:X}");
}
और एक स्थिर इंटरफ़ेस के लिए :
public interface IMonoid<T> where T : IMonoid<T>
{
static T operator +(T t1, T t2);
static T Zero { get; }
}
पर एक विस्तार संपत्ति जोड़ें int
और इलाज के int
रूप में IMonoid<int>
:
public extension IntMonoid of int : IMonoid<int>
{
public static int Zero => 0;
}