|
|
게시됨 2016. 7. 7. 오전 10:15:06
|
|
|

dynamic은 FrameWork 4.0의 새로운 기능입니다. 동적 언어의 등장은 C#에 약한 언어 유형의 특성을 부여했습니다. 컴파일러는 더 이상 컴파일 시점에 타입을 검사하지 않으며, 동적 객체는 컴파일 시 기본적으로 원하는 기능을 지원합니다. 예를 들어, GetDynamicObject 메서드가 반환하는 객체에 대해 아무것도 모른다 해도, 이런 코드 호출을 하면 컴파일러가 오류를 보고하지 않습니다:
올바른 사용법에 관해서라면, 먼저 한 가지 잘못된 사용법을 지적해야 합니다:
사람들은 종종 dynamic과 비교할 때 var라는 키워드를 사용합니다. 사실 var와 dynamic은 완전히 두 개념이며 전혀 비교해서는 안 됩니다. 컴파일이 완료되면 컴파일 시간은 var 변수의 실제 타입과 자동으로 일치하고, 변수의 선언을 실제 타입으로 대체하여 인코딩할 때 실제 타입을 선언하는 것처럼 보입니다. 동적 컴파일 후에는 실제로 객체 타입이 되지만, 컴파일러는 동적 타입에 대해 특별한 처리를 하여 컴파일 중에는 타입 검사를 수행하지 않고 런타임에 타입 검사를 넣습니다.
이는 Visual Studio의 편집기 창에서 확인할 수 있습니다. var로 선언된 변수는 Visual Studio가 var 타입의 실제 타입을 추론할 수 있어 "지능형 센스"를 지원하지만, 동적 변수는 컴파일러가 런타임 타입에 대해 아무것도 알지 못하기 때문에 "인텔리전트 센스"를 지원하지 않습니다. 동적 변수에 대해 Intelligent Sense를 사용하면 "이 동작은 런타임에 해결됩니다"라는 프롬프트가 뜨게 됩니다.
동적 변수가 객체 변수라는 사실은 IL 코드로 확인할 수 있으며, IL 코드는 여기에 게시되지 않습니다. 물론 컴파일러는 직접 객체 변수를 구분하기 위한 동적 선언도 처리합니다.
MSDN에서는 상호운용성을 단순화하기 위해 dynamic이 널리 구현되어 있으며, 이 때문에 일부 개발자들이 오해받는 것 같습니다. 많은 개발자들이 COM+나 OFFICE 같은 코딩을 잘 사용하지 못하기 때문에, 긴급히 동적 애플리케이션 이유가 필요합니다. 그래서 일상 개발에서는 역동성이 중요하다고 생각합니다:
타입 변환 동적 타입 인스턴스와 다른 유형의 인스턴스 간 전환은 간단하며, 개발자들은 다이믹과 비동적 동작 사이를 쉽게 전환할 수 있습니다. 어떤 인스턴스든 암묵적으로 동적 타입 인스턴스로 변환될 수 있으며, 다음 예시를 참조하세요: 동적 d1 = 7; 동적 d2 = "문자열"; 동적 D3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses(); 반대로, 암묵적 변환은 동적 타입의 모든 표현식에 동적으로 적용할 수 있습니다. 반대로, 타입 동적 표현식은 암묵적으로 다른 타입으로 변환될 수도 있습니다. 지능 i = d1; 끈 스트랴 = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4; 동적 타입 매개변수가 적용되는 과부하 문제 메서드가 호출되어 동적 타입의 객체를 전달하거나, 호출되는 객체가 동적 타입이라면, 오버로드 판정은 컴파일 시가 아니라 런타임에 발생합니다. 동적 언어 런타임 DLR 동적 언어 실행 시간은 입니다. NET Framework 4 Beta 1은 C#에서 동적 타입을 지원하고 IronPython, IronRuby와 같은 동적 프로그래밍 언어를 구현하는 새로운 API 세트입니다. 동적 기능은 반사를 단순화합니다.
이전에는 다음과 같은 반사를 사용했습니다:
이제 간단히 쓸 수 있는 방법이 있습니다:
우리는 이러한 단순화를 무시할 수도 있지만, 결국 코드가 크게 축소되지 않은 것 같지만, 효율성과 아름다움이라는 두 가지 특성을 고려하면 동적 기능의 장점은 분명합니다. 컴파일러는 비캐시 반사 효율보다 훨씬 빠르도록 동적 최적화를 수행합니다. 비교해야 한다면, 위 두 코드(Add 메서드 호출 부분)를 1000000 단위로 실행해 결론을 내릴 수 있습니다.
|
이전의:mvc는 게시물의 JSON XML 데이터를 가져옵니다다음:인식 오류가 발생했습니다. 1행 근처, 10번 열에
|