.NET TypEcast 객체가 제네릭을 사용하여 수집에 사용될 때?
-
19-09-2019 - |
문제
.NET CLR이 컬렉션 선언에 언급 된 개체에 대한 개체를 타이핑합니까? 내가 선언하면 a
List<string> lststrs= new List<string>();
lststrs.add("ssdfsf");
.NET은 추가하고 검색하는 동안이 객체를 타이핑합니까 ?????
글쎄, 나는 질문 자체가 모든 사람이 명확하게 이해하지 못한다고 생각합니다. Java에는 제네릭이 있지만 코드를 디 컴파일하면 컴파일러가 수집 객체가 사용되는 모든 곳에 타입 캐스트를 배치합니다. 예 : 목록 ListOfStrings; ListOfstrings.add ( ""); 문자열 값 = listofstrings.get (1); 클래스 파일을 디 컴파일 한 후이 목록 ListOfStrings를 볼 수 있습니다. ListOfstrings.add ( ""); 문자열 값 = (문자열) listofstrings.get (1); 여기서 컴파일러는 String의 TypeCast를 입력했습니다.
이제 내 질문은 .NET에서 그것이 동일한 지 여부입니다.
해결책
이거 말하나요?
List<string> myList = new List<string>();
목록은 일반적인 유형입니다 - 아래와 같이 선언하면 계산 오류가 발생합니다.
List myList = new List(); //<-- big mama of a compilation error
어쨌든 - 일반 목록이므로 강하게 입력되므로 문자열이 아닌 것을 통과 할 수 없습니다 (그렇게하면 다시 - 다시 - 다시 - 빅마마 컴파일 오류).
다른 팁
아니, 귀하의 목록은 여기에 문자열에 강력하게 입력됩니다. 이것이 제네릭을 사용하는 것의 전체 이점입니다.
타입 캐스트 아니오가 아닙니다.
지정된 유형의 객체 만 제네릭 컬렉션에 추가 할 수있게하여 제네릭 포스 타입 안전합니다. 이것들은 컴파일러 경고입니다.
예를 들어, 정수와 같은 다른 객체를 추가하려고하면 컴파일러 경고가 나타납니다.
"목록"과 같은 것은 없습니다 :)
그러나 a List<string>
. 여기는 문자열 모음이므로 끈을 던지지 않습니다.
그래도 이것을 고려하십시오 :
List<object> objects = new List<object>();
objects.Add("Hello SO.com");
string myString = objects.First(); //Wont compile, as objects return an object.
//You need to cast it to a string (for example, by using the as operator).
아니요. 컬렉션이 입력되었으므로 필요하지 않습니다.
전혀 타입 캐스팅이 필요하지 않습니다. 제네릭을 사용한다는 사실은 목록을 자동으로 타이핑 할 수 있도록합니다.
아니요. Java와 달리 다이 CLR은 제네릭을 유형 삭제를 통해서가 아니라 자체적으로 다른 유형으로 구현합니다. 그래서, a List<string>
다른 유형입니다 List<int>
, 필요할 때 런타임에 동적으로 두 가지 유형이 모두 계약됩니다.
아니.
list.add의 구현을 참조하십시오.
private T[] _items;
public void Add(T item)
{
if (this._size == this._items.Length)
{
this.EnsureCapacity(this._size + 1);
}
this._items[this._size++] = item;
this._version++;
}