ฉันพยายามรวบรวมสถานการณ์ทั้งหมดที่ชกมวยเกิดขึ้นใน C #:
การแปลงค่าเป็น
System.Object
ประเภท:struct S { } object box = new S();
การแปลงค่าเป็น
System.ValueType
ประเภท:struct S { } System.ValueType box = new S();
การแปลงค่าของประเภทการแจงนับเป็น
System.Enum
ประเภท:enum E { A } System.Enum box = E.A;
การแปลงประเภทค่าเป็นการอ้างอิงอินเทอร์เฟซ:
interface I { } struct S : I { } I box = new S();
การใช้ประเภทค่าในการต่อสตริง C #:
char c = F(); string s1 = "char value will box" + c;
หมายเหตุ:ค่าคงที่ของ
char
ประเภทจะเชื่อมต่อกันในเวลาคอมไพล์หมายเหตุ:ตั้งแต่รุ่น 6.0 เรียบเรียง C # ปรับการเรียงต่อกันที่เกี่ยวข้องกับ
bool
,char
,IntPtr
,UIntPtr
ประเภทการสร้างผู้รับมอบสิทธิ์จากวิธีการอินสแตนซ์ชนิดค่า:
struct S { public void M() {} } Action box = new S().M;
การเรียกใช้เมธอดเสมือนที่ไม่ถูกแทนที่บนชนิดค่า:
enum E { A } E.A.GetHashCode();
การใช้รูปแบบคงที่ C # 7.0 ภายใต้
is
นิพจน์:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
การชกมวยในการแปลงประเภท C # tuple:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }
พารามิเตอร์ทางเลือกของ
object
ประเภทที่มีค่าเริ่มต้นประเภทค่า:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-site
การตรวจสอบค่าของประเภททั่วไปที่ไม่มีข้อ จำกัด สำหรับ
null
:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);
หมายเหตุ:สิ่งนี้อาจได้รับการปรับให้เหมาะสมโดย JIT ในบางช่วงเวลา. NET
พิมพ์ค่าการทดสอบของประเภทที่ไม่ถูก จำกัด หรือ
struct
ประเภททั่วไปด้วย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);
หมายเหตุ:สิ่งนี้อาจได้รับการปรับให้เหมาะสมโดย JIT ในบางช่วงเวลา. NET
มีสถานการณ์ของการชกมวยอีกหรือไม่ที่คุณอาจรู้