Tôi đang cố gắng thu thập tất cả các tình huống quyền anh xảy ra trong C #:
Chuyển đổi loại giá trị thành
System.Objectloại:struct S { } object box = new S();Chuyển đổi loại giá trị thành
System.ValueTypeloại:struct S { } System.ValueType box = new S();Chuyển đổi giá trị của kiểu liệt kê thành
System.Enumkiểu:enum E { A } System.Enum box = E.A;Chuyển đổi loại giá trị thành tham chiếu giao diện:
interface I { } struct S : I { } I box = new S();Sử dụng các kiểu giá trị trong nối chuỗi C #:
char c = F(); string s1 = "char value will box" + c;lưu ý: các hằng
charkiểu được nối với nhau tại thời điểm biên dịchlưu ý: kể từ phiên bản 6.0 biên dịch C # Tối ưu hoá nối liên quan
bool,char,IntPtr,UIntPtrloạiTạo ủy quyền từ phương thức thể hiện kiểu giá trị:
struct S { public void M() {} } Action box = new S().M;Gọi các phương thức ảo không bị ghi đè trên các loại giá trị:
enum E { A } E.A.GetHashCode();Sử dụng các mẫu hằng số C # 7.0 trong
isbiểu thức:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!Chuyển đổi loại quyền anh trong C # tuple:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }Các tham số tùy chọn của
objectloại với các giá trị mặc định của loại giá trị:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-siteKiểm tra giá trị của loại chung không bị giới hạn cho
null:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);lưu ý: điều này có thể được tối ưu hóa bởi JIT trong một số thời gian chạy .NET
Loại giá trị kiểm tra của loại không bị hạn chế hoặc
structloại chung vớiis/astoán tử: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);lưu ý: điều này có thể được tối ưu hóa bởi JIT trong một số thời gian chạy .NET
Còn những tình huống đấm bốc nào nữa, có thể ẩn mà bạn biết không?