Development Tip

C # 동적 유형이 정적 인 이유는 무엇입니까?

yourdevel 2020. 12. 29. 08:02
반응형

C # 동적 유형이 정적 인 이유는 무엇입니까?


dynamic 키워드를 읽고 탐색하는 동안 [MSDN]에서 다음 줄을 찾았습니다 ( Using Type dynamic (C # Programming Guide) ).

유형은 정적 유형이지만 동적 유형의 객체는 정적 유형 검사를 우회합니다. 대부분의 경우 객체 유형이있는 것처럼 작동합니다.

위 줄에서 정적의 의미는 무엇이며 정적 유형 검사를 어떻게 우회합니까?


이것은 정적 유형입니다.

string foo = "bar";

foo 이제 문자열이므로 컴파일 시간 오류가 발생합니다.

foo = 1;

를 사용하더라도 var여전히 정적으로 입력됩니다.

var foo = "bar";     // foo is now a string
foo = 1;             // still a compile time error

dynamic 키워드를 사용하면 유형이 정적이 아니고 변경할 수 있으므로 이제 다음을 수행 할 수 있습니다.

dynamic foo = "bar";   
foo = 1;              // this is now fine.

이제 "유형이 정적 유형입니다"라고 말하는 이유는 많은 동적 언어 (예 : Javascript)에서 다음과 같이 할 수 있기 때문입니다.

var foo = { bar: 1 };

"bar"라는 속성을 가진 객체를 생성하고 다음을 수행 할 수 있습니다.

foo.la = 2;

어떤 추가 에서 개체에 새로운 속성을 foo. 그러나 C #에서 동일한 트릭을 시도하면

dynamic foo = new SomeClassThatDoesntHaveABarProperty();
foo.bar = 2;          // runtime error

속성을 삭제할 수도 없습니다. 모든 유형을 동적 변수에 할당 할 수 있지만 이러한 유형을 직접 변경할 수는 없습니다.

이러한 유형의 기능이 필요한 경우 ExpandoObject 를 살펴보고 싶을 것입니다.

귀하의 설명에서 알 수 있듯이 dynamic많은 경우에 객체처럼 작동합니다. 다음과 같이 할 수 있습니다.

dynamic foo = new Foo();
foo = new Bar();

다음과 같이 :

object foo = new Foo();
foo = new Bar();

그러나 속성이나 메서드를 사용하려는 경우 차이가 발생합니다. dynamic을 사용하면 다음과 같이 할 수 있습니다.

dynamic foo = new Foo();
foo.FooMethod();          // Note: You WILL get a runtime exception if foo doesn't have a FooMethod

그러나 개체를 사용하면 다음을 수행해야합니다.

object foo = new Foo();
((Foo)foo).FooMethod();    // Note: I HAVE to know the type at compile time here

foo타입을 Foo at compile time 타입으로 캐스팅 할 수 있다는 것을 이미 알고있을 때만 할 수 있고, 이미 알고 있다면 . Foo대신 내 타입으로 사용할 수 있습니다 object.


이는 dynamic으로 선언 된 변수가 dynamic 유형으로 유지되며 예를 들어 int 유형의 변수로 변경할 수 없음을 의미합니다. 변수가 보유하는 객체 유형을 변경할 수 있기 때문에이 개념은 무시됩니다.

C #은 변수가 정적으로 형식화되기 때문에 강력한 형식의 언어로 간주됩니다. 즉, 모든 변수가 형식화되고 C # 컴파일러가 코드에서 올바른 형식이 사용되는지 확인할 수 있습니다. 대부분의 스크립트 언어와 같이 약한 유형의 언어에서는 변수 유형이 동적입니다. 그들은 어떤 가치도 가질 수 있습니다.

참조 URL : https://stackoverflow.com/questions/25124664/why-is-c-sharp-dynamic-type-static

반응형