Mscorlib'in `` System.Boolean '' yapısı yerleşim döngülerini nasıl önler?


10

System.BooleanReferans Kaynak web sitesindeki kaynak kodu , struct Booleaniçerdiği örneklerin yalnızca tek bir boolalan içerdiğini belirtir 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;
}

Ama fark ettim ki ...

  • boololan bir C # dili takma için System.Boolean.
  • Tür, struct Booleanbir değer türü olup , kendisini alan olarak içeremeyeceği anlamına gelir .
  • ... yine de bu kod muhtemelen derleniyor.
  • Ben ne zaman anlıyoruz -nostdlibderleyici seçeneği ayarlanır Kendi sağlamak için gereken temel tip tanımları gibi System.String, System.Int32, System.Exceptiontek fark olduğunu -.
  • Yayınlanan kaynak kodu, gibi başka hiçbir özel özellik içermez [MethodImpl( MethodImplOptions.InternalCall )].

Peki bu kod nasıl derleniyor?


1
Ortak "bu bir takma addır" varsayımının kırık bir zihinsel model olduğu iyi bir gösteri. C # dilinde boolbir anahtar kelimedir . Hem derleyici hem de çalışma zamanı, tür hakkında çok fazla yerleşik bilgiye sahiptir ve System.Boolean'dan yardıma ihtiyaç duymaz. İlkel değer türleri için mscorlib'deki bildirimler, türün kutulu gösterimi ile eşleşir.
Hans Passant

Yanıtlar:


3

Kısa cevap : Bu, tip boksu ve altta yatan temsili ile ilgili özel bir durumdur. Bu tipler derleyici tarafından iyi bilinir ve bu nedenle çalışma zamanının ve derleyici / JIT optimize edicisinin normal parçaları ile karşılaştırıldığında temel parçaları tarafından biraz farklı muamele edilir.


Bu, çalışma zamanı uygulamasında derinlere gömüldüğünden, dil spesifikasyonunun belirli çalışma zamanı uygulama ayrıntılarına girmeyeceğini varsayıyorum. Bu yeterince tatmin edici bir cevap olup olmadığından emin değilim ama bu özel durumda, booltip kutunun dışında kalır ve böylece yapının bir parçası olarak ham değer türü olarak var düşünüyorum.

Boks ve kutu tiplerini açma tiplerinin semantiği, dili kullanmayı kolaylaştırmak için kasıtlı olarak opaktır. Bu durumda, Booleanyapının kendisi, gerçek semantiği uygulamak için uygulamaya özgü boks kurallarına güveniyor gibi görünmektedir:

  // 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);
  }

Yukarıdakilere inanıyorum, bir boole tipini temsil eden kutulu bir yapı ilk tip kontrol edilir, ardından kutusuz ve iç booldeğer doğrudan karşılaştırılır. Etiketli bir işaretçi veya bazı çalışma zamanı türü bilgileri içeren gerçek bir yapı olabilecek kutulu bir türden farklı olarak, kutusuz türler gerçek veri olarak kabul edilir.

Dahili olarak inanıyorum, eğer bir bool System.Object(tip silme nedeniyle veya herhangi bir optimizasyon mümkün olmadığından) geçirilmek üzere kutsanmış olsaydı, bu truekutunun değeri boyunca hangi satırlar boyunca bir şeyle sonuçlanırdınız 1.

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

Bu nedenle, yüksek düzeyde boolve System.Booleanaynı gibi gözüküyor ve benzer şekilde optimize edilebilir gibi görünüyorsa, çalışma zamanında bu özel durumda, kutulu ve kutulu olmayan versiyonları arasındaki ayrımlar booldoğrudan ortaya çıkar. Benzer boolşekilde System.Object, doğası gereği kutulu olan bir kutuyla karşılaştırılamaz . Boks / kutudan çıkarma ihtiyacına ilişkin bu cevap , prensibin kendisini açıkladığı ölçüde çok daha derinlere inmektedir .

Yönetilen dillerde çalışma zamanı uygulamaları, bazı temel çalışma zamanı özellikleri söz konusu olduğunda genellikle belirli kurallardan muaf tutulmalıdır; bu, Java ve diğer JVM tabanlı diller için kesinlikle doğrudur. CLR'ye de aşina olmasam da, aynı ilkenin burada uygulandığını düşünürdüm.

İken 'bool' 'System.Boolean' için bir tür takma olma konusunda bu soru aslında genel kullanım durumları kapsar çalışma zamanı uygulaması yakın alırken, C # ağzı hafifçe kuralları bükebilir ki, daha "uygulama özgü C #" gibi olur .


Anlayışınız için bunu iptal ettim - ancak bunu kabul edilen cevap olarak işaretleyemem çünkü o yetkili değil, üzgünüm :(
Dai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.