Est-ce que .NET TYPECAST Lorsqu'un objet est utilisé dans la collection à l'aide de génériques?

StackOverflow https://stackoverflow.com/questions/1914121

Question

.NET CLR TYPECAST Les objets à ceux mentionnés dans la déclaration de collecte? Si je déclare un

List<string> lststrs= new List<string>();
lststrs.add("ssdfsf");

.NET est-ce que .NET fait cet objet tout en ajoutant et en réévaluant ?????

Eh bien, je pense que la question elle-même n'était pas clairement comprise par tout le monde. En Java, il y a des génériques, mais si vous décompilez le code, vous remarquerez que le compilateur place un typaste partout dans le monde l'objet de collection est utilisé. Pour Ex: Liste ListofStrings; listofStrings.add (""); String value = listofStrings.get (1); Après avoir décompilé le fichier de classe, nous voyons cette liste ListofStrings; listofStrings.add (""); String Value = (String) listofStrings.get (1); Ici, le compilateur a palé le typast pour la chaîne.

Maintenant, ma question est de savoir si c'est le même dans .net ??

Était-ce utile?

La solution

Est-ce que tu veut dire ça?

List<string> myList = new List<string>();

La liste est un type générique - si vous déclarez comme ci-dessous, vous obtiendrez une erreur de compliance:

List myList = new List(); //<-- big mama of a compilation error

Quoi qu'il en soit - comme c'est une liste générique, elle est fortement tapée, vous ne pourrez donc pas transmettre quoi que ce soit qui n'est pas une chaîne (si vous le faites, cela en résultera - encore - dans un grosse mama d'une erreur de compilation).

Autres conseils

Non, votre liste est fortement tapée aux chaînes ici. C'est l'ensemble de l'utilisation des génériques.

Il ne fait pas de type non.

Les génériques forcent le type Saftey en permettant uniquement aux objets du type spécifié à ajouter dans la collection générique. Ce sont des avertissements du compilateur.

Dans votre exemple, si vous essayiez d'ajouter un autre objet, comme un entier, vous obtiendrez un avertissement de compilateur.

Il n'y a pas de "liste" :)

Cependant, il y a un List<string>. Ici, il ne lancera pas votre chaîne, car c'est une collection de cordes.

Considérez ceci, cependant:

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).

Non. Il n'en a pas besoin, car la collection est tapée.

Aucune dactylographie n'est nécessaire du tout. Le fait d'utiliser des génériques fait que votre liste est fortement tapée automatiquement.

Non, ce n'est pas le cas. Contrairement à Java, Die CLR implémente les génériques en tant que types différents, et non via l'effacement de type. Donc, un List<string> est un type différent de List<int>, et les deux types sont comprimés dynamiquement au moment de l'exécution en cas de besoin.

NON.

Voir l'implémentation de 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++;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top