MSIL पद्धति में हिडिबिग का उद्देश्य क्या है?


92

Ildasm और C # प्रोग्राम का उपयोग करना

static void Main(string[] args)
{

}

देता है:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       2 (0x2)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ret
} // end of method Program::Main

Hidebysig का निर्माण क्या करता है?

जवाबों:


156

से 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();

(कोई संकलन समस्याएं नहीं।)


4
में सारांश , यह के बीच का अंतर है Shadowsऔर OverloadsVB.NET में।
मार्क हर्ड

16

SKEET के उत्तर के अनुसार, इसके अतिरिक्त कारण यह है कि जावा और C # एक वर्ग के ग्राहक को एक ही नाम से किसी भी तरीके से कॉल करने की अनुमति देते हैं, जिसमें आधार वर्ग के लोग भी शामिल हैं। जबकि C ++ नहीं करता है: यदि व्युत्पन्न वर्ग बेस क्लास में एक विधि के रूप में एक ही नाम के साथ एक भी विधि को परिभाषित करता है, तो क्लाइंट सीधे बेस क्लास विधि को कॉल नहीं कर सकता है, भले ही वह समान तर्क न ले। इसलिए ओवरलोडिंग के दोनों तरीकों का समर्थन करने के लिए इस फीचर को CIL में शामिल किया गया था।

C ++ में आप बेस क्लास से ओवरलोड के एक नामित सेट को एक usingनिर्देश के साथ प्रभावी रूप से आयात कर सकते हैं , ताकि वे उस विधि के नाम के लिए "ओवरलोड सेट" का हिस्सा बन जाएं।


1

Microsoft डॉक्स के अनुसार

जब एक व्युत्पन्न वर्ग में एक सदस्य C # newसंशोधनकर्ता या Visual Basic Shadowsसंशोधक के साथ घोषित किया जाता है , तो यह आधार वर्ग में एक ही नाम के एक सदस्य को छिपा सकता है। C # आधार वर्ग के सदस्यों को हस्ताक्षर द्वारा छुपाता है। यही है, यदि आधार वर्ग के सदस्य के पास कई अधिभार हैं, तो जो छिपा है वह वही है जिसके पास समान हस्ताक्षर हैं। इसके विपरीत, Visual Basic सभी बेस क्लास अधिभार को छुपाता है। इस प्रकार, IsHideBySigfalse विजुअल बेसिक Shadows संशोधक के trueसाथ घोषित सदस्य पर और C # newसंशोधक के साथ घोषित सदस्य पर लौटता है ।

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