작성하는대로 안전합니다.
dynamic
유형의 변수는 실제로 object
유형입니다. 따라서 "String"
, 123
또는 new Action<string>(…)
을 할당 할 때 특별한 일이 없습니다. 아마도 object
변수를 사용하여 쉽게 동일한 작업을 수행 할 수 있다는 것을 이미 알고 있습니다. 유일한 마법은 값 유형 값 (예 : 123
)에 대한 복싱이지만 다시 말해서 dynamic
과 관련이 없지만 .NET의 첫 번째 버전 이후로 object x = 123;
과 같은 과제가 발생했습니다.
은 (추가-명확하게하려면, 당신은 당신의
dyn
변수에 할당 할 다시 할 때 당신은 어떤 값을 변경하지 않는 당신은 단순히
dyn
참조 다른 값을 만들고있어..)
dynamic
일어날 않는 마법 후기 바인딩입니다. 즉, 그러한 변수에서 메서드 나 속성 또는 연산자 등을 호출 할 때마다 실제 메서드, 속성, 연산자 등은 컴파일 타임에 아직 알 수 없습니다. 그것은 런타임에 선택됩니다. 이러한 각 호출에 대해 컴파일러는 변수의 현재 값 형식을 검사하는 코드를 생성하고 호출 할 적절한 메서드, 속성, 연산자 등을 선택하려고합니다. 그러한 것이 발견되면 호출됩니다. 그렇지 않으면 예외가 발생합니다. 다른 예에서
살펴 보자 :
dynamic a = 123;
Console.WriteLine(a * 2); // OK
dynamic b = "123";
Console.WriteLine(b * 2); // will throw an exception
두 번째 블록에 의해 던져진 예외는 여기에 재미 :
RuntimeBinderException
: 운영자 *
유형 string
및 int
의 피연산자에 적용 할 수 없습니다 .
가도 2
에 의해 "123"
를 곱 시도하지 않았기 때문에 당신은 몇 가지 산술 예외를하지 않았다. 런타임에서는 처음에 적합한 *
연산자를 찾을 수 없습니다! 런타임에서 b
(string
) 및 2
(int
) 유형을 검사하고이 두 유형에 대해 *
연산자를 찾으려고했지만 예외를 찾을 수 없으므로 예외가 발생했습니다.
(동일 물론 a * 2
일어난, 런타임 a
이 (실행 형 int
을 가지고있다 보았다는 특정 순간에 박스 정수 123
를 참조) 등 2
을 수행하고, 두 int
들에 대한 운영자 *
이후)
Btw. 런타임에 바인딩 할 수있는 적절한 작업 (즉, 해당 작업은 런타임에만 계산 됨)이므로 IntelliSense (컴파일 타임 기능)는 작동하지 않습니다. 그들.