2011-07-24 33 views

Respuesta

7

Debido a que el CLR sólo puede determinar el tamaño en tiempo de ejecución ... una de las razones de esto es el "relleno" (depende de la plataforma) ...

Para todos los demás tipos, incluyendo estructuras, el sizeof el operador puede ser usado solo en bloques de códigos inseguros. Aunque puede utilizar el método Marshal.SizeOf, el valor devuelto por este método no siempre es , igual que el valor devuelto por sizeof. Marshal.SizeOf devuelve el tamaño después de que el tipo se haya calculado, mientras que sizeof devuelve tamaño , ya que ha sido asignado por Common Language Runtime, incluyendo cualquier relleno.

Ref.

ver también How do I check the number of bytes consumed by a structure?

+1

Presupuesto adicional de msdn ... –

+0

Gracias :-) Se ha agregado una segunda referencia – Yahia

+0

Esto también implica que 'sizeof (DateTime)' funcionará correctamente en el contexto 'inseguro' (ver mi nueva respuesta). –

1

El texto completo del error que se obtiene, es:

error CS0233: 'System.DateTime' no tiene un tamaño predefinido, por lo tanto, sizeof sólo se puede utilizar en una contexto inseguro (considere el uso de System.Runtime.InteropServices.Marshal.SizeOf)

Así que si usted hace uso de unsafe contexto (asegúrese de ir a "Pr el proyecto de C# de operties", el 'Build' pestaña, y establecer una marca de verificación en 'Permitir código no seguro' para hacer la compilación más adelante) que trabaja muy bien:

static void Main() 
    { 
     int s; 
     unsafe 
     { 
      s = sizeof(DateTime); 
     } 
     Console.WriteLine(s); // writes 8 
    } 

Con la palabra clave unsafe, sizeof() trabajará con todos los enum tipos y con todos los tipos struct que no tienen campos de instancia de tipo de referencia (y DateTime es una estructura sin miembros de tipo de referencia, seguro).

Sin la palabra clave unsafe, no puede usar sizeof. (Sin embargo, puesto que C# 2 se le permite usarlo en los tipos predefinidos como int y en enum tipos, pero no en otras estructuras como DateTime, como viste.)


Tenga en cuenta que la DateTime estructura es excepcional en que Marshal.SizeOf<DateTime>() (o Marshal.SizeOf(typeof(DateTime)) antes de .NET versión 4.5.1 (2013)) lanzará una excepción. Esto se debe al diseño de estructura inusual (para un struct) "Auto".

0

Alex Pinsker escribió nice solution para obtener el tamaño de DateTime (o de cualquier otro tipo).

Cuestiones relacionadas