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.Object
loại:struct S { } object box = new S();
Chuyển đổi loại giá trị thành
System.ValueType
loại:struct S { } System.ValueType box = new S();
Chuyển đổi giá trị của kiểu liệt kê thành
System.Enum
kiể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
char
kiể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
,UIntPtr
loạ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
is
biể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
object
loạ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-site
Kiể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
struct
loại chung vớiis
/as
toá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?