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 # 튜플 형식 변환의 권투 :
(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에 의해 최적화 될 수 있습니다.
당신이 알고있는 복싱의 더 많은 상황이 있습니까?