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
'Development Tip' 카테고리의 다른 글
길이를 알 수없는 입력 문자열을 어떻게 읽을 수 있습니까? (0) | 2020.12.29 |
---|---|
overflow : hidden + display : inline-block이 텍스트를 위로 이동 (0) | 2020.12.29 |
Pandas 막대 그림의 값으로 막대에 주석 달기 (0) | 2020.12.29 |
numpy 배열의 요소 이동 (0) | 2020.12.29 |
Webview는 onReceivedSslError 구현시 Google Play의 보안 경고를 방지합니다. (0) | 2020.12.29 |