आप MSIL में क्या कर सकते हैं जो आप C # या VB.NET में नहीं कर सकते हैं? [बन्द है]


165

.NET भाषाओं में लिखे गए सभी कोड MSIL के लिए संकलित हैं, लेकिन क्या ऐसे विशिष्ट कार्य / कार्य हैं जो आप सीधे MSIL का उपयोग करके कर सकते हैं?

आइए हम भी MSIL में C #, VB.NET, F #, j # या किसी अन्य .NET भाषा की तुलना में आसान काम करते हैं।

अब तक हमारे पास यह है:

  1. पूंछ की पुनरावृत्ति
  2. जेनेरिक सह / कंट्राविरियन
  3. ओवरलोड जो केवल रिटर्न प्रकारों में भिन्न होते हैं
  4. पहुँच संशोधक को ओवरराइड करें
  5. एक वर्ग है जो System.Object से विरासत में नहीं मिल सकता है
  6. फ़िल्टर किए गए अपवाद (vb.net में किए जा सकते हैं)
  7. वर्तमान स्थिर वर्ग प्रकार की एक आभासी पद्धति को कॉल करना।
  8. एक मूल्य प्रकार के बॉक्सिंग संस्करण पर एक हैंडल प्राप्त करें।
  9. एक कोशिश / गलती करो।
  10. निषिद्ध नामों का उपयोग।
  11. मूल्य प्रकारों के लिए अपने स्वयं के पैरामीटर रहित निर्माताओं को परिभाषित करें
  12. एक raiseतत्व के साथ घटनाओं को परिभाषित करें ।
  13. CLR द्वारा कुछ रूपांतरणों की अनुमति है लेकिन C # द्वारा नहीं।
  14. एक गैर main()विधि बनाओ .entrypoint
  15. देशी intऔर देशी unsigned intप्रकार के साथ सीधे काम करते हैं।
  16. क्षणिक संकेत के साथ खेलते हैं
  17. MethodBodyItem में emitbyte निर्देशन
  18. गैर System.Exception प्रकारों को फेंकें और पकड़ें
  19. इनहेरिट एनम (एकीकृत)
  20. आप बाइट्स के एक सरणी को (4x छोटे) इन्टस के सरणी के रूप में मान सकते हैं।
  21. आपके पास एक फ़ील्ड / विधि / संपत्ति / घटना हो सकती है, सभी का नाम एक ही है (Unverified)।
  22. आप अपने स्वयं के कैच ब्लॉक से एक कोशिश ब्लॉक में वापस शाखा कर सकते हैं।
  23. आपके पास फैमिली एक्सेस एक्सेस स्पेसियर है (फैम या असेम protected internalहै )
  24. <Module>वैश्विक कार्यों को परिभाषित करने के लिए कक्षा में सीधे पहुंच , या एक मॉड्यूल इनिशियलाइज़र।

17
बहुत बढ़िया सवाल!
तमस Czinege

5
F # समर्थन करता है पूंछ पुनरावृत्ति देखें: en.wikibooks.org/wiki/F_Sharp_Programming/Recursion
बास बॉसिंक

4
इनहेरिट एनम? यह कभी-कभी इतना अच्छा होगा ..
जिमी हॉफ

1
मुख्य विधि में .NET में एक राजधानी एम है
ठोस गैनेट

4
"गैर रचनात्मक के रूप में बंद" दावा बेतुका है। यह एक अनुभवजन्य प्रश्न है।
जिम बेल्टर

जवाबों:


34

एमएसआईएल ओवरलोड के लिए अनुमति देता है जो केवल रिटर्न प्रकार में भिन्न होता है

call void [mscorlib]System.Console::Write(string)

या

callvirt int32 ...

5
आप इस तरह के सामान को कैसे जानते हैं? :)
गेर्री शेंक


8
यह कमाल का है। कौन ओवरलोड नहीं करना चाहता है?
जिमी हॉफ

12
यदि रिटर्न के प्रकार को छोड़कर दो विधियां समान हैं, तो या तो C # या vb.net से कॉल किया जा सकता है?
सुपरकैट

29

C # और VB सहित अधिकांश .Net भाषाएँ MSIL कोड की टेल रिकर्सन सुविधा का उपयोग नहीं करती हैं।

पूंछ पुनरावृत्ति एक अनुकूलन है जो कार्यात्मक भाषाओं में आम है। यह तब होता है जब एक विधि A का मान विधि B को समाप्त करके समाप्त हो जाता है, जैसे कि विधि B के कॉल करने के बाद विधि A के स्टैक को निपटाया जा सकता है।

MSIL कोड स्पष्ट रूप से पूंछ पुनरावृत्ति का समर्थन करता है, और कुछ एल्गोरिदम के लिए यह एक महत्वपूर्ण अनुकूलन हो सकता है। लेकिन चूंकि C # और VB ऐसा करने के लिए निर्देश उत्पन्न नहीं करते हैं, इसलिए इसे मैन्युअल रूप से किया जाना चाहिए (या F # या किसी अन्य भाषा का उपयोग करके)।

यहाँ एक उदाहरण दिया गया है कि कैसे पूंछ-पुनरावृत्ति को मैन्युअल रूप से C # में लागू किया जा सकता है:

private static int RecursiveMethod(int myParameter)
{
    // Body of recursive method
    if (BaseCase(details))
        return result;
    // ...

    return RecursiveMethod(modifiedParameter);
}

// Is transformed into:

private static int RecursiveMethod(int myParameter)
{
    while (true)
    {
        // Body of recursive method
        if (BaseCase(details))
            return result;
        // ...

        myParameter = modifiedParameter;
    }
}

ढेर-आवंटित स्टैक डेटा संरचना पर हार्डवेयर स्टैक से स्थानीय डेटा को स्थानांतरित करके पुनरावृत्ति को दूर करना आम बात है। जैसा कि ऊपर दिखाया गया पूंछ-कॉल पुनरावर्तन उन्मूलन में, स्टैक पूरी तरह से समाप्त हो गया है, जो एक बहुत अच्छा अनुकूलन है। साथ ही, रिटर्न वैल्यू में लंबी कॉल-चेन नहीं चल पाती है, लेकिन इसे सीधे लौटा दिया जाता है।

लेकिन, वैसे भी, CIL इस सुविधा को भाषा के हिस्से के रूप में प्रदान करता है, लेकिन C # या VB के साथ इसे मैन्युअल रूप से लागू करना होगा। (घबराना भी इस अनुकूलन को अपने दम पर बनाने के लिए स्वतंत्र है, लेकिन यह एक पूरी समस्या है।)


1
F # MSIL की पूंछ पुनरावर्तन का उपयोग नहीं करता है, क्योंकि यह केवल पूरी तरह से भरोसेमंद (CAS) मामलों में काम करता है क्योंकि जिस तरह से यह अनुमति के हमलों (आदि) के लिए जाँच करने के लिए एक स्टैक नहीं छोड़ता है।
रिचर्ड

10
रिचर्ड, मुझे यकीन नहीं है कि तुम्हारा क्या मतलब है। एफ # निश्चित रूप से पूंछ का उत्सर्जन करता है। कॉल उपसर्ग, सभी जगह बहुत ज्यादा। इसके लिए IL की जांच करें: "let x x = print_any x"।
माइकलजी

1
मेरा मानना ​​है कि JIT कुछ मामलों में वैसे भी पूंछ पुनरावृत्ति का उपयोग करेगा - और कुछ मामलों में इसके लिए स्पष्ट अनुरोध की अनदेखी करेगा। यह प्रोसेसर आर्किटेक्चर, IIRC पर निर्भर करता है।
जॉन स्कीट

3
@ अविश्वास: जबकि प्रोसेसर वास्तुकला सिद्धांत में अप्रासंगिक है , यह व्यवहार में अप्रासंगिक नहीं है क्योंकि विभिन्न आर्किटेक्चर के लिए अलग-अलग जेआईटी के पास .NET रीस्क्रिप्शन में पूंछ पुनरावृत्ति के लिए अलग नियम हैं। दूसरे शब्दों में, आप बहुत आसानी से एक प्रोग्राम कर सकते हैं जो x86 पर नहीं बल्कि x64 पर उड़ा। सिर्फ इसलिए कि पूंछ पुनरावृत्ति दोनों मामलों में लागू किया जा सकता है इसका मतलब यह नहीं है । ध्यान दें कि यह प्रश्न विशेष रूप से .NET के बारे में है।
जॉन स्कीट

2
C # वास्तव में विशिष्ट मामलों में x64 के तहत टेल कॉल करता है: community.bartdesmet.net/blogs/bart/archive/2010/07/07/…
पीटर वैन जिंकेल

21

MSIL में, आपके पास एक वर्ग हो सकता है जो System.Object से विरासत में नहीं मिल सकता है।

नमूना कोड: इसे ilasm.exe के साथ संकलित करें: अद्यतन: आपको "उत्तराधिकारी को रोकने के लिए" / NOAUTOINHERIT का उपयोग करना चाहिए।

// Metadata version: v2.0.50215
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}
.assembly sample
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) 
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.module sample.exe
// MVID: {A224F460-A049-4A03-9E71-80A36DBBBCD3}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x02F20000


// =============== CLASS MEMBERS DECLARATION ===================

.class public auto ansi beforefieldinit Hello
{
  .method public hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // Code size       13 (0xd)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "Hello World!"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  ret
  } // end of method Hello::Main
} // end of class Hello

2
@ जीन स्कीट - पूरे सम्मान के साथ, क्या आप मुझे यह समझने में मदद कर सकते हैं कि NOAUTOINHERIT का क्या मतलब है। MSDN निर्दिष्ट करता है "जब कोई आधार वर्ग निर्दिष्ट नहीं किया जाता है, तो ऑब्जेक्ट से डिफ़ॉल्ट विरासत को निष्क्रिय करता है। .NET फ्रेमवर्क संस्करण 2.0 में नया।"
रमेश

2
@ मिचेल - सवाल MSIL के बारे में है न कि कॉमन इंटरमीडिएट लैंग्वेज के बारे में। मैं मानता हूं कि यह CIL में संभव नहीं हो सकता है, लेकिन यह अभी भी MSIL के साथ काम करता है
रमेश

4
@ रमेश: उफ़, तुम बिल्कुल सही कह रहे हो। मैं उस बिंदु पर कहूंगा कि यह मानक युक्ति को तोड़ता है, और इसका उपयोग नहीं किया जाना चाहिए। परावर्तक भी assmebly लोड नहीं करता है। हालांकि, यह इल्मा के साथ किया जा सकता है। मुझे आश्चर्य है कि पृथ्वी पर ऐसा क्यों है।
जॉन स्कीट

4
(आह, मुझे लगता है कि / noautoinherit बिट मेरी टिप्पणी के बाद जोड़ा गया था। कम से कम मुझे इससे पहले इसे साकार नहीं करने के बारे में कुछ बेहतर लगता है ...)
जॉन स्कीट

1
मैं इसे कम से कम .NET 4.5.2 पर विंडोज पर जोड़ दूंगा, लेकिन यह निष्पादित नहीं करता है ( TypeLoadException)। PEVerify रिटर्न: [MD]: त्रुटि: TypeDef जो कि एक इंटरफ़ेस नहीं है और न ही ऑब्जेक्ट क्लास निल टोकन का विस्तार करता है।
xanatos

20

मॉडिफायर्स को जोड़ना protectedऔर internalएक्सेस करना संभव है । C # में, यदि आप लिखते हैं कि protected internalकोई सदस्य विधानसभा से और व्युत्पन्न वर्गों से सुलभ है। MSIL के माध्यम से आप एक सदस्य प्राप्त कर सकते हैं जो केवल विधानसभा के भीतर व्युत्पन्न वर्गों से सुलभ है । (मुझे लगता है कि यह बहुत उपयोगी हो सकता है!)


4
यह अब C # 7.1 ( github.com/dotnet/csharplang/issues/37 ) में लागू किया जाने वाला एक उम्मीदवार है , पहुंच संशोधक हैprivate protected
Happypig375

5
यह C # 7.2 के भाग के रूप में जारी किया गया है: blogs.msdn.microsoft.com/dotnet/2017/11/15/…
जो सेवेल

18

ओह, मैं इस समय हाजिर नहीं था। (यदि आप jon-skeet टैग जोड़ते हैं तो इसकी अधिक संभावना है, लेकिन मैं इसे अक्सर नहीं देखता हूं।)

ऐसा लगता है कि आपको पहले ही बहुत अच्छे उत्तर मिल गए हैं। के अतिरिक्त:

  • आप C # में मान प्रकार के बॉक्सिंग संस्करण पर हैंडल प्राप्त नहीं कर सकते। आप C ++ / CLI में कर सकते हैं
  • आप C # में एक कोशिश / गलती नहीं कर सकते ("गलती" एक "सब कुछ पकड़ और ब्लॉक के अंत में पुनर्विचार" या "अंत में केवल विफलता पर" की तरह है)
  • बहुत सारे नाम हैं जो सी # लेकिन कानूनी आईएल द्वारा निषिद्ध हैं
  • आईएल आपको मूल्य प्रकारों के लिए अपने स्वयं के पैरामीटर रहित बिल्डरों को परिभाषित करने की अनुमति देता है ।
  • आप C # में "बढ़ाएँ" तत्व के साथ घटनाओं को परिभाषित नहीं कर सकते। (वीबी में आप है कस्टम घटनाओं के लिए है, लेकिन "डिफ़ॉल्ट" घटनाओं एक शामिल नहीं हैं।)
  • सीएलआर द्वारा कुछ रूपांतरणों की अनुमति है लेकिन सी # द्वारा नहीं। यदि आप objectC # से गुजरते हैं, तो ये कभी-कभी काम करेंगे। एक उदाहरण के लिए एक uint [] / int [] SO प्रश्न देखें।

अगर मैं किसी और चीज के बारे में सोचूं तो मैं इसे जोड़ दूंगा ...


3
आह, जोन-स्कीट टैग, मुझे पता था कि मुझे कुछ याद आ रहा है!
बिनोज एंटनी

अवैध पहचानकर्ता नाम का उपयोग करने के लिए आप इसे
जॉर्ज पोल्वॉय

4
@ जॉर्ज: यह कीवर्ड के लिए काम करता है, लेकिन सभी मान्य आईएल नाम नहीं। <>aC # ... में एक नाम के रूप में निर्दिष्ट करने की कोशिश करें
जॉन स्कीट

17

सीएलआर पहले से ही सामान्य सह / विरोधाभासी का समर्थन करता है, लेकिन 4.0 तक यह सुविधा नहीं मिल रही है


क्या आप इस बारे में अधिक जानकारी के लिए लिंक प्रदान कर सकते हैं?
बिन्नोज एंटनी

14

आईएल में आप किसी भी प्रकार को फेंक सकते हैं और पकड़ सकते हैं, न कि केवल प्रकार से System.Exception


6
आप ऐसा कर सकते हैं कि C # में, कैच-स्टेटमेंट में कोष्ठक के साथ try/ catchबिना आप गैर-अपवाद जैसे अपवाद भी पकड़ लेंगे। हालांकि, फेंकना वास्तव में केवल तभी संभव है जब आप विरासत में प्राप्त करते हैं Exception
हाबिल

@Abel आप शायद ही कह सकते हैं कि अगर आप इसे संदर्भित नहीं कर सकते हैं तो आप कुछ पकड़ रहे हैं।
जिम बाल्टर

2
@JimBalter यदि आप इसे नहीं पकड़ते हैं, तो एप्लिकेशन क्रैश हो जाता है। यदि आप इसे पकड़ते हैं, तो एप्लिकेशन क्रैश नहीं होता है। इसलिए अपवाद वस्तु का जिक्र इसे पकड़ने से अलग है।
डैनियल इयरविकर

जबरदस्त हंसी! एप्लिकेशन को समाप्त करने या जारी रखने के बीच का अंतर पैदल चलना है? अब मुझे लगता है कि मैंने सब कुछ सुना होगा।
डैनियल इयरविकर

दिलचस्प रूप से पर्याप्त है, सीएलआर अब आपको ऐसा करने की अनुमति नहीं देता है। डिफ़ॉल्ट रूप से यह RuntimeWrappedException में गैर-अपवाद ऑब्जेक्ट्स को लपेट देगा
Jwosty

10

आईएल के बीच गौरव प्राप्त है callऔर callvirtआभासी विधि कॉल के लिए। पूर्व का उपयोग करके आप डायनेमिक क्लास प्रकार में वर्चुअल फ़ंक्शन के बजाय वर्तमान स्थिर वर्ग प्रकार की वर्चुअल विधि को कॉल करने के लिए बाध्य कर सकते हैं ।

C # के पास ऐसा करने का कोई तरीका नहीं है:

abstract class Foo {
    public void F() {
        Console.WriteLine(ToString()); // Always a virtual call!
    }

    public override string ToString() { System.Diagnostics.Debug.Assert(false); }
};

sealed class Bar : Foo {
    public override string ToString() { return "I'm called!"; }
}

वीएल, आईएल की तरह, MyClass.Method()सिंटैक्स का उपयोग करके गैर-पेशेवर कॉल जारी कर सकता है । उपरोक्त में, यह होगा MyClass.ToString()


9

एक कोशिश / पकड़ में, आप अपने स्वयं के कैच ब्लॉक से कोशिश ब्लॉक को फिर से दर्ज कर सकते हैं। तो, आप यह कर सकते हैं:

.try {
    // ...

  MidTry:
    // ...

    leave.s RestOfMethod
}
catch [mscorlib]System.Exception {
    leave.s MidTry  // branching back into try block!
}

RestOfMethod:
    // ...

AFAIK आप इसे C # या VB में नहीं कर सकते


3
मैं देख सकता हूँ क्यों इस बाहर रखा गया था - यह एक अलग गंधGOTO
बेसिक


1
यह वास्तव में VB.NET में किया जा सकता है। GoTo स्टेटमेंट Catchइसकी से शाखा कर सकता हैTryयहां टेस्ट कोड ऑनलाइन चलाएं ।
mbomb007

9

IL और VB.NET के साथ आप अपवादों को पकड़ते समय फ़िल्टर जोड़ सकते हैं, लेकिन C # v3 इस सुविधा का समर्थन नहीं करता है।

यह VB.NET उदाहरण http://blogs.msdn.com/clrteam/archive/2009/02/05/catch-rethrow-and-filters-why-you-should-care.aspx (नोट पर ध्यान दें) से लिया गया When ShouldCatch(ex) = Trueहै। पकड़ क्लॉज):

Try
   Foo()
Catch ex As CustomBaseException When ShouldCatch(ex)
   Console.WriteLine("Caught exception!")
End Try

17
कृपया rRemove = True, यह मेरी आँखों से खून बह रहा है!
कोनराड रूडोल्फ

क्यों? यह VB है और C # नहीं है, इसलिए कोई = / == समस्याएं मौजूद नहीं हैं। ;-)
peSHIr

अच्छी तरह से सी # "फेंक" कर सकते हैं, इसलिए एक ही परिणाम प्राप्त किया जा सकता है।
फ्रैंक श्वाइटमैन

8
paSHIr, मेरा मानना ​​है कि वह इसके अतिरेक के बारे में बात कर रहा था
लेजेंड लय

5
@ फ्रेंक श्वाइटरमैन: एक अपवाद को पकड़ने और फिर से उखाड़ने के बीच एक अंतर है, बनाम इसे पकड़ने पर बंद करना। फ़िल्टर किसी भी नेस्टेड "अंत" स्टेटमेंट्स से पहले चलते हैं, इसलिए जिन परिस्थितियों के कारण अपवाद होता है वे अभी भी मौजूद रहेंगे जब फ़िल्टर चलाया जाता है। यदि कोई सॉकेटएक्सैप्ट की एक महत्वपूर्ण संख्या को फेंकने की उम्मीद कर रहा है, तो वह अपेक्षाकृत चुपचाप पकड़ना चाहेगा, लेकिन उनमें से कुछ परेशानी का संकेत देंगे, समस्याग्रस्त होने पर राज्य की जांच करने में सक्षम होना बहुत उपयोगी हो सकता है।
०४ पर सुपरकैट

8

जहाँ तक मुझे पता है, सीधे C # में मॉड्यूल इनिशियलाइज़र (पूरे मॉड्यूल के लिए स्टैटिक कंस्ट्रक्टर) बनाने का कोई तरीका नहीं है:

http://blogs.msdn.com/junfeng/archive/2005/11/19/494914.aspx


+1 स्थान पर! जैसा कि मैंने यहां देखा , सी # में एक महान मिस ।
हाबिल

7

Native types
आप देशी इंट और देशी अहस्ताक्षरित इंट प्रकार के साथ सीधे काम कर सकते हैं (सी # में आप केवल एक इंटप्राट पर काम कर सकते हैं जो समान नहीं है।

Transient Pointers
आप क्षणिक बिंदुओं के साथ खेल सकते हैं, जो प्रबंधित प्रकारों के लिए संकेत हैं, लेकिन यह याद रखने की आवश्यकता नहीं है कि वे प्रबंधित हीप में नहीं हैं। पूरी तरह से निश्चित नहीं है कि आप बिना उपयोग किए गए कोड के साथ खिलवाड़ किए बिना इसका उपयोग कैसे कर सकते हैं, लेकिन यह केवल स्टैकलॉक जैसी चीजों के माध्यम से सीधे अन्य भाषाओं के संपर्क में नहीं है।

<Module>
यदि आप चाहें तो कक्षा में गड़बड़ी कर सकते हैं (आप आईएल की आवश्यकता के बिना प्रतिबिंब द्वारा ऐसा कर सकते हैं)

.emitbyte

15.4.1.1 .मिथबेटे निर्देशन विधिBodyItem :: =… | .emitbyte Int32 यह निर्देश बिना किसी संकेत के 8-बिट मान को सीधे CIL स्ट्रीम में उत्सर्जित करने का कारण बनता है, जिस बिंदु पर निर्देश प्रकट होता है। [नोट: .emitbyte निर्देश का उपयोग परीक्षण बनाने के लिए किया जाता है। नियमित कार्यक्रम बनाने में इसकी आवश्यकता नहीं है। नोट नोट]

.entrypoint
आपके पास इस पर थोड़ा अधिक लचीलापन है, आप इसे उन तरीकों पर लागू कर सकते हैं जिन्हें उदाहरण के लिए मेन नहीं कहा जाता है।

की एक पढ़ा है कल्पना मुझे यकीन है कि आप कुछ और मिल जाएगा हूँ।


+1, कुछ छिपे हुए रत्न यहाँ। ध्यान दें कि <Module>वैश्विक विधियों (जैसे VB करता है) को स्वीकार करने वाली भाषाओं के लिए विशेष वर्ग के रूप में है, लेकिन वास्तव में, C # इसे सीधे एक्सेस नहीं कर सकता है।
हाबिल

क्षणिक संकेत ऐसा लगता है कि वे बहुत उपयोगी प्रकार होंगे; उत्परिवर्तनीय संरचनाओं में से कई आपत्तियाँ उनके चूक से उपजी हैं। उदाहरण के लिए, "DictOfPoints (कुंजी) ।X = 5;" यदि DictOfPoints (कुंजी) एक क्षणिक पॉइंटर को एक संरचना में लौटाता है, तो मूल्य द्वारा संरचना को कॉपी करने के बजाय काम करने योग्य होगा।
सुपरकैट

@supercat जो क्षणिक सूचक के साथ काम नहीं करेगा, प्रश्न में डेटा ढेर पर हो सकता है। क्या आप चाहते हैं कि रेफरी एरिक वार्ता यहाँ के बारे में देता है: blogs.msdn.com/b/ericlippert/archive/2011/06/23/…
ShuggyCoUk

@ शुग्गीकोउक: दिलचस्प। मुझे वास्तव में उम्मीद है कि एरिक को एक साधन प्रदान करने के लिए राजी किया जा सकता है जिसके द्वारा "डिक्टोफ पॉइंट्स (कुंजी) .X = 5;" काम करने के लिए बनाया जा सकता है। अभी अगर कोई DictOfPoints को विशेष रूप से टाइप प्वाइंट (या किसी अन्य विशेष प्रकार) के साथ काम करना चाहता है, तो वह लगभग उस काम को कर सकता है, लेकिन यह एक दर्द है। BTW, एक चीज़ जो मैं देखना चाहता हूँ, वह एक ऐसा साधन होगा जिसके द्वारा कोई एक ओपन-एंडेड जेनेरिक फ़ंक्शन लिख सकता है जैसे DoStuff <...> (someParams, ActionByRef <moreParams, ...>, ...) जो आवश्यकतानुसार विस्तार कर सकता है। मुझे लगता है कि MSIL में ऐसा करने का कोई तरीका होगा; कुछ संकलक मदद के साथ ...
सुपरकैट

@ शुग्गीकोउक: ... यह उप-संदर्भ गुण होने का एक और तरीका प्रदान करेगा, अतिरिक्त बोनस के साथ कि कुछ संपत्ति सब कुछ के बाद चल सकती है जो बाहरी लोग संदर्भ में करेंगे।
सुपरकैट

6

आप विधि को ओवरराइड कर सकते हैं सह / गर्भ-विचरण, जिसे C # अनुमति नहीं देता है (यह जेनेरिक विचरण के समान नहीं है!)। मुझे इसे लागू करने के बारे में अधिक जानकारी मिली है , और भाग 1 और 2


4

मुझे लगता है कि जिसको मैं (पूरी तरह से गलत कारणों से) चाह रहा था, वह एनम में विरासत में था। ऐसा लगता है कि एसएमआईएल में ऐसा करना कठिन काम नहीं है (क्योंकि एनम सिर्फ क्लास हैं) लेकिन यह ऐसा कुछ नहीं है जो C # सिंटैक्स आपको करना चाहता है।


4

यहाँ कुछ और है:

  1. आपके पास प्रतिनिधियों में अतिरिक्त इंस्टेंस विधियाँ हो सकती हैं।
  2. प्रतिनिधि इंटरफेस को लागू कर सकते हैं।
  3. आप प्रतिनिधियों और इंटरफेस में स्थिर सदस्य हो सकते हैं।

3

20) आप बाइट्स के एक सरणी को (4x छोटे) इन्टस के सरणी के रूप में मान सकते हैं।

मैंने हाल ही में एक तेज XOR कार्यान्वयन करने के लिए इसका उपयोग किया, क्योंकि CLR xor फ़ंक्शन ints पर काम करता है और मुझे XOR को बाइट स्ट्रीम पर करने की आवश्यकता है।

परिणामी कोड को C # में किए गए समतुल्य की तुलना में ~ 10x तेज (प्रत्येक बाइट पर XOR कर) मापा जाता है।

===

मेरे पास प्रश्न को संपादित करने और # 20 के रूप में इस सूची में जोड़ने के लिए पर्याप्त स्टैवेरोफ़्लो स्ट्रीट क्रेडिट नहीं है, अगर कोई और व्यक्ति प्रफुल्लित हो सकता है; ;-)


3
IL में डुबकी लगाने के बजाय, आप इसे असुरक्षित पॉइंटर्स के साथ पूरा कर सकते थे। मुझे लगता है कि यह बस के रूप में उपवास के रूप में किया गया है, और शायद तेजी से होगा, क्योंकि यह कोई सीमा की जाँच करेगा।
पी डैडी

3

कुछ पर्यवेक्षक उपयोग करते हैं - आपके पास एक क्षेत्र / विधि / संपत्ति / घटना हो सकती है, जिसका सभी का नाम समान हो।


1
मैंने अपनी साइट पर एक नमूना बाहर रखा: jasonhaley.com/files/NameTestA.zip उस ज़िप में IL और एक exe है जिसमें निम्न समान 'A' के साथ एक वर्ग शामिल है: -class नाम का नाम A -Event है ए -2 नाम के A -Property नाम के A -Method को AI नाम का एक अच्छा संदर्भ नहीं मिल सकता है, हालाँकि मैं शायद इसे एक्मा 335 कल्पना या सर्ज लिडिन की किताब में पढ़ता हूं।
जेसन हेली

2

एनम वंशानुक्रम वास्तव में संभव नहीं है:

आप एक Enum वर्ग से वारिस हो सकते हैं। लेकिन परिणाम विशेष रूप से एक Enum की तरह व्यवहार नहीं करता है। यह एक मूल्य प्रकार की तरह भी व्यवहार नहीं करता है, लेकिन एक सामान्य वर्ग की तरह। व्यवस्था की बात यह है: IsEnum: True, IsValueType: True, IsClass: असत्य

लेकिन जब तक आप किसी व्यक्ति या स्वयं को भ्रमित नहीं करना चाहते, तब तक यह उपयोगी नहीं है।


2

आप IL में System.Multicast डेलिगेट से एक वर्ग प्राप्त कर सकते हैं, लेकिन आप C # में ऐसा नहीं कर सकते:

// निम्नलिखित वर्ग परिभाषा अवैध है:

सार्वजनिक वर्ग YourCustomDelegate: मल्टिकास्टडेलगेट {}


1

आप आईएल में मॉड्यूल-स्तर (उर्फ वैश्विक) विधियों को भी परिभाषित कर सकते हैं, और सी #, इसके विपरीत, केवल तरीकों को परिभाषित करने की अनुमति देता है जब तक कि वे कम से कम एक प्रकार से संलग्न हों।

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