Tout d'abord, un petit avertissement avant de le libellé de la question:
Je sais qu'il y a beaucoup de choses de fermé/dupliquer des questions quant à la différence entre le
sizeof
de l'opérateur et de l'Marshal.SizeOf<T>
méthode, et je ne comprends la différence entre les deux. Ici je parle de l'SizeOf<T>
méthode dans le nouveauUnsafe
classe
Donc, je ne suis pas sûr de comprendre la différence réelle entre ces deux opérations, et si il y a une différence donnée lors de l'utilisation de la méthode sur une struct/classe en particulier.
L' sizeof
- opérateur prend un nom de Type et retourne le nombre de géré octets qu'il est censé prendre lors de alloués (ie. un Int32
sera de retour le 4, par exemple).
L' Unsafe.SizeOf<T>
méthode sur l'autre main, est mis en œuvre dans IL comme toutes les autres méthodes dans l' Unsafe
classe, et en regardant le code, voici ce que ça donne:
.method public hidebysig static int32 SizeOf<T>() cil managed aggressiveinlining
{
.custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = ( 01 00 00 00 )
.maxstack 1
sizeof !!T
ret
}
Maintenant, si je ne me trompe pas, le code est juste appelant sizeof !!T
qui est le même que sizeof(T)
(l'appel de la sizeof
de l'opérateur avec le nom du type T
), donc ne pas les deux d'entre eux exactement l'équivalent?
Aussi, je vois de la méthode est également l'allocation d'un objet inutile (l' NonVersionableAttribute
) dans la première ligne, afin de ne pas causer une petite quantité de mémoire pouvant être allouées sur la pile ainsi?
Ma question est:
Est-il sûr de dire que les deux méthodes sont parfaitement équivalents et que, par conséquent, il est juste préférable d'utiliser le classique
sizeof
- opérateur, comme aussi d'éviter l'affectation de l'attribut dans l'SizeOf<T>
méthode? Était-ceSizeOf<T>
ajout de la méthode à l'Unsafe
classe juste pour la commodité à ce point?