我正在尝试收集在C#中发生拳击的所有情况:
将值类型转换为
System.Object
类型:struct S { } object box = new S();
将值类型转换为
System.ValueType
类型:struct S { } System.ValueType box = new S();
将枚举类型的值转换为
System.Enum
type: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();
在
is
表达式下使用C#7.0常量模式:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
C#元组类型转换中的装箱:
(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);
注意:在某些.NET运行时中,JIT可能对此进行了优化
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);
注意:在某些.NET运行时中,JIT可能对此进行了优化
您是否知道还有更多拳击的情况,也许是隐藏的?