C #에서 동적 유형 사용의 단점


14

최근 에 C # 의 동적 유형 에 대해 더 많이 연구했습니다 . 일부 예제를 통해 일단 코드가 컴파일되면 다시 컴파일 할 필요는 없지만 직접 실행할 수 있음을 이해했습니다 .

데이터 유형을 마음대로 변경할 수있는 키워드가 제공하는 유연성이 큰 이점이라고 생각 합니다.

질문,

개발자가 구현을 시작하기 전에 알아야하는 런타임 예외 발생 시키는 잘못된 동적 메소드 호출과는 별도로 특정 단점 이 있습니까?


3
C # 3에서는 항상 object또는 직접 유형 캐스트를 코드 냄새로 간주했습니다. 거의 모든 경우에있어 그것은 나와 팀 중 하나가 해당 기능에 적합한 인터페이스를 설계하지 않았 음을 의미했습니다. 지금 C # 4를 사용하고 있다면 사용법과 거의 같은 느낌이들 것 dynamic입니다. 모든 것을 역동적으로 만들면 그 경우를 알 수 있지만 그 경우 먼저 동적 유형 언어를 선택했을 수도 있습니다. * 8 ')
Mark Booth

관점은 @MarkBooth +1입니다. C #을 사용한 핵심 구현은 4.0에서 동적 유형을 도입하더라도 여전히 강력한 유형으로 유지 될 것이라고 말하는 것이 안전합니까?
Karthik Sreenivasan

dynamicC #에서 사용 한다는 것은 코드의 작은 부분에 동적 입력이 필요한 경우 IronPython에 빠질 필요가 없다는 것을 의미합니다. 식 평가자 dynamic의 경우 식의 피연산자와 평가 결과를 나타내는 데 크게 성공했습니다 .
Ed James

@EdJames-.Net을 사용하여 dynamic개발할 때 IronPython에 대해 알고 싶었습니다. .Net으로 훨씬 쉽게 할 수 있었을 수도 있습니다 .
마크 부스

답변:


16

가장 큰 단점은 C #의 주요 속성 중 하나는 버리지 않고 정적으로 입력한다는 것입니다.

동적 타이핑의 문제점은 컴파일 중 공개 될 버그를 숨기는 경우가 많습니다. 그런 버그는 런타임에만 나타납니다. 물론 감지하기가 훨씬 더 어렵습니다.

C #에서 동적 타이핑을 사용해야하는 이유는 거의 없으며, 주된 이유는 동적 형식 언어 와의 공동 작업입니다 (AFAIK는 동적이 처음 도입 된 이유입니다).

완전히 동적으로 유형이 지정된 프로그래밍을 수행하려면 C #을 동적으로 해킹하지 않고 동적으로 설계된 일부 언어를 살펴 봐야합니다. .Net 라이브러리를 사용하려는 경우 예를 들어 IronPython을 사용할 수 있습니다.


IronPython의 경우 +1 이는 장기적으로 유지 보수 문제로 이어질 수 있음을 의미합니다.
Karthik Sreenivasan

6
가장 큰 dynamic장점은 어떤 종류의 리플렉션 해킹 없이도 객체를 실제 유형으로 업 캐스트 할 수 있다는 것입니다 . 예를 들어 경우 Base foo = new Derived();거기에 두 개의 오버로드 된 방법이었다 Moo(Base x)Moo(Derived x)다음 Moo(foo)호출 Moo(Base x)하지만, Moo((dynamic)foo)호출 Moo(Derived x). 예를 들어 방문자 패턴의 매우 우아한 구현이 리드 : code.logos.com/blog/2010/03/... 및 일반 매우 강력한 기술이다.

@TheMouthofaCow 니스, 동적으로도 몇 가지 다른 "합법적 인"사용이있을 수 있지만, 이것들 사이에는 거의 없으며 (그리고 당신은 이와 같은 것을 시도하기 전에 무엇을하고 있는지 확실히 알아야합니다).
Matěj Zábský

@TheMouthofaCow 주목할만한 새로운 디자인 패턴 (방문자 패턴). 감사.
Karthik Sreenivasan

1
예, 꽤 멋집니다. 지난주에 독립적으로 생각해 냈으므로 C # 무기고에 채택 된 아이디어라는 것이 좋았습니다.

9

어떤 종류의 단점을 찾고 있는지 잘 모르겠지만 정적 타이핑에서는 작동하지만로는 작동하지 않는 기능에 대해 알고 싶다면 다음과 dynamic같이하십시오.

  1. 확장 프로그램이 작동하지 않습니다. 이것은 아마도 가장 큰 것입니다. 이 dynamic collection있으면와 같은 코드를 사용할 수 없습니다 collection.Distinct(). 사용 가능한 확장 방법은 네임 스페이스에 의존 using하고 DLR은이를 알 수있는 방법이 없기 때문입니다.

    해결 방법으로, 일반적인 정적 메소드 인 것처럼 메소드를 호출 할 수 있습니다 Enumerable.Distinct(collection). 또는 컬렉션 유형을 다음과 같이 변경할 수 있습니다 IEnumerable<dynamic>.

  2. foreach필요합니다 IEnumerable. 일반적인 C #에서는 foreach패턴 기반입니다. 즉, 특정 인터페이스가 필요하지 않으며 GetEnumerator()적절한 객체를 반환 하는 메서드 일뿐 입니다. foreachon 을 사용 하는 경우 dynamic구현 IEnumerable이 필요합니다. 그러나이 동작의 이유는 C # 1.0에 제네릭이 없기 때문에이 "약점"은 거의 관련이 없습니다.


확장 방법의 경우 +1 이것은 GroupBy ()와 같은 다른 LINQ 쿼리 연산자에도 적용됩니까?
Karthik Sreenivasan

2
@Karthik : 그렇습니다. 확장 방법은 컴파일 타임 구문 설탕이므로 해결되지 않는다고 생각합니다.

@TheMouthofaCow +1-설명 주셔서 감사합니다.
Karthik Sreenivasan

1
확장 방법, 즉 동적에서 런타임에 확장 방법을 파악할 수 없지만 설명한 동적 컬렉션을 따를 수없는 방법에 동의합니다.
Karthik Sreenivasan

7

.net에서 동적으로 선언 된 변수가 아닌 동적 형식 의 문제 는 정적 형식에 사용할 수있는 기능이 많지 않다는 것입니다.

  • 반영이 없습니다 (멤버를 반복 할 수는 있지만 다른 것은 많지 않습니다)
  • 메타 데이터 없음 (동적 데이터 사이트 / mvc에서 유효성 검사가 수행됨)
  • 컴파일 타임에 절대 검사하지 않습니다 (맞춤법 오류가 발견되지 않습니다)
  • 이것은 멍청한 놈들이 남용 / 오용 / 오해하는 경향이있는 강력한 기능이기 때문에
  • 동적 유형으로 작성된 코드는 유지 관리가 어렵고 리팩토링하기가 어렵습니다.
  • 오리 타이핑 및 기타 기능으로 인해 전문가는 다른 사람이 읽을 수없는 코드를 작성할 수 있습니다.

따라서 수행중인 작업을 모르는 경우 동적 유형으로 코드를 작성하지 마십시오.


6

때문에 dynamic단지가 표시되어 object그것을 상자 유형을 소중하게 생각합니다.

이것은 성능에 영향을 미칠 수 있지만 어쨌든 성능 결정 코드에서 정적 입력을 사용하기 때문에 실제로는 문제가되지 않습니다.

이 권투는 또한 변경 가능한 값 유형을 방해합니다. 로 dynamic수정하면 상자 사본 만 수정됩니다. 그러나 처음에는 가변 값 유형을 사용해서는 안되므로 큰 문제는 아닙니다.


+1 동의합니다. 정적 입력은 성능이 중요한 코드에 가장 적합한 방법입니다.
Karthik Sreenivasan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.