Je maintiens un projet existant et j'ai trouvé cette ligne de code:
Datetime someDate = ....;
var anotherDateTime = Convert.ToDateTime(someDate);
Au début, je m'attendais à ce que someDate
soit converti en chaîne en appelant implicitement la méthode ToString
, mais je me trompais. En appuyant sur F12 sur la méthode, je vois la définition de cette méthode dans le System.Convert
class, qui ressemble à ceci:
// 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);
First Pourquoi le framework .NET a-t-il une méthode comme celle-ci en premier lieu, car la documentation dit que cette méthode ne fait rien?
Second Pendant que je refactorise le code, puis-je supprimer en toute sécurité l'appel pour cette méthode sans affecter le comportement?
C'est parce que la classe Convert
est destinée à fonctionner avec des types qui implémentent l'interface IConvertible
.
Cette interface contient des méthodes pour convertir un type d'implémentation en types CLR comme decimal
, byte
, DateTime
etc. Chacun de ces types implémente IConvertible
eux-mêmes.
Ainsi, Convert.ToDateTime(DateTime d)
n'est pas la seule méthode qui ne fait "rien". Il existe également pour tous ces types de CLR implémentant IConvertible
, par exemple Convert.ToChar(char c)
. Cela vient du fait que tous ces types implémentent IConvertible
.
Vous pouvez en savoir plus à ce sujet dans le commentaires du code source de la classe Convert
.
Oui, vous pouvez le supprimer. C'est complètement redondant. Quant à savoir pourquoi: je devinez quelqu'un a pensé que c'était une bonne idée d'éviter que les gens appellent accidentellement Convert.ToDateTime(object)
(ce qui serait implicite) - ce qui impliquerait une case, une vérification de type et une boîte . Franchement, cela me semble une raison idiote, dans le sens de "écrire du mauvais code, obtenir de mauvais résultats".
Comme vous pouvez le voir dans les sources BCL actuelles :
public static DateTime ToDateTime(DateTime value) {
return value;
}
il n'y a pas de conversion réelle, vous pouvez donc supprimer ces appels en toute sécurité.
Bien que je sois d'accord avec les réponses ici jusqu'à présent, je suppose qu'il y a aussi un autre aspect, la génération de code. Dans les premiers jours de .NET, la génération de code était très souvent effectuée à l'aide de CodeDOM (et l'est parfois toujours, par exemple avec WinForms Designer). CodeDOM ne suit pas vraiment le type de variables car ce type peut ne pas être connu au moment de la génération du code (par exemple si le type est également généré). Par conséquent, il est beaucoup plus facile de simplement générer une référence à une méthode ToDate
et de demander au compilateur de déterminer laquelle des surcharges utiliser. Étant donné que ces méthodes ne sont pas virtuelles, elles peuvent être intégrées et il n'y a même pas de pénalité de performance.
Cela dit, je suis sûr que le générateur de code de WinForms Designer n'utilise pas cette méthode, du moins pas dans .NET 2.0, la première version avec laquelle j'ai travaillé.