Kode sumber untuk System.Boolean
di situs web Sumber Referensi menyatakan bahwa instance struct Boolean
hanya berisi bool
bidang tunggal 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;
}
Tapi saya perhatikan bahwa ...
bool
adalah alias bahasa C # untukSystem.Boolean
.- Tipe ini
struct Boolean
adalah tipe nilai yang artinya tidak dapat memuat dirinya sendiri sebagai bidang . - ... namun kode ini mungkin dikompilasi.
- Saya mengerti bahwa ketika
-nostdlib
opsi compiler diatur Anda perlu menyediakan Anda sendiri penting jenis definisi sepertiSystem.String
,System.Int32
,System.Exception
- itulah satu-satunya perbedaan. - Kode sumber yang dipublikasikan tidak mengandung atribut khusus seperti
[MethodImpl( MethodImplOptions.InternalCall )]
.
Jadi bagaimana cara kompilasi kode ini?
bool
adalah kata kunci dalam bahasa C #. Baik kompiler dan runtime memiliki banyak pengetahuan bawaan tentang tipe dan tidak memerlukan bantuan dari System.Boolean. Deklarasi di mscorlib untuk tipe nilai primitif cocok dengan representasi kotak dari tipe tersebut.Jawaban:
Jawaban singkat : Ini adalah kasus khusus, berkaitan dengan jenis tinju dan representasi yang mendasarinya. Tipe-tipe ini dikenal baik oleh kompiler dan karena itu diperlakukan sedikit berbeda oleh bagian inti dari runtime dan kompiler / pengoptimal JIT dibandingkan dengan tipe biasa.
Karena ini tertanam jauh di dalam implementasi runtime, saya akan menganggap spesifikasi bahasa tidak akan masuk ke detail implementasi runtime tertentu. Saya tidak yakin apakah ini adalah jawaban yang cukup memuaskan tetapi saya pikir dalam kasus khusus ini,
bool
tipe tersebut tetap terbuka dan dengan demikian ada sebagai tipe nilai mentah sebagai bagian dari struktur.Semantik tinju dan unboxing jenis nilai sengaja buram untuk membuat menggunakan bahasa lebih mudah. Dalam hal ini
Boolean
struktur itu sendiri tampaknya bergantung pada implementasi aturan tinju spesifik untuk mengimplementasikan semantik yang sebenarnya seperti:Saya percaya pada hal di atas, struktur kotak yang mewakili tipe boolean adalah tipe-check pertama diikuti oleh itu sedang unboxed dan nilai internal
bool
yang langsung dibandingkan. Tidak seperti tipe kotak, yang mungkin merupakan penunjuk yang ditandai atau struktur aktual dengan beberapa informasi tipe runtime, tipe yang tidak kotak diperlakukan sebagai data aktual.Saya percaya secara internal, jika bool harus dikotakkan untuk dilewati sebagai
System.Object
(karena penghapusan tipe atau di mana tidak ada optimasi akan mungkin) Anda akan berakhir dengan sesuatu di sepanjang garis initrue
yang kotak nilai1
.Jadi, sementara pada tingkat tinggi
bool
danSystem.Boolean
tampak identik dan dapat dioptimalkan dengan cara yang sama, dalam kasus khusus ini di dalam runtime, perbedaan antara versi kotak dan tanpa kotakbool
secara langsung diekspos. Sama halnya, sebuah unboxedbool
tidak dapat dibandingkan denganSystem.Object
yang secara inheren merupakan tipe boxed. Jawaban ini mengenai perlunya tinju / unboxing masuk jauh lebih mendalam sejauh menjelaskan prinsip itu sendiri.Dalam implementasi runtime bahasa yang dikelola pada umumnya perlu dibebaskan dari aturan tertentu ketika datang ke beberapa fitur runtime inti, ini tentu berlaku untuk Java dan bahasa berbasis JVM lainnya. Meskipun saya tidak terbiasa dengan CLR juga, saya akan berpikir prinsip yang sama diterapkan di sini.
Sementara pertanyaan ini tentang 'bool' menjadi jenis alias untuk 'System.Boolean' pada dasarnya mencakup kasus penggunaan umum, ketika semakin dekat dengan implementasi runtime, dialek C # menjadi lebih seperti "implementasi spesifik C #", yang dapat sedikit membengkokkan aturan .
sumber