dynamic(C# 참조)

dynamic 형식을 사용하면 컴파일 타임 형식 검사를 무시하는 작업을 수행할 수 있습니다. 대신, 이러한 작업은 런타임에 확인됩니다. dynamic 형식은 Office Automation API와 같은 COM API, IronPython 라이브러리와 같은 동적 API 및 HTML DOM(문서 개체 모델)에 대한 액세스를 간소화합니다.

형식 dynamic은 대부분의 환경에서 형식 object 같이 동작합니다. 그러나 형식 dynamic의 식이 포함된 작업은 컴파일러에서 형식이 확인되지 않습니다. 컴파일러는 작업에 대한 정보를 함께 패키지하고 해당 정보는 나중에 런타임에서 작업을 평가하는 데 사용됩니다. 프로세스의 일부로 변수 형식 dynamic이 object 형식 변수에 컴파일됩니다. 따라서 형식 dynamic은 런타임이 아닌 컴파일 타임에만 존재합니다.

다음 예제는 형식 dynamic의 변수를 형식 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의 형식이 dynamic이기 때문에 컴파일할 때 확인되지 않습니다.

컨텍스트

dynamic 키워드는 다음과 같은 경우에 직접 또는 생성된 형식의 구성 요소로 나타날 수 있습니다.

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

    class ExampleClass
    {
        // A dynamic field.
        static dynamic field;
    
        // A dynamic property.
        dynamic prop { get; set; }
    
        // A dynamic return type and a dynamic paramater 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));
    

예제

다음 예제의 여러 선언에서 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

자세한 내용과 예제를 보려면 dynamic 형식 사용(C# 프로그래밍 가이드)을 참조하십시오.

참고 항목

작업

방법: AS 및 IS 연산자를 사용한 안전한 캐스팅(C# 프로그래밍 가이드)

참조

object(C# 참조)

is(C# 참조)

as(C# 참조)

typeof(C# 참조)

System.Dynamic.ExpandoObject

System.Dynamic.DynamicObject

기타 리소스

dynamic 형식 사용(C# 프로그래밍 가이드)

연습: 동적 개체 만들기 및 사용(C# 및 Visual Basic)