से ECMA 335 , विभाजन 1 की धारा 8.10.4:
CTS दोनों नामों पर स्वतंत्र नियंत्रण प्रदान करता है जो एक बेस प्रकार (छिपने) से दिखाई देते हैं और व्युत्पन्न वर्ग (ओवरराइडिंग) में लेआउट स्लॉट्स को साझा करते हैं। छिपी हुई श्रेणी में एक सदस्य को चिह्नित करके छुपाया जाता है क्योंकि या तो नाम से छिपाया जाता है या नाम और हस्ताक्षर द्वारा छिपाया जाता है। छिपाना हमेशा सदस्य के प्रकार के आधार पर किया जाता है, अर्थात्, व्युत्पन्न फ़ील्ड नाम बेस फ़ील्ड नाम छिपा सकते हैं, लेकिन विधि नाम, संपत्ति नाम या ईवेंट नाम नहीं। यदि एक व्युत्पन्न सदस्य को नाम से छिपाया जाता है, तो उसी वर्ग के आधार वर्ग में उसी प्रकार के सदस्य व्युत्पन्न वर्ग में दिखाई नहीं देते हैं; यदि सदस्य को नाम-और-हस्ताक्षर द्वारा छिपाया गया है, तो केवल उसी नाम और प्रकार (फ़ील्ड्स के लिए) या विधि हस्ताक्षर (विधियों के लिए) के साथ उसी तरह का सदस्य व्युत्पन्न वर्ग से छिपा हुआ है। छिपने के इन दो रूपों के बीच अंतर का कार्यान्वयन पूरी तरह से स्रोत भाषा संकलक और प्रतिबिंब पुस्तकालय द्वारा प्रदान किया जाता है; इसका सीधा असर वीईएस पर नहीं है।
(यह उससे तुरंत स्पष्ट नहीं है, लेकिन hidebysig
इसका अर्थ है "नाम और हस्ताक्षर द्वारा छिपाना"।)
विभाजन 2 की धारा 15.4.2.2 में भी:
Hidebysig उपकरणों के उपयोग के लिए आपूर्ति की है और VES द्वारा नजरअंदाज कर दिया है। यह निर्दिष्ट करता है कि घोषित विधि बेस क्लास प्रकारों के सभी तरीकों को छिपाती है जिसमें एक मिलान विधि हस्ताक्षर है; जब छोड़ा जाता है, तो विधि को हस्ताक्षर की परवाह किए बिना एक ही नाम के सभी तरीकों को छिपाना चाहिए।
एक उदाहरण के रूप में, मान लीजिए कि आपके पास:
public class Base
{
public void Bar()
{
}
}
public class Derived : Base
{
public void Bar(string x)
{
}
}
...
Derived d = new Derived();
d.Bar();
यह मान्य है, क्योंकि छिपा Bar(string)
नहीं हैBar()
, क्योंकि C # संकलक का उपयोग करता है hidebysig
। यदि यह "नाम से छिपाएं" शब्दार्थ का उपयोग करता है, तो आप Bar()
सभी प्रकार के संदर्भ में कॉल नहीं कर पाएंगे Derived
, हालांकि आप अभी भी इसे बेस में डाल सकते हैं और इसे इस तरह से कॉल कर सकते हैं।
संपादित करें: मैं सिर्फ एक DLL करने के लिए उपरोक्त कोड संकलन है, यह ildasming, निकाल कर इस की कोशिश की है hidebysig
के लिए Bar()
और Bar(string)
, इसे फिर से ilasming, तो कॉल करने के लिए कोशिश कर रहा है Bar()
अन्य कोड से:
Derived d = new Derived();
d.Bar();
Test.cs(6,9): error CS1501: No overload for method 'Bar' takes '0' arguments
तथापि:
Base d = new Derived();
d.Bar();
(कोई संकलन समस्याएं नहीं।)
Shadows
औरOverloads
VB.NET में।