2014-08-28 3 views
0

최근에 DLR을 찾았으므로 런타임에서 값 유형을 쉽게 변경할 수 있습니다. 런타임 중에 메모리 문제 나 예외가 발생합니까? DLR은 예외 및/또는 메모리 오류없이 값을 어떻게 변경합니까? 값을 변경 한 후에 객체의 주소가 같은가? 이전 값/객체와 주소/참조는 어떻게됩니까? 코드 dyn에서DLR (Dynamic Language Runtime)을 사용해도 안전합니까? DLR에서 값 유형이 어떻게 변경 될 수 있습니까?

dynamic dyn = "String"; 

Console.Write(dyn); 

dyn = 123; 

Console.Write(dyn * 2); 

dyn = new Action<string>(Test); 

dyn("ABC"); 

static void Test(string t) 
{ 
    Console.WriteLine(t); 
} 

답변

2

작성하는대로 안전합니다.

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 : 운영자 * 유형 stringint의 피연산자에 적용 할 수 없습니다 .

가도 2에 의해 "123"를 곱 시도하지 않았기 때문에 당신은 몇 가지 산술 예외를하지 않았다. 런타임에서는 처음에 적합한 * 연산자를 찾을 수 없습니다! 런타임에서 b (string) 및 2 (int) 유형을 검사하고이 두 유형에 대해 * 연산자를 찾으려고했지만 예외를 찾을 수 없으므로 예외가 발생했습니다.

(동일 물론 a * 2 일어난, 런타임 a이 (실행 형 int을 가지고있다 보았다는 특정 순간에 박스 정수 123를 참조) 등 2을 수행하고, 두 int들에 대한 운영자 * 이후)

Btw. 런타임에 바인딩 할 수있는 적절한 작업 (즉, 해당 작업은 런타임에만 계산 됨)이므로 IntelliSense (컴파일 타임 기능)는 작동하지 않습니다. 그들.

1

는이 참조를 다시 할당이 dyn를 재 할당 기준 및 각 시간이 포함되어 있습니다. 재 할당되기 전에 참조 된 dyn은 그 객체에 대한 다른 참조가없는 경우 가비지 수집 될 수 있습니다. 값 유형을 dynamic에 할당하면 값이 박스가됩니다. 따라서 dyn = 123은 힙에 boxed int를 생성하고 dyn을 재 할당하면이 boxed int가 가비지 수집 될 수 있습니다.

dynamic은 가변적 인 dynamic이 호출되는 모든 메서드는 컴파일시 메서드가 결정되는 "일반"C#과 달리 변수가 참조하는 개체의 런타임 유형을 기반으로 런타임에 결정됩니다 시간 또는 간단한 가상 메서드 테이블 조회입니다. 그리고 불가능한 일을하려고하면 예외가 발생하지만 dynamic을 사용할 때 예상됩니다.

따라서 요약하면 dynamic 변수는 다른 참조 유형 변수와 마찬가지로 참조를 포함합니다. 그러나 dynamic 변수를 사용할 때 생성되는 코드는 호출되는 실제 메서드가 런타임에만 결정될 수 있기 때문에 매우 다릅니다.

관련 문제