2011-08-26 3 views

답변

11

List<object>에 삽입하면 상자에 넣습니다. List<int>에 삽입하면 상자에 넣지 않습니다 (이 유형은 int을 해당 유형으로 바꾸는 모든 값 유형에 해당됨). 마찬가지로 List<object>에서 값을 검색하는 경우에는 언 박싱이 발생하지만 List<int>의 경우에는 발생하지 않습니다.

List<T>은 강력하게 입력되어 있으므로 List<object>은 컴파일되지 않습니다. 따라서 컴파일 타임의 안전성이 떨어지고 런타임 오류가 발생할 수 있습니다.

+0

좋은 답변입니다. 복싱/언 박싱을 염두에 두십시오. – Xaisoft

4

List<object>을 사용하면 항목을 입력하지 않아도 모든 것을 캐스팅해야합니다. 게다가 위험한 이유는 목록에 무엇이든 넣을 수 있고 어떤 항목에 대해 정확히 무엇이 돌아 오는지 알 수 없기 때문입니다.

+0

대괄호를 수정 해 주셔서 감사합니다. 나는 그저 그렇게하려고했다. –

+0

"... item typing ..."을 사용하면 캐스트를 수행 할 때까지 속성이나 메서드에 액세스 할 수 없다는 것을 의미합니까? – Xaisoft

+0

컬렉션에 올바른 유형의 항목을 추가하는 것이 더한 컴파일 시간을 지원합니다. 가장 명백한 단점은 캐스팅없이 객체와 상호 작용할 수 없다는 것입니다. –

9

List<T>이 있으면 객체가 인스턴스화 된 후에 목록에 T 유형의 인스턴스 만 포함되고 List<object>에는 아무 것도 넣을 수 있습니다.

제네릭은 컴파일 타임에 강력한 유형의 재사용 가능한 코드를 작성하는 좋은 방법입니다.

+0

그래서 목록에 다른 유형이 포함될 수 있다면 객체를 사용하는 것이 더 낫습니까? – Xaisoft

+1

그런데 좋은 답. List와 대조적으로리스트 과 타입 안전에 대해 생각하지 않았습니다. Xaisoft

2

List는 제네릭 형식을 템플릿 인수로 사용합니다. 그래서, 당신은 진정으로 자동차의 목록을해야합니다 당신이 할 경우 :

List<car> list = new List<car>(); 

반면 :

List<object> objlist = new List<object>(); 

아무것도에 대한 참조를 보유 할 수 있습니다. 문제는 이러한 참조가 객체로 다운 캐스팅되고 올바른 객체로 다시 채울 때까지 멤버 및 함수를 사용할 수 없다는 것입니다. 당신이 objlist에서 자동차를 보유하는 경우 예를 들어, 당신은해야 할 것 :

list[0].GetMaker(); 

이것은 당신이 적어도이 가정

((car)objlist[0]).GetMaker(); 

당신이 할 수있는 자동차를 목록 GetMaker 기능 wehreas를 호출하려면 목록에서 하나의 car/obj.

+0

좋은 예. 내가 더 잘 이해할 수있게 도와 주었다. – Xaisoft

0

질문이 약간 혼란 스럽지만 jsmarble이 필요한 모든 유형을 원하는 방식으로 캐스팅해야한다는 점에서 주요 포인트 중 하나에 부딪혔다 고 생각합니다. 비효율적인데 특히 List<T>이 값을 입력하고 상자에 넣지 않아도 처리 할 수있는 값 유형이 있습니다.

또한 런타임 오류가 발생할 수있는 유형 안전을 희생합니다.

1

목록에서 T를 유형 제약 조건으로 간주 할 수 있습니다. 그래서 당신이 말하는 경우

class Vehicle {} 
class Car : Vehicle {} 
class Boat : Vehicle {} 
class SpeedBoat : Boat {} 
List<Boat> listOfBoats 

목록에는 보트의 타입과 그 자손이지만 다른 어떤 차량도 포함 할 수 없다. 당신이 그것을 객체로 설정했다면 List는 기본적으로 모든 참조 타입을 포함 할 수 있습니다.

예를 들어그 컬렉션의 모든 SpeedBoats를 사용하면 좋은 확장 방법 OfForm을 사용할 수 있습니다.

+0

리스트 는 나에게 Car and Boat를 사용할 수있게 할 것인가? SpeedBoat가 Vehicle에서 상속받은 Boat에서 상속 받았기 때문에 List 을 할 수 있을까요 아니면 OfType 확장을 사용해야합니까? – Xaisoft

+0

예 차량 목록에는 자동차, 보트, 스피드 보트, 차량의 자손이 포함될 수 있습니다. 목록 은 허용하지 않습니다. .Add (새 보트()). 채워진 목록 에서 목록 을 원한다면 List sbs = vehicles.OfType ()을 말할 수 있습니다. – edvaldig

관련 문제