2009-04-21 3 views
9

왜 이런가요? 나는 을 찾을 것이고 내 클래스 중 하나에서만 사용되도록 잠겨있는 확장 메서드를 사용할 수있게되어서 기쁩니다. 정말 모든 곳에서 사용되는 특정 확장 메서드를 갖고 싶어 ... 그리고 그들은 그렇게 일반 정적 방법보다 훨씬 좋네요 보지 마십시오 : P중첩 된 정적 클래스에서 확장 메서드를 사용할 수 없습니까?


설명의 경우 :

나는이 확장 방법을 원하는 이유가 있기 때문이다 나는 DataGridView가있는 Form을 확장하고있다. 그리고 나는이 같은 라인의 매우 피곤하고 있습니다 :

foreach(var row in grid.Rows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value)) 

foreach(var row in grid.SelectedRows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value)) 

난 그냥 즉

foreach(var row in grid.Rows.CheckedRows()) 

foreach(var row in grid.SelectedRows.CheckedRows()) 

그래서 할 수 있도록 확장 방법을 하시겠습니까,이 확장 방법은 전혀 도움이되지 않을 것 이 수업 외부. 그러나 코드를 훨씬 더 깔끔하게 만듭니다. 당연히 규칙적인 방법도 만들 수 있습니다. 이것이 가능하지 않았기 때문에 제가 끝내었던 것입니다.

나는 누군가가 확장 메서드를 사용할 수있는 곳에 이러한 제한을두기로 결정한 이유에 대해 좋은 논쟁이 있었는지를 알고 싶어했습니다. 정적 클래스에 있어야합니다.은 완전히 의미가 있습니다. 중첩 된 정적 클래스에있을 수 없습니다. 적어도 ...

+0

그런 대답 중 어느 것도 할 수없는 좋은 기술적 이유가 없습니다. –

+0

당신처럼, 나는 확장 메서드 구문을 선호한다. SomeThing.HasSomeCondition()은 HasSomeCondition (SomeThing)보다 월등합니다. – Mir

답변

1

확장 메소드를 사용하면 실제로 코드를 많이 만들겠습니까? 클래스에 표준 도우미 메서드를 사용하는 것보다 훨씬 깨끗합니까?

// extension method 
foreach (var row in grid.Rows.CheckedRows()) 
foreach (var row in grid.SelectedRows.CheckedRows()) 

// standard helper method 
foreach (var row in CheckedRows(grid.Rows)) 
foreach (var row in CheckedRows(grid.SelectedRows)) 
+1

아마도 아닙니다. 나는 물건이 거꾸로되지 않을 때 나는 그것을 더 좋아한다. 거의. 어쩌면 단지 "그리드 -> 행 -> 체크 된 것들"에서 "그리드 -> 행의 체크 된 것"으로 나의 생각을 조정할 필요가 있겠지만 ... 흠 ... 그러나 나는 이런 종류의 변화를 주관적인 것으로 생각한다. 지금은 일종의 코딩 스타일. 그래도 좋은 지적! =) 누군가가 마이크로 소프트와 관련된 "이 생각이면의"종류의 문제와 관련이없는 한 그것을 대답으로 받아 들일 것입니다. – Svish

+2

@Svish (나중에) : 주관적이지 않습니다. 확장되지 않은 수축성이 너무 작아서 과도한 중첩 (예 : 가독성 저하)이 발생합니다. 확장 구문은 reader-tailcalls의 형식입니다. –

2

유형을 확장하는 경우 확장 메소드는 유형 자체와 동일하게 액세스 할 수 있어야합니다.

모범 사례는 모든 확장 메서드를 한 위치에 배치하는 것이 좋습니다. 하나의 정적 클래스 또는 단일 네임 스페이스 내에 포함하는 것이 좋습니다.

+5

모든 확장 메소드를 한 곳에 모으는 것은 모든 유틸리티 메소드를 한 곳에서 처리하는 것과 같은 나쁜 생각입니다. –

+0

유형을 확장하는 경우 확장 메소드가 해당 유형만큼 확실하게 액세스 할 수 있어야합니까? –

+3

나는 OP와 함께있다. 확장 메소드의 범위를 제한하는 것이 좋습니다. 때로는 유형을 사용하여 수행해야하는 작업은 특정 시나리오에만 적용되지만 확장 메소드의 통 합 설탕을 여전히 활용하고자합니다. – xr280xr

4

형식의 소스 코드를 소유하고있는 경우 왜 확장 방법을 사용하고 있습니까? 확장 메소드를 타입 자체의 멤버로 만들면 어떨까요?

확장 메서드는 만들지 않은 형식을 확장하는 데 가장 적합합니다. 유용한 도구이지만 첫 번째보다는 최후의 수단이되어야하는 간접적 인 계층입니다. 자신의 유형을 확장하는 데 사용할 수는 있지만 만들지 않은 유형에 대한 사용을 예약하는 것이 더 합리적입니다.

+0

음, 꽤 그가 DataGridView ;-)를 만들지 않았는지 확실합니다. –

+2

안녕하세요 앤드류. 이것에 대해 당신과 동의 할 수 없습니다. 어떤 경우에는 기존 클래스를 널리 사용하지 않고 추가 기능으로 꾸미는 것이 좋습니다. 파생 클래스를 만들거나 단순히 확장 메서드를 사용하거나 경우에 따라 확장 메서드를 사용하여 도출 할 수 있습니다. 유니티 (Unity), LINQ 자체를 가져와이 동작에 대해 다른 사람들에게 도움을 줄 수 있습니다. –