문제

.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++;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top