2014-01-13 4 views
2

dynamic 우리는 거의 동적 포인터을 가지고 있지만 정확하게는 동적 개체이 아닙니다. C#의 진정한 동적 객체는 ExpandoObject이지만 대부분의 사람들에게는 정말 알려지지 않은 클래스입니다. expando를 사용하면 해시와 마찬가지로 런타임에 멤버를 만들고 삭제할 수 있습니다 (JavaScript와 유사).익명 형식이 ExpandoObject처럼 동적이지 않은 이유는 무엇입니까?

익명 형식의 기능으로 구현되는 대신 ExpandoObject 장점이 별도의 클래스에서 구현 된 이유는 무엇입니까?

유형 안전이 없기 때문에 그다지 좋지 않을까요? 아니면 (DLR) 오버 헤드가 관련되어 있을까요?

+0

익명 형식은 아마 하루에 12 번 사용되지만, 나는 지난 해 소수의 ExpandoObject와 동적 기능 만 사용해야했습니다. 즉, 시간의 99 % [YAGNI] (http://en.wikipedia.org/wiki/You_aren't_gonna_need_it) –

+0

익명 유형의 유형은 컴파일 타임에 알려져 있습니다. 그들은 DLR을 사용하지 않습니다. 연결이 확실하지 않습니까? http://stackoverflow.com/a/392163/453277 –

+2

"우리가 익명 형식을 처리 할 때 C#에서 동적을 사용하는 것이 대부분입니다." 뭐? 익명의 타입을 다룰 때는'dynamic'을 사용하지 말아야합니다. 당신이 있다면, 당신은 * 그 기능을 잘못 사용하고 있습니다 *. 익명의 타입은 * 동적 타입을 사용할 때 윈도우 밖으로 던지는 * 컴파일 타임 타입 세이프티 *를 가질 간단한 오브젝트를 생성하도록 설계되었습니다. – Servy

답변

7

익명 형식에는 매우 중요한 다른 기능이 있기 때문에 컴파일 타임 형식 안전을 제공합니다.

그리고 dynamic과 익명 유형은 단지 다른 개념입니다. 첫 번째 기능은 런타임에 객체 멤버를 전달할 수있는 기능을 제공하며 두 번째 기능은 해당 POCO 클래스를 만들지 않고도 일부 기본 기능 (동일성, 해시 코드 등)을 사용하여 정적으로 유형이 지정된 객체를 만들 수 있습니다. 왜 그들은 같은 방식으로 구현되어야 하는가?

btw. 나는 그것들을 사용하기 위해 꽤 많은 것을 사용하고 실제로는 거의 사용하지 않아도된다. dynamic. 이 언어 기능을 올바르게 사용하고 있습니까?

업데이트

난 그 익명 형식의 튜토리얼의 매우 중요한 부분이라고 생각 : 당신은 쿼리 결과를 저장하거나 메서드 경계 외부를 통과해야하는 경우

는, 일반라는 이름의 구조체를 사용하는 것을 고려 또는 익명 형식 대신 클래스를 사용할 수 있습니다.

+0

왜 내가 이것을 자주해야만한다는 가정입니까? – talles

+1

+1. @talles - 나는이 대답이 당신의 사용 빈도에 관해 아무것도 생각하지 않는다고 생각합니다. (또한 해당 문장의 당신의 말씨는 그러한 가정, 특히 "대부분 ... * 우리 * ..."부분으로 이어질 수 있습니다). 나는'동적 인'이 강하게 타자를 치는 언어에서 오는 사람들의 다만 아주 마음에 들지 않는 특성다는 것을 짐작한다 - 그래서 당신은 그것에 관하여 관련없는 잡담을 얻는다. –

+1

@AlexeiLevenkov 익명 형식은 '동적'에 적합하지 않습니다. 사용하도록 설계된 경우 '동적'을 사용하는 데 신경 쓰지 않습니다. – MarcinJuraszek

관련 문제