Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET Framework中:公共静态DateTime ToDateTime(DateTime值)的用途是什么?_C#_.net_Datetime - Fatal编程技术网

C# 在.NET Framework中:公共静态DateTime ToDateTime(DateTime值)的用途是什么?

C# 在.NET Framework中:公共静态DateTime ToDateTime(DateTime值)的用途是什么?,c#,.net,datetime,C#,.net,Datetime,我正在维护一个现有项目,我发现这行代码: Datetime someDate = ....; var anotherDateTime = Convert.ToDateTime(someDate); 起初,我希望通过隐式调用ToString方法将someDate转换为字符串,但我错了。在方法上按F12键时,我在System.Convert类中看到了该方法的定义,如下所示: // Summary: Returns the specified System.DateTime object; no a

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

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 framework首先有这样一个方法,因为文档中说这个方法什么都不做

第二当我重构代码时,我是否可以安全地删除对该方法的调用而不影响行为?

是的,您可以删除它。这是完全多余的。至于原因:我想有人认为避免人们意外调用
Convert.ToDateTime(object)
(这是隐式的)-这将涉及到一个框、类型检查和取消框。坦白地说,这对我来说似乎是一个愚蠢的理由,就像“写糟糕的代码,得到糟糕的结果”一样


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

这是因为
Convert
类旨在与实现接口的类型一起工作

此接口包含将实现类型转换为CLR类型的方法,如
decimal
byte
DateTime
等。这些类型各自实现
IConvertible

因此,
Convert.ToDateTime(DateTime d)
不是唯一一个“不做任何事情”的方法。它也适用于实现
IConvertible
的任何CLR类型,例如
Convert.ToChar(char c)
。这只是因为所有这些类型都实现了
IConvertible


您可以在
Convert
类的源代码部分了解更多信息。

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


也就是说,我很确定WinForms Designer代码生成器没有使用这种方法,至少在.NET 2.0中没有,这是我使用过的最早版本。

在早期.NET版本中很常见,以实现后期绑定,而在Linq、EF和dynamic使这项工作更容易之前。从数据库表行映射数据例如,数据库提供程序可能会根据列类型提供日期时间。省略Convert方法会使这样的代码太痛苦。
public static DateTime ToDateTime(DateTime value) {
        return value;
}