¿Por qué DateTime
es una estructura en lugar de una clase heredable?¿Por qué DateTime es una estructura en .Net?
(I le gustaría ser capaz de reemplazar el método ToString(), pero no puedo.)
¿Por qué DateTime
es una estructura en lugar de una clase heredable?¿Por qué DateTime es una estructura en .Net?
(I le gustaría ser capaz de reemplazar el método ToString(), pero no puedo.)
Probablemente porque se vio como una estructura de datos pequeña, simple e inmutable, como un entero o decimal. Hacerlo una estructura en estas condiciones hace que usar DateTime sea muy eficiente. Si se hubiera convertido en una clase, este beneficio de eficiencia se habría perdido porque eso requeriría asignaciones de memoria cada vez que creas un nuevo DateTime.
Además, ¿cuántas formas variantes de DateTime se te pueden ocurrir? (Ignorando las implementaciones de ToString alternativas que tiene en mente). No es exactamente un tipo que invite al polimorfismo.
Tenga en cuenta que para utilizar una estrategia de formato diferente para sus DateTimes, como creo que desea, será mejor que mire una forma diferente de formatear que simplemente usar ToString. Si observa la interfaz ICustomFormatter en MSDN, verá cómo puede conectarse a String.Formato de tubería para anular el formateo sin necesidad de subconjunto de un tipo existente.
Debido a que es un solo punto. No tiene múltiples piezas de datos. Debajo del capó está representado por un largo.
Si desea obtener más información sobre las clases de sistema y las estructuras, descargue el reflector .NET gratuito (http://www.red-gate.com/products/reflector/).
De todos modos, si desea sobrescribir cómo se formatea DateTime, proporcione su propio IFormatProvider. Utilice .NET Reflector para averiguar cómo se implementa DateTimeFormatInfo y luego implemente el suyo propio.
Puede utilizar métodos de extensión para esto: extensión declaran:
public static class DateTimeExtensions
{
public static string ToStringFormatted(this DateTime date)
{
return date.ToString("{d}");
}
}
Uso extensión:
using DateTimeExtensions;
...
var d = new DateTime();
System.Diagnostics.Debug.WriteLine(d.ToStringFormatted());
De esta manera puede sencillo implementar su propio método utilizado en los thats DateTime. De esta forma, puede usarse fácilmente en cualquier lugar dentro de su solución. Lo único que tienes que hacer es usar el espacio de nombres.
Sí, pero no lo nombre "ToString2". :) –
Claro, es solo un ejemplo ...;) –
sólo porque es una estructura (o incluso si se tratara de una clase cerrada), eso no quiere decir que es el final del camino. Puede resolver este problema con composition, en lugar de herencia. He aquí un ejemplo de 'objetivar' la clase DateTime:
public class MyDateTime
{
DateTime? value;
public MyDateTime()
{
this.Value = DateTime.Now;
}
public MyDateTime(DateTime? dateTime)
{
this.Value = dateTime;
}
public override String ToString()
{
if (this.Value != null)
{
return this.Value.Value.Month.ToString() + " my favorite time of the year";
}
return null;
}
public System.DateTime? Value
{
get { return this.value; }
set { this.value = value; }
}
}
DateTime tiene un tamaño pequeño. Por lo tanto, no es eficiente asignar memoria en el montón para esto.
Es lógico hacer una copia en la asignación, sin crear una referencia al mismo objeto, especialmente porque es inmutable. Lo mismo es cierto para el funcionamiento en él (Add
, Substract
etc.)
Tenía que ser convertible a la estructura COM correspondiente.
Si desea un formateo personalizado, puede implementarlo como se muestra en here.
Creo que es una estructura porque las estructuras son tipos de valores y las clases son tipos de referencia. Los datos reales en un DateTime son un único entero largo. Si fuera una clase, cada vez que creara un nuevo objeto, se asignarían 8 bytes en el montón y se asignarían otros 8 en la pila para el puntero. Por lo tanto, al convertir un DateTime en una estructura, reduce los requisitos de memoria a la mitad.
Puede encontrar más información en this question.
Quizás más preocupación por el rendimiento – Timeless
por qué el downvotes? Respondí su pregunta original. –
No voté, pero a partir de su respuesta, sigan que las estructuras siempre contienen un único "dato" y esta es la única razón por la que DateTime es la estructura. No dijiste nada sobre la diferencia de rendimiento entre estructuras y clases, que, creo, debería incluirse en la respuesta a la pregunta. – Kamarey