실제로 벨트 아래에서 일어나는 일에 대한 정보는 아직 없습니다. 이 예를 살펴보십시오.
object o = "test";
if (o is string)
{
var x = (string) o;
}
이것은 다음 IL로 변환됩니다.
IL_0000: nop
IL_0001: ldstr "test"
IL_0006: stloc.0 // o
IL_0007: ldloc.0 // o
IL_0008: isinst System.String
IL_000D: ldnull
IL_000E: cgt.un
IL_0010: stloc.1
IL_0011: ldloc.1
IL_0012: brfalse.s IL_001D
IL_0014: nop
IL_0015: ldloc.0 // o
IL_0016: castclass System.String
IL_001B: stloc.2 // x
IL_001C: nop
IL_001D: ret
여기서 중요한 것은 isinst
및 castclass
호출입니다. 둘 다 상대적으로 비쌉니다. 그것을 대안과 비교하면 isinst
확인 만 수행한다는 것을 알 수 있습니다 .
object o = "test";
var oAsString = o as string;
if (oAsString != null)
{
}
IL_0000: nop
IL_0001: ldstr "test"
IL_0006: stloc.0 // o
IL_0007: ldloc.0 // o
IL_0008: isinst System.String
IL_000D: stloc.1 // oAsString
IL_000E: ldloc.1 // oAsString
IL_000F: ldnull
IL_0010: cgt.un
IL_0012: stloc.2
IL_0013: ldloc.2
IL_0014: brfalse.s IL_0018
IL_0016: nop
IL_0017: nop
IL_0018: ret
또한 언급 할 가치가있는 것은 값 유형이 다음 unbox.any
대신 사용 한다는 것입니다 castclass
.
object o = 5;
if (o is int)
{
var x = (int)o;
}
IL_0000: nop
IL_0001: ldc.i4.5
IL_0002: box System.Int32
IL_0007: stloc.0 // o
IL_0008: ldloc.0 // o
IL_0009: isinst System.Int32
IL_000E: ldnull
IL_000F: cgt.un
IL_0011: stloc.1
IL_0012: ldloc.1
IL_0013: brfalse.s IL_001E
IL_0015: nop
IL_0016: ldloc.0 // o
IL_0017: unbox.any System.Int32
IL_001C: stloc.2 // x
IL_001D: nop
IL_001E: ret
그러나 이것이 반드시 여기에서 볼 수있는 것처럼 더 빠른 결과로 변환되는 것은 아닙니다 . 캐스트가 될하는 데 사용하지만, 최대한 빨리 수행 할 것 같습니다 :하지만 그 질문은 질문 이후 개선되었을 것 같다 as
및 linq
현재 약 3 배 빠른 속도입니다.
MyProp
이 변경 후 게터 가 필요하지 않을 것 입니다.