Dado que DateTime es una estructura con miembros que parecen desglosarse en valores matemáticos simples, no estoy seguro de por qué al usar sizeof() aparece el mensaje en el título de la pregunta..NET DateTime no tiene un tamaño predefinido
Respuesta
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?
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".
Alex Pinsker escribió nice solution para obtener el tamaño de DateTime
(o de cualquier otro tipo).
- 1. Cómo abrir JFileChooser con tamaño predefinido
- 2. ¿Qué predefinido #if tiene symbos C#?
- 3. Matlab figura de ahorro con tamaño predefinido
- 4. Tamaño de propiedad tiene un tamaño no válido de 0
- 5. Cómo obtener el tamaño de papel predefinido por PaperKind
- 6. ¿.NET tiene un enlazador?
- 7. .NET DateTime to String
- 8. ¿Por qué no hay IDateTimeProvider en .NET y DateTime tiene ahora getter?
- 9. .Net DateTime fiscal Quarter
- 10. Parse CIM_DateTime to .Net DateTime
- 11. .NET DateTime a SqlDateTime Conversión
- 12. ¿Cómo crear una matriz vacía en PHP con un tamaño predefinido?
- 13. ¿Por qué .NET no tiene un enumerador bidireccional?
- 14. ¿Cómo puedo convertir un .Net Datetime en un T-SQL Datetime
- 15. .NET DateTime no devuelve AM/PM en ToShortTimeString()
- 16. ¿Por qué la clase python datetime tiene un método 'fromtimestamp', pero no un método 'totimestamp'? clase
- 17. ¿Cómo convierto de un .NET DateTime a un datetime de IronPython?
- 18. Averigüe el tamaño de un objeto .net
- 19. MOSS 2007: SPListItem.GetFormattedValue para los campos DateTime tiene un error?
- 20. Ado.net - la propiedad Tamaño tiene un tamaño no válido de 0
- 21. ¿.NET MVC tiene un RedirectToAction fuertemente tipado?
- 22. Convertir JavaScript Fecha de .NET DateTime
- 23. .Net webApi ISO datetime e IE8
- 24. ¿Tiene sentido un sistema .net/sap mixto?
- 25. Cómo truncar milisegundos fuera de .NET DateTime
- 26. Convertir .NET Ticks a SQL Server DateTime
- 27. DateTime a unixtime sello en .net
- 28. Cómo crear un .NET DateTime desde el formato ISO 8601
- 29. ¿Por cuánto tiempo funciona un .NET DateTime/TimeSpan?
- 30. .NET Tamaño del objeto
Presupuesto adicional de msdn ... –
Gracias :-) Se ha agregado una segunda referencia – Yahia
Esto también implica que 'sizeof (DateTime)' funcionará correctamente en el contexto 'inseguro' (ver mi nueva respuesta). –