【问题标题】:What is the purpose of : public static DateTime ToDateTime(DateTime value) in the .NET Framework?.NET Framework 中的 public static DateTime ToDateTime(DateTime value) 的目的是什么?
【发布时间】:2018-10-17 09:35:08
【问题描述】:

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

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

一开始,我以为someDate会通过隐式调用ToString方法转换为字符串,但我错了。当我在方法上按 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框架首先有这样的方法,因为文档说这个方法什么都不做?
第二当我重构代码时,我可以安全地移除对该方法的调用而不影响行为吗?

【问题讨论】:

  • 在早期的 .NET 版本中常用来实现后期绑定,在 Linq、EF 和 dynamic 使这项工作变得更容易之前。例如,从 dbase 表行映射数据,dbase 提供程序可能会根据列类型提供 DateTime。省略 Convert 方法会使这样的代码太痛苦。

标签: c# .net datetime


【解决方案1】:

这是因为Convert 类旨在使用实现IConvertible 接口的类型。

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

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

您可以在Convert 类的源代码的comments 中阅读更多相关信息。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      正如您在current BCL sources 中看到的:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-02-13
          • 2015-02-07
          • 1970-01-01
          • 2011-01-24
          • 2010-11-08
          • 1970-01-01
          • 1970-01-01
          • 2015-07-22
          • 2010-11-13
          相关资源
          最近更新 更多