2010-08-09 7 views
23

동적 유형과 객체 유형을 혼용하여 사용했습니다. 이 두 가지 유형간에 차이가 있습니까? 하나를 다른 것보다 사용하는 것이 성능에 미치는 영향이 있습니까? 어느 것이 더 유연합니까?동적 대 객체 유형

답변

35

그들은 모두 입니다. 상당히입니다.

dynamic을 사용하는 경우 동적 입력을 선택하므로 대부분의 경우 컴파일 시간 확인이 선택되지 않습니다. 그리고 네, 정적 입력을 사용하는 것보다 성능이 떨어집니다 여기서 정적 유형 지정을 사용할 수 있습니다.

그러나 어쨌든 object 유형으로는 많은 것을 할 수 없습니다. 멤버는 거의 없습니다. 어디에서 사용하고 있습니까? 다양한 유형으로 작업 할 수있는 범용 코드를 작성하려면 보통 object 대신 제네릭을 고려해야합니다. 우리는 심지어 VAR 유형 동적객체 유형 비교 것을 볼 수 있습니다 C# 언어의 발전과 함께

+0

Luke가 방금 System.Object에서 사용할 수있는 몇 가지 메소드를 호출했다면 동적으로 호출할까요? –

+2

@Steven : 네, 그렇습니다 - 심지어 GetType은 비 가상입니다! 예를 들어,'ExpandoObject'에서'GetType' 호출에 반응하도록 델리게이트를 설정할 수 있습니다. 무서운 것들.) –

+0

그건 내가 두려워했던 것입니다. 우리가 그 유형에 대한 진실을 알고 싶다면'객체'에 업 캐스팅함으로써'동적 인'을'상자에 넣어야 '하는 것처럼 보입니다. :-) –

3

.

  1. 객체는 C# 1.0에 도입 된

    개체 : 여기에 내가이 7 점을 비교하여 배운 3 종류가 있습니다.

  2. 개체가 .NET Framework의 모든 유형의 기본 클래스이기 때문에 모든 종류의 값을 저장할 수 있습니다.
  3. 컴파일러에는 유형에 대한 정보가 거의 없습니다.
  4. 개체 형식을 메서드 인수로 전달할 수 있으며 메서드는 개체 형식을 반환 할 수도 있습니다.
  5. 오브젝트 변수를 사용하고 원하는 조작을 수행하려면 오브젝트 변수를 원래 유형으로 변환해야합니다.
  6. 저장된 값이 기본 데이터 형식으로 변환되지 않으면 런타임에 문제가 발생합니다.
  7. 데이터 유형에 대한 추가 정보가없는 경우에 유용합니다.

바르

  1. 바르가 C# 3.0
  2. 그것은 모든 유형의 값을 저장할 수 있습니다 도입하지만, 선언시 var에 유형을 초기화하는 필수했다.
  3. 형식이 안전합니다. 즉, 컴파일러는 저장된 값에 대한 모든 정보를 가지고 있으므로 런타임에 문제가 발생하지 않습니다.
  4. Var 형식을 메서드 인수로 전달할 수 없으며 메서드가 개체 형식을 반환 할 수 없습니다. Var 유형은 정의 된 범위에서 작동합니다.
  5. 컴파일러에서 작업을 수행하는 데 필요한 모든 정보가 있으므로 캐스트 할 필요가 없습니다.
  6. 컴파일러에 저장된 값에 대한 모든 정보가 있으므로 문제가 발생하지 않습니다.
  7. 실제 유형, 즉 유형이 익명 인 경우 유용합니다.

동적

  1. 동적는 C# 4.0
  2. 그것은 이전 VB 언어 변수 유사한 변수 중 어느 형태를 저장할 수 도입 하였다.
  3. 형식 안전하지 않습니다. 즉, 컴파일러에는 변수 유형에 대한 정보가 없습니다.
  4. 동적 형식을 메서드 인수로 전달할 수 있으며 메서드는 동적 형식을 반환 할 수도 있습니다.
  5. 캐스팅은 필요하지 않지만 저장된 형식과 관련된 속성 및 메서드를 알아야합니다.
  6. 저장된 값에 대한 모든 정보가 런타임에만 해결되기 때문에 잘못된 속성이나 메서드에 액세스하면 문제가 발생합니다.
  7. 반사 또는 동적 언어 또는 COM 개체를 사용하여 코드를 작성해야 할 때 유용합니다. 코드를 적게 작성해야하기 때문입니다.

이렇게하면 도움이되기를 바랍니다.

감사합니다. 간단한 언어에서

+1

var은 형식이 아님을 이해합니다. 초기화 된 값을 기반으로 형식을 암시 적으로 결정합니다. 예를 들면 다음과 같습니다. var x = 2; x는 var 유형이 아니며 int 유형입니다. – Nanomurf

0

:

public static void ConsoleWrite(string inputArg) 
{ 
    Console.WriteLine(inputArg); 
} 

객체 :

public static void Main(string[] args) 
{ 
    object obj = "String Sample"; 
    ConsoleWrite(obj);// compile error 
    ConsoleWrite((string)obj); 
    Console.ReadKey(); 
} 

동적 : 다음 코드 캐스트 개체를 제외하고 문자열에 컴파일 오류가
웹 가정 다음과 같은 방법을 : 다음 코드는 성공적으로 컴파일되지만 string을 제외한 값이 있으면 런타임 오류가 발생합니다. 또는

public static void Main(string[] args) 
{ 
    dynamic dyn = "String Sample"; 
    ConsoleWrite(dyn); 
    dyn = 1; 
    ConsoleWrite(dyn);// Runtime Error 
    Console.ReadKey(); 
}