2010-03-05 2 views

답변

12

예. CollectionBase는 이전 시도 였고 유형 안전을 제공하는 방법이었습니다. 컬렉션에 대한 모든 액세스에

  1. 제네릭으로, 더 이상 권투와 언 박싱이 없다 :

    제네릭이 개 더 거대한 이점을 당신에게 이러한 장점을 제공하지만, 추가 할 수 있습니다. 이것은 거대한 perf를 제공합니다. 이점.

  2. 제네릭을 사용하면 모든 유형에 대해 단일 구현을 사용할 수 있습니다. CollectionBase에서는 각 유형마다 커스텀 구현이 필요했기 때문에 많은 양의 중복 코드가 발생했습니다 (예 : 버그 가능성).

편집 : 일반적인 컬렉션을 사용하여 코드를 이동하는 다른 특별한 이유 몇 가지 생각

: 직접에서 객체에 LINQ를 사용 할 수 있도록 일반적인 컬렉션을 사용

  1. 당신의 콜렉션을 호출하지 않고 Cast<T> (CollectionBase는 IEnumerable<T>, IEnumerable 만 구현)을 호출하지 않아도됩니다.
  2. 새로운 코드와 일관성을 유지하십시오. 항상 새로운 제네릭 컬렉션을 사용하여 수행해야합니다.
2

유형별로 많은 코드를 작성하지 않고도 안전성을 확보 할 수 있습니다. MSDN CollectionBase documentation의 예제를 보면 Int16의 typesafe 컬렉션을 만들기 위해 많은 보일러 - 플레이트 코드를 작성해야합니다. 제네릭으로는 다소 짧은입니다 :

var myListofInt16 = new List<Int16>(); 

당신이 작성하지 않은 코드의 모든 비트는 (나는 그것이 나에게 적용되기 때문에, 나는 그것을 확신한다는 말을 오해하지 않습니다 코드 다른 사람들에게도 적용됩니다! ;-)

1

CollectionBase를 사용하면 generics가 기본적으로하는 기능을 제공하도록 확장해야합니다. 당신은 당신이 그것을 만드는 하위 클래스에서 타입 안전을 설명하기 위해 모든 배관 공사에 글을 써야합니다. 제네릭을 사용하면 필요가 없습니다. 제네릭으로 변환해야합니까? 그것은 당신의 상황에 달려 있지만 앞으로는 사용하지 않을 것입니다.

더하기 컬렉션베이스 대신 제네릭을 사용하면 일반적인 작업을 쉽게하기 위해 .net에 작성된 모든 확장 방법을 사용할 수 있습니다. MS는 제네릭의 사용을 추진하고 있으며 적극적으로 채택을 추진하고있다. 그들은 그 기능을 계속 개발할 것입니다.

+0

아마도 당신이 말하는 확장 메서드로 LINQ를 호출해야합니다. 사람들은 기술적 인 설명보다는 마케팅 방식에 더 많은 반응을 보입니다. :) – Tanzelax

4

다른 모든 종류의 콜렉션에 대한 액세스가 강력하게 입력 된 경우에만 <type>을 입력하면됩니까?

편집 : 기존 코드와 작동 코드를 제거하는 경우 다른 곳에서 언급 한 것처럼 성능 향상을위한 유일한 이유가 있습니다.

+2

** 이것이 제네릭을 ** 사용하는 좋은 이유라고 완전히 동의하지만, OP가 CollectionBase를 기반으로 기존의 작동중인 코드를 다시 작성해야하는 이유는 설명하지 않습니다. "왜"코드가 ** 대체 **되어야하는지에 대한 논쟁은 여기에 없으며 구현 만됩니다. 제네릭으로 전환하는 것이 더 많은 작업 (앞에서) 일 것이므로 입력이 적다는 것은 반드시 사실 일 필요는 없다는 것을 말합니다. –

+0

예, 바꾸십시오. 이제 프로젝트를 진행할 것입니다 ...하지만 이유는 모르겠습니다. 나는 많은 것을 본다. '너는해야 해!' 그래서 나는 그것을하고 있어요 ... – Dilbert789

+2

@ dilbert789, "이유"에 대해, 저는 제 대답의 일부로 서 있습니다. 작성할 필요가없는 모든 코드 줄은 잘못 입력 할 수없는 코드 줄입니다 ... :) – Rob

0

권투를 피하기 위해 제네릭을 사용하고 싶습니다.

제네릭의 이점을 나열한 좋은 article입니다.

0

또 다른 이유가 있습니다.

LINQ.

IEnumerable<T>을 구현하는 컬렉션에서만 LINQ 메서드를 사용할 수 있습니다.
CollectionBase에서 LINQ를 사용하려면 먼저 Cast<T>으로 전화하거나 IEnumerable<T>을 수동으로 구현해야합니다.
ObjectModel.Collection<T>에서 상속하면 IEnumerable<T> 구현이 무료입니다.

+0

@SLaks : 사실, @Kevin은 그것을 언급했지만 이름을 밝히지 않았습니다. "또한 컬렉션베이스 대신 제네릭을 사용하면 .net에 작성된 모든 확장 메서드를 사용할 수 있습니다." – Tanzelax

관련 문제