동적(C# 참조)

Dec 13, 2016 am 09:13 AM
.net dynamic

Visual Studio 2017 RC에 대한 최신 설명서는 Visual Studio 2017 RC 설명서를 참조하세요.

동적 유형을 통해 구현된 작업에서 이 유형의 역할은 컴파일 시간 유형 확인을 우회하고 대신 런타임에 이러한 작업을 해결하는 것입니다. 동적 유형은 COM API(예: Office 자동화 API), 동적 API(예: IronPython 라이브러리) 및 HTML DOM(문서 개체 모델)에 대한 액세스를 단순화합니다.

대부분의 경우 동적 유형은 객체 유형과 동일하게 동작합니다. 그러나 동적 유형의 표현식이 포함된 작업은 컴파일러에서 구문 분석되거나 유형 검사되지 않습니다. 컴파일러는 이 작업에 대한 정보를 함께 패키지하며, 이 정보는 나중에 런타임 작업을 계산하는 데 사용됩니다. 이 프로세스 동안 동적 유형의 변수는 object 유형의 변수로 컴파일됩니다. 따라서 동적 유형은 런타임이 아닌 컴파일 타임에만 존재합니다.

다음 예에서는 동적 유형의 변수와 object 유형의 변수를 비교합니다. 컴파일 타임에 각 변수의 유형을 확인하려면 WriteLine 문의 dyn 또는 obj 위에 마우스 포인터를 놓습니다. IntelliSense는 dyn 의 "동적"과 obj 의 "개체"를 보여줍니다.

class Program
    {        static void Main(string[] args)
        {            dynamic dyn = 1;            object obj = 1;            // Rest the mouse pointer over dyn and obj to see their
            // types at compile time.
            System.Console.WriteLine(dyn.GetType());
            System.Console.WriteLine(obj.GetType());
        }
    }
로그인 후 복사

WriteLine 문은 dyn 및 obj의 런타임 유형을 표시합니다. 이 시점에서 둘 다 동일한 정수 유형을 갖습니다. 다음 출력이 생성됩니다.

System.Int32

System.Int32

dyn과 obj의 차이점을 확인하려면 이전의 선언과 WriteLine 문 사이를 살펴보세요. 예 두 줄 사이에 다음을 추가합니다.

dyn = dyn + 3;  
obj = obj + 3;
로그인 후 복사

obj + 3 표현식에 정수와 객체를 추가하려는 시도에 대한 컴파일러 오류를 보고합니다. 그러나 dyn + 3 오류는 보고되지 않습니다. dyn이 포함된 표현식은 dyn이 동적 유형이기 때문에 컴파일 타임에 확인되지 않습니다.

컨텍스트

동적 키워드는 다음과 같은 상황에서 직접 또는 생성된 유형의 구성 요소로 나타날 수 있습니다.

선언에서 속성, 필드, 인덱서, 매개 변수, 반환 값 또는 유형 제약 조건으로서의 유형입니다. 다음 클래스 정의는 여러 다른 선언에서 동적을 사용합니다.

class ExampleClass
    {        // A dynamic field.
        static dynamic field;        // A dynamic property.
        dynamic prop { get; set; }        // A dynamic return type and a dynamic parameter type.
        public dynamic exampleMethod(dynamic d)
        {            // A dynamic local variable.
            dynamic local = "Local variable";            int two = 2;            if (d is int)
            {                return local;
            }            else
            {                return two;
            }
        }
    }
로그인 후 복사

명시적 유형 변환에서는 변환 대상 유형으로 사용됩니다.

 static void convertToDynamic()
        {            dynamic d;            int i = 20;
            d = (dynamic)i;
            Console.WriteLine(d);            string s = "Example string.";
            d = (dynamic)s;
            Console.WriteLine(d);

            DateTime dt = DateTime.Today;
            d = (dynamic)dt;
            Console.WriteLine(d);

        }        // Results:
        // 20
        // Example string.
        // 2/17/2009 9:12:00 AM
로그인 후 복사

유형이 값(예: is 연산자 또는 as 연산자의 오른쪽)으로 사용되거나 typeof에 대한 인수로 생성된 유형의 일부인 모든 컨텍스트에서. 예를 들어 다음 표현식에서는 Dynamic을 사용할 수 있습니다.

        int i = 8;            dynamic d;            // With the is operator.
            // The dynamic type behaves like object. The following
            // expression returns true unless someVar has the value null.
            if (someVar is dynamic) { }            // With the as operator.
            d = i as dynamic;            // With typeof, as part of a constructed type.
            Console.WriteLine(typeof(List<dynamic>));            // The following statement causes a compiler error.
            //Console.WriteLine(typeof(dynamic));
로그인 후 복사

다음 예에서는 여러 선언과 함께 동적을 사용합니다. Main은 또한 런타임 유형 검사와 컴파일 타임 유형 검사를 사용합니다.

using System;namespace DynamicExamples
{    class Program
    {        static void Main(string[] args)
        {
            ExampleClass ec = new ExampleClass();
            Console.WriteLine(ec.exampleMethod(10));
            Console.WriteLine(ec.exampleMethod("value"));            // The following line causes a compiler error because exampleMethod
            // takes only one argument.
            //Console.WriteLine(ec.exampleMethod(10, 4));

            dynamic dynamic_ec = new ExampleClass();
            Console.WriteLine(dynamic_ec.exampleMethod(10));            // Because dynamic_ec is dynamic, the following call to exampleMethod
            // with two arguments does not produce an error at compile time.
            // However, itdoes cause a run-time error. 
            //Console.WriteLine(dynamic_ec.exampleMethod(10, 4));
        }
    }    class ExampleClass
    {        static dynamic field;        dynamic prop { get; set; }        public dynamic exampleMethod(dynamic d)
        {            dynamic local = "Local variable";            int two = 2;            if (d is int)
            {                return local;
            }            else
            {                return two;
            }
        }
    }
}// Results:// Local variable// 2// Local variable
로그인 후 복사


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

차세대 C 컴파일러를 추가하는 방법 차세대 C 컴파일러를 추가하는 방법 Mar 03, 2025 pm 05:44 PM

차세대 C 컴파일러를 추가하는 방법

C 언어로 Null의 대안은 무엇입니까? C 언어로 Null의 대안은 무엇입니까? Mar 03, 2025 pm 05:37 PM

C 언어로 Null의 대안은 무엇입니까?

C 언어 컴파일러에 의해 코드를 복사하는 방법 C 언어 컴파일러에 의해 코드를 복사하는 방법 Mar 03, 2025 pm 05:43 PM

C 언어 컴파일러에 의해 코드를 복사하는 방법

어떤 C 언어 컴파일러가 더 낫습니까? 어떤 C 언어 컴파일러가 더 낫습니까? Mar 03, 2025 pm 05:39 PM

어떤 C 언어 컴파일러가 더 낫습니까?

C 언어 컴파일러의 웹 버전은 무엇입니까? C 언어 컴파일러의 웹 버전은 무엇입니까? Mar 03, 2025 pm 05:42 PM

C 언어 컴파일러의 웹 버전은 무엇입니까?

Null은 C 언어로 된 현대 프로그래밍에서 여전히 중요합니까? Null은 C 언어로 된 현대 프로그래밍에서 여전히 중요합니까? Mar 03, 2025 pm 05:35 PM

Null은 C 언어로 된 현대 프로그래밍에서 여전히 중요합니까?

C 언어 온라인 프로그래밍 웹 사이트 C 언어 컴파일러 공식 웹 사이트 요약 C 언어 온라인 프로그래밍 웹 사이트 C 언어 컴파일러 공식 웹 사이트 요약 Mar 03, 2025 pm 05:41 PM

C 언어 온라인 프로그래밍 웹 사이트 C 언어 컴파일러 공식 웹 사이트 요약

C 언어 컴파일러 설치 자습서 (컴퓨터 버전) C 언어 컴파일러 설치 자습서 (컴퓨터 버전) Mar 03, 2025 pm 05:41 PM

C 언어 컴파일러 설치 자습서 (컴퓨터 버전)

See all articles