C# 4.0은 새로운 타입인 dynamic을 도입했는데, 이는 정적 타입이지만, 이 타입의 객체 인스턴스는 정적 타입 검사 과정을 우회할 수 있습니다. 대부분의 경우, 이 타입은 객체 클래스처럼 작동합니다. 컴파일 시에는 동적 클래스 인스턴스가 어떤 연산이든 지원하므로 객체가 COM API에서 가져왔는지, IronPython 같은 동적 언어에서 가져왔는지, HTML DOM에서 가져왔는지, 반사에서 가져왔는지, 또는 프로그램 내 다른 곳에서 가져왔는지 걱정할 필요가 없습니다. 하지만 코드가 무효 동작을 하면, 런타임에 오류가 발견됩니다. 예를 들어, 다음 코드 스니펫의 예제 메서드 exampleMethod1은 매개변수가 하나뿐이며, 컴파일러는 컴파일 시 ec.exampleMethod1(10,4)를 호출할 때 이 매개변수가 유효하지 않음을 식별할 수 있습니다; 이것은 컴파일 오류입니다. 두 번째 호출 dynamic_ec.exampleMethod1(10,4)은 정적 타입이 확인되지 않습니다. 따라서 컴파일러는 컴파일 오류를 보고하지 않습니다. 하지만 벌레는 영원히 숨지 않는다; 런타임에 포착되어 런타임 예외를 트리거합니다. static void Main(string[] args){ ExampleClass ec = 새로운 ExampleClass(); dynamic dynamic_ec = new ExampleClass(); dynamic_ec.exampleMethod1(10, 4); dynamic_ec.someMethod("some argument", 7, null); dynamic_ec.nonexistentMethod();
} 클래스 예제클래스 { 공개 예제클래스() { } public ExampleClass(int v) { } public void exampleMethod1(int i) { } public void exampleMethod2(string str) { }
} 다음은 IronPython을 호출할 때 dynamic을 사용하는 예시입니다:
IronPython.Hosting을 사용; Microsoft.scrip{filtering}ting을 사용. 진행;
Console.WriteLine("로딩 random.py..."); scrip{filter}tRuntime py = Python.CreateRuntime(); 동적 난수 = py. UseFile("random.py"); Console.WriteLine("random.py loaded!"); var items = Enumerable.Range(1, 7). ToArray();
(정정 s = 0; 10000< s++) { random.shuffle(items); Console.Write("시{0}: ", s); foreach (항목에서 int i) { Console.Write("{0} ", i); } 콘솔.WriteLine();
}
동적 타입의 객체나 표현식의 경우, 컴파일러의 역할은 각 표현식이 수행해야 할 동작을 캡슐화하고, 실행 시 저장된 정보를 확인하며, 무효 문장이 있으면 런타임 예외를 트리거합니다. 대부분의 동적 연산의 결과 유형도 동적입니다. 예를 들어, 다음 예시에서 마우스 포인터를 testSum 위에 올리면 스마트 프롬프트는 (로컬 변수) 동적 testSum을 표시합니다. 동적 D = 1; var testSum = d + 3; 마우스 포인터를 아래 testSum 위에 올리세요. System.Console.WriteLine(testSum);
타입 변환 동적 타입 인스턴스와 다른 유형의 인스턴스 간 전환은 간단하며, 개발자들은 다이믹과 비동적 동작 사이를 쉽게 전환할 수 있습니다. 어떤 인스턴스든 암묵적으로 동적 타입 인스턴스로 변환될 수 있으며, 다음 예시를 참조하세요: 동적 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 세트입니다.
COM 상호운용성 C# 4.0은 Office 자동화와 같은 전통적인 COM API 인터페이스와의 상호운용성을 향상시키는 여러 기능을 포함하고 있습니다. 동적 타입, 이름 있는 매개변수, 선택적 매개변수도 개선의 일부입니다. 많은 COM 메서드는 매개변수와 반환값을 객체 타입으로 설정할 수 있어, C#과 같은 강타입 언어의 경우 많은 강제 타입 변환이 필요합니다. 하지만 C# 4.0에서는 컴파일 시에 /link 옵션을 추가하면 동적 타입이 새로운 효과를 갖게 됩니다: COM 인터페이스 메서드 서명의 객체 타입(매개변수 타입 또는 반환 타입)이 동적으로 간주되어 타입 변환을 많이 피할 수 있습니다. 예를 들어, 다음 문장은 이를 대조합니다. 동적 모드는 사용하지 않습니다. ((Excel.Range)Excel. 세포[1, 1]). Value2 = "이름"; Excel.Range 범위 = (Excel.Range)excel. 셀[1, 1];
역동적인 관계였다. 엑셀. 셀[1, 1]. 값 = "이름"; 엑셀. 범위 범위 = 엑셀. 셀[1, 1]; |