program story

C # 컴파일러에서 덕 타이핑

inputbox 2020. 12. 2. 21:02
반응형

C # 컴파일러에서 덕 타이핑


참고 이것은 C #에서 덕 타이핑을 구현하거나 에뮬레이트하는 방법에 대한 질문 아닙니다 .

몇 년 동안 나는 특정 C # 언어 기능이 언어 자체에 정의 된 데이터 구조에 의존한다는 인상을 받았습니다 (항상 나에게 이상한 닭과 달걀 시나리오처럼 보였습니다). 예를 들어, 나는 foreach루프가 구현 된 유형에서만 사용할 수 있다는 인상을 받았습니다 IEnumerable.

그 이후로 나는 객체가 찾고, foreach는 루프에서 사용할 수 있는지 여부를 입력 오리 C # 컴파일러가 사용하는 결정하는 것을 이해하게 될 것 GetEnumerator보다는 방법 IEnumerable. 이것은 닭고기와 계란 수수께끼를 제거하므로 많은 의미가 있습니다.

왜 이것이 using블록 및 .NET 의 경우에 해당하지 않는지에 대해 약간 혼란 스럽습니다 IDisposable. 컴파일러가 덕 타이핑을 사용하지 않고 Dispose메서드를 찾을 수없는 특별한 이유가 있습니까? 이 불일치의 이유는 무엇입니까?

IDisposable을 사용하여 다른 작업이 진행되고 있습니까?

당신은 왜 토론 으로 IDisposable을 구현하지 않은 폐기 방법으로 객체를 가지고하는 것은 외부에서이 질문의 범위입니다 :)


아무것도 특별한 대해있어 IDisposable여기 -하지만 거기에 있다 뭔가 특별한 반복자에 대해.

이 오리 유형을 사용하여 C # 2, 이전에 foreach있던 유일한 당신이이 반복자를 강력한 형식의 구현 및 권투없이 값 형식의 반복의 또한 유일한 방법 수 있었다. 나는 의심 C # 및 .NET이 시작하는 제네릭 있었다면 있다는 foreach것이다 요구 IEnumerable<T> 대신을하지가 오리 타이핑을했다.

이제 컴파일러는 제가 생각할 수있는 몇 가지 다른 위치에서 이런 종류의 덕 타이핑을 사용합니다.

  • 컬렉션 이니셜 라이저는 적절한 Add오버로드를 찾습니다 (뿐만 아니라 IEnumerable실제로 어떤 종류의 컬렉션임을 보여주기 위해 구현해야하는 유형도 확인). 이를 통해 단일 항목, 키 / 값 쌍 등을 유연하게 추가 할 수 있습니다.
  • LINQ Select등-LINQ가 유연성을 달성하여 IEnumerable<T>자체 변경없이 여러 유형에 대해 동일한 쿼리 식 형식을 허용하는 방법 입니다.
  • C # 5 await 식은 / / GetAwaiter가있는 awaiter 형식을 반환 해야 합니다.IsCompletedOnCompletedGetResult

두 경우 모두 이전에는 개념이 존재하지 않았던 기존 유형 및 인터페이스에 기능을 더 쉽게 추가 할 수 있습니다.

이것이 IDisposable첫 번째 버전 이후 프레임 워크에 있었다는 점 감안할 때 , 덕이 using문장을 타이핑하는 데 아무런 이점이 없을 것이라고 생각 합니다. 나는 당신 이 논의에서 Dispose구현하지 않은 이유를 명시 적으로 무시하려고 시도한 것을 알고 IDisposable있지만 그것이 중요한 포인트라고 생각합니다. 언어로 기능을 구현하는 데에는 타당한 이유가 있어야하며, 덕 타이핑은 알려진 인터페이스를 지원하는 것 이상의 기능이라고 주장합니다. 그렇게해서 분명한 이점이 없다면 언어로 끝나지 않을 것입니다.


닭고기와 계란 이 없습니다.에 의존하지 않기 때문에 foreach의존 할 수 있습니다. foreach가 구현되지 않은 컬렉션에 허용되는 이유 는 아마도 대부분 역사적입니다 .IEnumerableIEnumerableforeachIEnumerable

C #에서는 컬렉션 클래스가 foreach와 호환되기 위해 IEnumerable 및 IEnumerator에서 상속 할 필요가 없습니다. 클래스에 필요한 GetEnumerator, MoveNext, Reset 및 Current 멤버가있는 한 foreach와 함께 작동합니다. 인터페이스를 생략하면 Current의 반환 유형을 객체보다 더 구체적으로 정의하여 유형 안전성을 제공 할 수 있다는 장점이 있습니다.

게다가 모든 닭고기와 달걀 문제가 실제로 문제가되는 것은 아닙니다. 예를 들어 함수가 자신을 호출 할 수 있거나 (재귀!) 참조 유형이 자신을 포함 할 수 있습니다 (연결 목록과 같이).

그래서 using그들이 간단히 말할 수있을 때 왜 그들은 오리 타이핑으로 지정하기 위해 까다로운 것을 사용했을 IDisposable까요? 근본적으로, 덕 타이핑을 사용하면 유형 시스템 주변에서 최종 실행을 수행하는 것입니다. 이는 유형 시스템이 문제를 해결하기에 불충분하거나 비현실적인 경우에만 유용합니다.


당신이 묻는 질문은 닭고기와 달걀 상황이 아닙니다. 언어 컴파일러가 구현되는 방식과 더 비슷합니다. C #과 VB.NET 컴파일러는 다르게 구현됩니다. hello world의 간단한 코드를 작성하고 컴파일러로 컴파일하고 IL 코드를 검사하면 달라집니다. 귀하의 질문으로 돌아와서 .NET 용 C # 컴파일러에서 생성되는 IL 코드에 대해 설명하겠습니다 IEnumerable.

IEnumerator e = arr.GetEnumerator();

while(e.MoveNext())
{
   e.Currrent;
}

따라서 C # 컴파일러는 foreach.

참고 URL : https://stackoverflow.com/questions/6368967/duck-typing-in-the-c-sharp-compiler

반응형