कैसे mscorlib के `System.Boolean` संरचनात्मक लेआउट चक्र से बचता है?


10

System.Booleanसंदर्भ स्रोत वेबसाइट के लिए स्रोत-कोड में कहा गया है कि struct Booleanकेवल एक ही boolक्षेत्र के उदाहरण हैं private bool m_value:

https://referencesource.microsoft.com/#mscorlib/system/boolean.cs,f1b135ff6c380b37

namespace System {

    using System;
    using System.Globalization;
    using System.Diagnostics.Contracts;

    [Serializable]
    [System.Runtime.InteropServices.ComVisible(true)]
    public struct Boolean : IComparable, IConvertible
#if GENERICS_WORK
        , IComparable<Boolean>,  IEquatable<Boolean>
#endif
    {
      private bool m_value;

      internal const int True = 1; 
      internal const int False = 0; 

      internal const String TrueLiteral  = "True";
      internal const String FalseLiteral = "False";

      public static readonly String TrueString  = TrueLiteral;
      public static readonly String FalseString = FalseLiteral;
}

लेकिन मैंने देखा कि ...

  • boolके लिए एक C # भाषा उपनाम है System.Boolean।
  • प्रकार वह है struct Booleanजो एक मान-प्रकार है जिसका अर्थ है कि यह एक क्षेत्र के रूप में खुद को शामिल नहीं कर सकता है ।
  • ... फिर भी यह कोड संकलित है।
  • मैं समझता हूँ कि जब -nostdlibसंकलक विकल्प सेट किया गया है आप अपने खुद के प्रदान करने की आवश्यकता आवश्यक प्रकार परिभाषाएं चाहते System.String, System.Int32, System.Exception- कि यही एक अंतर है।
  • प्रकाशित स्रोत-कोड में कोई अन्य विशेष विशेषता नहीं है [MethodImpl( MethodImplOptions.InternalCall )]।

तो यह कोड कैसे संकलित करता है?


1
यह एक सभ्य प्रदर्शन है कि आम "यह एक उपनाम है" धारणा एक टूटे हुए मानसिक मॉडल है। C # भाषा में boolएक कीवर्ड है। कंपाइलर और रनटाइम दोनों में टाइप के बारे में बहुत कुछ अंतर्निहित ज्ञान होता है और उन्हें System.Boolean की सहायता की आवश्यकता नहीं होती है। आदिम मूल्य प्रकारों के लिए mscorlib में घोषणाएं बॉक्स प्रकार के प्रतिनिधित्व से मेल खाती हैं।
— हंस पैसेंट

जवाबों:


3

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


चूँकि यह रनटाइम कार्यान्वयन में गहराई से दबी हुई है, इसलिए मुझे लगता है कि भाषा विनिर्देश विशिष्ट रनटाइम कार्यान्वयन विवरण में नहीं जाएगा। मुझे यकीन नहीं है कि यह एक संतोषजनक पर्याप्त उत्तर है, लेकिन मुझे लगता है कि इस विशेष मामले में, boolप्रकार अनबॉक्स है और इस प्रकार संरचना के भाग के रूप में कच्चे मूल्य प्रकार के रूप में मौजूद है।

भाषा के उपयोग को आसान बनाने के लिए बॉक्सिंग और मूल्य प्रकारों के अनबॉक्सिंग के शब्दार्थ जानबूझकर अपारदर्शी हैं। इस मामले में Booleanसंरचना स्वयं वास्तविक शब्दार्थ को लागू करने के लिए विशिष्ट मुक्केबाजी नियमों को लागू करने पर भरोसा करने लगती है:

  // Determines whether two Boolean objects are equal.
  public override bool Equals (Object obj) {
    //If it's not a boolean, we're definitely not equal
    if (!(obj is Boolean)) {
      return false;
    }

    return (m_value==((Boolean)obj).m_value);
  }

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

मैं आंतरिक रूप से मानता हूं, अगर किसी बूल को बॉक्सिंग के रूप में पारित करना पड़ा System.Object(क्योंकि प्रकार के क्षरण के कारण या जहां कोई अनुकूलन संभव नहीं होगा) तो आप इसके लिए कुछ चीजों के साथ समाप्त हो जाएंगे, trueजिसके लिए मूल्य होगा 1।

ldc.i4.1
box        [mscorlib]System.Boolean

तो एक उच्च स्तर पर boolऔर System.Booleanसमान प्रतीत होता है और समान रूप से अनुकूलित किया जा सकता है, रनटाइम के भीतर इस विशेष मामले में, बॉक्सिंग और अनबॉक्स किए गए संस्करणों के बीच के अंतर boolसीधे उजागर होते हैं। सिमिलरी, एक अनबॉक्स्ड boolकी तुलना नहीं की जा सकती है, System.Objectजो स्वाभाविक रूप से एक बॉक्सिंग प्रकार है। बॉक्सिंग / अनबॉक्सिंग की आवश्यकता के बारे में यह उत्तर बहुत अधिक गहराई में चला जाता है जहाँ तक कि सिद्धांत स्वयं को समझाता है।

प्रबंधित भाषाओं में रनटाइम कार्यान्वयन को आम तौर पर कुछ नियमों से छूट की आवश्यकता होती है जब यह कुछ कोर रनटाइम सुविधाओं की बात आती है, यह निश्चित रूप से जावा और अन्य जेवीएम आधारित भाषाओं के लिए सही है। जबकि मैं सीएलआर से भी परिचित नहीं हूं, मुझे लगता है कि यहां भी यही सिद्धांत लागू होगा।

जबकि 'बूल' के बारे में यह सवाल 'System.Boolean' के लिए एक प्रकार का उपनाम है, जो अनिवार्य रूप से सामान्य उपयोग के मामलों को कवर करता है, जब रनटाइम कार्यान्वयन के करीब हो रहा है, C # की बोली "कार्यान्वयन विशिष्ट C #" की तरह अधिक हो जाती है, जो नियमों को थोड़ा मोड़ सकती है ।


मैंने आपकी जानकारी के लिए इसे अपडाउन किया - लेकिन मैं इसे स्वीकार किए गए उत्तर के रूप में चिह्नित नहीं कर सकता क्योंकि यह आधिकारिक नहीं है, क्षमा करें :(
— Dai
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.