>  기사  >  백엔드 개발  >  동적(C# 참조)

동적(C# 참조)

高洛峰
高洛峰원래의
2016-12-13 09:13:451337검색

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으로 문의하세요.
이전 기사:Objective-C의 @dynamic다음 기사:Objective-C의 @dynamic