C # 'da boksun meydana geldiği tüm durumları toplamaya çalışıyorum:
Değer türünü türe dönüştürme
System.Object
:struct S { } object box = new S();
Değer türünü türe dönüştürme
System.ValueType
:struct S { } System.ValueType box = new S();
Numaralandırma türünün değerini türe dönüştürme
System.Enum
:enum E { A } System.Enum box = E.A;
Değer türünü arayüz referansına dönüştürme:
interface I { } struct S : I { } I box = new S();
C # dize birleştirmede değer türlerini kullanma:
char c = F(); string s1 = "char value will box" + c;
not: tür sabitleri
char
derleme zamanında birleştirilirNot: sürüm 6.0 C # derleyicisi beri optimize eder birleştirme içeren
bool
,char
,IntPtr
,UIntPtr
çeşitleriDeğer türü örnek yönteminden temsilci oluşturma:
struct S { public void M() {} } Action box = new S().M;
Değer türlerinde geçersiz kılınmamış sanal yöntemleri çağırma:
enum E { A } E.A.GetHashCode();
is
İfade altında C # 7.0 sabit kalıplarını kullanma :int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
C # tuple türleri dönüşümlerinde boks:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }
object
Değer türü varsayılan değerlerine sahip isteğe bağlı türdeki parametreler :void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-site
Kısıtlanmamış jenerik türün değeri kontrol ediliyor
null
:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);
not: bu, bazı .NET çalışma zamanlarında JIT tarafından optimize edilebilir
/ Operatörleri
struct
ile kısıtsız veya genel tipte tip testi değeri :is
as
bool M<T>(T t) => t is int; int? M<T>(T t) => t as int?; IEquatable<T> M<T>(T t) => t as IEquatable<T>; M(42);
not: bu, bazı .NET çalışma zamanlarında JIT tarafından optimize edilebilir
Bildiğiniz başka gizli, belki de boks durumu var mı?