comment obtenir la taille en octets de type dans la liste générique?
J'ai cette liste générique et je veux obtenir la taille en octets du type tel que si T est string ou int, etc., J'ai essayé les deux façons comme écrit dans getByteSize(), et juste pour vous informer que je suis en utilisant une seule voie, à une époque ...
mais lorsque j'essaie de compiler, il donne un message d'erreur indiquant "Erreur: le type ou Le nom d'espace de noms 'typeParameterType' n'a pas pu être trouvée (vous manque une directive using ou une référence d'assembly?)"
public class iList<T> : List<T>
{
public int getByteSize ()
{
//way 1
Type typeParameterType = typeof(T);
return sizeof(typeParameterType);
//way 2
Type typeParameterType = this.GetType().GetGenericArguments()[0];
return sizeof(typeParameterType);
}
}
Et l'idée de ce que je fais de mal ici?
OriginalL'auteur Safran Ali | 2011-08-31
Vous devez vous connecter pour publier un commentaire.
sizeof
est seulement de travailler sur des types de valeur.Pour une chaîne de caractères, vous ne connaissez pas le réelle taille en octets jusqu'à ce que vous le remplir.
Si vous êtes décidé à faire cela, sérialiser la liste et de mesurer ensuite. Tandis que pas une garantie, c'est probablement mieux que l'alternative.Scratch. Il ne sera pas vous obtenir ce que vous voulez sans réel effort. Vous pourriez exécuter une rapide et sale de compter de la sorte:Si vous voulez vraiment en savoir plus sur la taille, voici un réponse complète sur le sujet.
Vous avez raison, mais (je l'espère) il va sans dire que les incohérences de taille de Char ne sont qu'une petite partie des problèmes qui pourraient être rencontrés si cela a été utilisé pour envoyer des données à travers toute sorte de frontière.
OriginalL'auteur Paul Walls
sizeof
fonctionne uniquement pour les types non gérés, tels que construit dans les types (int
,float
,char
etc...).Pour les types référence, il retourne simplement la taille d'un pointeur (normalement 4 pour les systèmes 32 bit)Il ne fonctionne pas à tous les fins de référence et de types gérés (essayez et vous verrez).Aussi vous n'êtes pas en passant un type, vous êtes en lui passant un objet de type
Type
.Vous pouvez essayer en utilisant
Maréchal.SizeOf
au lieu de cela, cependant, je ne suis pas sûr que cela va vous donner ce que vous voulez, pour commencer, cela ne sera de retour de la taille de la nature après qu'il a été formé, n'est pas la taille allouée par le CLR. En corollaire, cela permettra également de travailler uniquement avec les types qui peuvent être mobilisées, dont les listes ne peuvent pas.Qu'est-ce exactement que vous essayez de faire?
L'utilisation de la mémoire en C# est toujours difficile à estimer. Seuls les types intégrés et certaines structures (types Enum, Pointeur de types définis par l'Utilisateur et les structures qui ne contiennent pas tous les champs ou propriétés qui sont des types référence) peut être
sizeof
de la fed. D'autres objets sont "opaques".OriginalL'auteur Justin
Vous pouvez utiliser
Marshal.SizeOf(typeof(T))
mais être conscient qu'il peut lancer des types avec une inconnue de taille. Sachez queMarshal.SizeoOf(typeof(char)) == 1
.OriginalL'auteur xanatos