c# - now - datetime net core
¿Cuál es el propósito de: public static DateTime ToDateTime(DateTime value) en.NET Framework? (4)
Estoy manteniendo un proyecto existente y encontré esta línea de código:
Datetime someDate = ....;
var anotherDateTime = Convert.ToDateTime(someDate);
Al principio, esperaba que someDate
se convirtiera en una cadena llamando ToString
método ToString
, pero estaba equivocado. Cuando presioné F12 en el método, veo la definición de ese método en la clase System.Convert
, que es como la siguiente:
// Summary: Returns the specified System.DateTime object; no actual conversion is performed.
// Parameters:
// value: A date and time value.
// Returns:
// value is returned unchanged.
public static DateTime ToDateTime(DateTime value);
Primero ¿Por qué .NET Framework tiene un método como este en primer lugar, ya que la documentación dice que este método no hace nada?
Segundo Mientras estoy refactorizando el código, ¿puedo eliminar de manera segura la llamada para este método sin afectar el comportamiento?
Aunque estoy de acuerdo con las respuestas aquí hasta ahora, creo que también hay otro aspecto, que es la generación de código. En los primeros días de .NET, la generación de código se realizaba con frecuencia utilizando CodeDOM (y algunas veces todavía lo es, por ejemplo, con WinForms Designer). CodeDOM no realiza un seguimiento del tipo de variables, ya que es posible que este tipo no se conozca en el momento de la generación del código (por ejemplo, si también se genera el tipo). Por lo tanto, es mucho más fácil generar una referencia a un método ToDate
y hacer que el compilador determine cuál de las sobrecargas usar. Dado que estos métodos no son virtuales, pueden estar en línea y ni siquiera hay una penalización de rendimiento.
Dicho esto, estoy bastante seguro de que el generador de código de WinForms Designer no usa este método, al menos no en .NET 2.0, la versión más antigua con la que he trabajado.
Como se puede ver en las fuentes actuales de BCL :
public static DateTime ToDateTime(DateTime value) {
return value;
}
no hay conversión real, por lo que puede eliminar esas llamadas de forma segura.
Es porque la clase Convert
está pensada para trabajar con tipos que implementan la interfaz IConvertible
.
Esta interfaz contiene métodos para convertir un tipo de implementación en tipos CLR como decimal
, byte
, DateTime
, etc. Cada uno de esos tipos implementa IConvertible
sí mismos.
Por lo tanto, Convert.ToDateTime(DateTime d)
no es el único método que hace "nada". Existe también para cualquiera de esos tipos CLR que implementan IConvertible
, por ejemplo, Convert.ToChar(char c)
. Simplemente viene del hecho de que todos estos tipos implementan IConvertible
.
Puede leer más sobre esto en los comments del código fuente de la clase Convert
.
Sí, puedes eliminarlo. Es completamente redundante. En cuanto a por qué: supongo que alguien pensó que era una buena idea evitar que las personas Convert.ToDateTime(object)
accidentalmente a Convert.ToDateTime(object)
(que sería implícito), lo que implicaría un cuadro, una comprobación de tipo y unbox. Francamente eso me parece una razón tonta, en la línea de "escribir código incorrecto, obtener malos resultados".