在.NET Framework中,public static DateTime ToDateTime(DateTime value)的目的是什么?

24

我正在维护一个现有的项目,发现了这行代码:

Datetime someDate = ....;
var anotherDateTime = Convert.ToDateTime(someDate);

起初,我以为会通过隐式地调用ToString方法将someDate转换为字符串,但我错了。当我按下F12键查看该方法时,我发现它的定义在System.Convert类中,如下所示:

// 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);

首先,为什么.NET框架一开始就有这样一个方法,因为文档说这个方法什么也没做?
其次,在我重构代码时,如果我删除对这个方法的调用,是否能安全地不影响行为?


5
在早期的.NET版本中,实现晚期绑定很常见,在Linq、EF和dynamic让这项工作更加容易之前。例如,从数据库表行映射数据时,dbase提供程序可能会根据列类型提供DateTime。省略Convert方法将使这样的代码过于痛苦。 - Hans Passant
4个回答

35

之所以这样是因为Convert类旨在与实现IConvertible接口的类型一起使用。

该接口包含将实现类型转换为CLR类型,例如decimalbyteDateTime等的方法。这些类型中的每一个都实现了IConvertible接口。

因此,Convert.ToDateTime(DateTime d)不是唯一的什么也不做的方法。对于任何实现IConvertible接口的CLR类型,如Convert.ToChar(char c),都存在相应的方法。这只是因为所有这些类型都实现了IConvertible接口。

您可以在Convert类的源代码注释中了解更多信息。


12

是的,你可以把它删掉。它是完全多余的。至于为什么:我猜测有人认为避免人们意外调用Convert.ToDateTime(object)(这将是隐式的)是个好主意--这将涉及装箱、类型检查和拆箱。老实说,对我来说这似乎是一个愚蠢的理由,类似于“写坏代码,得到不良结果”的想法。


6

正如您在当前的BCL源代码中所看到的:

public static DateTime ToDateTime(DateTime value) {
        return value;
}

没有实际的转换,所以你可以安全地删除这些调用。


3
虽然我同意目前为止的答案,但我认为还有另一个方面需要考虑,那就是代码生成。在.NET早期,CodeDOM经常用于代码生成(有时仍然如此,例如WinForms Designer)。CodeDOM不会真正跟踪变量的类型,因为这种类型可能在生成代码时未知(例如,如果该类型也是生成的)。因此,更容易只生成对方法ToDate的引用,并让编译器确定要使用哪个重载。鉴于这些方法是非虚拟的,它们可以被内联,甚至没有性能损失。

话虽如此,我很确定WinForms Designer代码生成器不使用这种方法,至少不是在.NET 2.0中,那是我曾经使用过的最早版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接