2009-03-17 6 views
5

전 이것에 대해 생각해 봤는데, this 질문을 읽을 때 다시 생각 나게되었습니다.향후 버전의 C#에서 "확장 속성"에 대한 계획이 있습니까?

향후 버전의 C#에서 "확장 속성"에 대한 계획이 있습니까?

좀 더 "컴파일러 마술"을 구현하는 것이 꽤나 명백한 것처럼 보입니다. 확장 등록 정보에 그 방법을 설정 할 get_ 및 확장 메서드 이름에 대한 set_ 접두사를 사용하여 예를 들어 :

public class Foo 
    { 
     public string Text { get; set; } 
    } 
    public static class FooExtensions 
    { 
     public static string get_Name(this Foo foo) 
     { 
      return foo.Text; 
     } 
     public static void set_Name(this Foo foo, string value) 
     { 
      foo.Text = value; 
     } 
    } 

이를 방지 할 수있는 기술적 인 제한이 있습니까? 이것은 뒤에서 너무 많은 것들을 만들어 낼 수 있습니까? 그만한 가치가있는만큼 중요하지 않습니까?

답변

7

기능 요청에 대한 공식 사이트는 http://connect.microsoft.com/VisualStudio입니다.

이미 확장 속성 here에 대한 요청이있었습니다.

확장 속성은 공통 요청하고, 우리가 실제로 의 다음 버전 언어의 디자인과 상당히 멀리 를 얻었으나, :

는 2008년 7월 29일에 마이크로 소프트의 대답은 다음과 같은 포함 궁극적으로 의 다양한 스크랩 때문에 어려움이 있습니다. 아직 우리의 레이더에 있습니다.

3

당신이 제안한 것이 좋은 생각이라고 생각하지 않지만 C# 4에서 곧 나오는 dynamic 유형을 사용하면 똑같은 것을 얻을 수 있습니다. 새로운 속성과 메소드를 런타임에 기존 객체 및 유형에 추가 할 수 있습니다. 한 가지 차이점은 확장 속성에 대한 컴파일 타임 검사를하지 않는다는 것입니다.

+0

"동적"유형과 일반 유형이 동일하다는 점과 정확히 같습니다. 러시아인은 그것에 대해 좋은 음란 한 농담을 가지고 있습니다. –

6

일반적으로 이것은 좋지 않은 실행을 장려 할 것이라고 생각합니다. 속성은 문제의 객체에 대한 어떤 종류의 상태를 나타내는 것으로 가정되지만 메소드는 작업 단위를 나타내야합니다. 그러나 많은 개발자들은 게터와 세터에 계산 집약적 인 또는 비교적 오래 실행되는 코드를 넣는 경향이 있습니다.이 코드는 메소드로서 훨씬 더 적합합니다. 객체를 확장하면 이 아닌이 파생됩니다. 속성을 추가해야하는 경우 철학적 관점에서 객체에 상태 정보를 추가해야한다는 점에 대해 이야기하고 있습니다. 수업에서 파생시켜야합니다.

+0

확장 속성은 "Text"대신 "Name"이라는 다른 속성에 대해 다른 이름처럼 간단 할 수 있습니다. 다른 속성의 조합 일 수도 있습니다. public static string get_FullName (this Name n) {return n.First + ""+ n.Last; } –

+0

@J Daniel Smith 그것은 속성을 만드는 것이 편리 할 수도 있지만 GetFullName()은 기능적으로 작동하기 때문에 있어야합니다. 어떤 이유에서든 공식적인 구별이 있습니다. "어떤 일"이 부동산에 "너무 많은 것"인지에 대한 토론에 시간을 할애 할 필요가 없습니다. –

+1

내가 원래의 프로그래머가 java에서 왔기 때문에 메서드로 상태를 표시하는 기존의 sealed 클래스가 있다고 가정 해 보겠습니다. 확장 속성을 사용하여 정리하고 싶습니다 ... 그게 뭐가 잘못 되었습니까? –

0

어떻게 작동하는지 잘 모르겠습니다. 확장 기능은 정적이어야하므로 속성 자체는 정적이어야합니다. 이러한 속성을 뒷받침하기 위해 사용하는 방법은 정적 일 수도 있습니다. 그러나 이들에 대한 계획된 사용이 유형 자체가 아닌 this 키워드로 표시된 인스턴스와 관련 될 것으로 기대합니다.

+0

왜 이것을 다운 그레이드 했습니까? 확장 메서드/속성 (따라서 +1)의 정적 상태에 대해 매우 좋은 질문을 제기합니다. 물론, 사람들이 의미하는 것은 그들이 상속이 ** 실제로 상속받지 않고 ** 제공하는 것과 동일한 동작을 달성하고자한다는 것입니다. 나는. 클래스의 이름을 유지하고 utilib에 도움이되는 파일을 보관하면 유용한 메소드 나 속성이 추가됩니다. 상처를 가지고 좋은가 ... –

0

"확장 속성"은 현재 상속을 통해 제공됩니다. 그런 짐승을 추가하면 빈약 한 실천을 조장하고 그 가치보다 더 많은 문제를 야기 할 수 있습니다.

+0

이 문제는 상속의 남용이며, 내가 개체의 생성을 완벽하게 제어 할 수있는 경우에만 작동한다는 것입니다. 예를 들어 system.string에서 상속 할 수는 없습니다. –

+0

도 원하지 않습니까? –

+0

C#은 다중 상속을 지원하지 않으므로 실제로이 예제로 깨끗한 디자인을 사용할 수없는 상황에 부딪히기 쉽습니다. 실제로 실제 예제로 실행 한 경우 " 삼촌 밥 "은 자신의 블로그 http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html 및 확장 속성에서 제안 된 문제에 대한 실행 가능한 해결책이 될 것이라고 언급합니다. –

2

그런 종류의 트릭에 대해 언급해야 할 부분이있을 수 있습니다.

WPF에서 첨부 된 속성을 살펴보십시오. 선언적 행동을 첨부하는 데 엄청난 권한을 부여합니다.하지만 선언적 컨텍스트 외부에서 어떻게 보이는지 확신 할 수 없습니다.

관련 문제