C#Casting vs. Parse

时间:2008-09-14 23:52:35

标签: c# datetime parsing string casting

以下哪项是c#中更好的代码?为什么?

((DateTime)g[0]["MyUntypedDateField"]).ToShortDateString()

DateTime.Parse(g[0]["MyUntypedDateField"].ToString()).ToShortDateString()

最终,投射或解析会更好吗?

6 个答案:

答案 0 :(得分:12)

如果g [0] [“MyUntypedDateField”]实际上是一个DateTime对象,那么转换是更好的选择。如果它不是真正的DateTime,那么你别无选择,只能使用Parse(如果你试图使用强制转换,你会得到一个InvalidCastException)

答案 1 :(得分:3)

投射是唯一的好答案。

你必须记住,ToString和Parse结果并不总是准确的 - 有些情况下,当你无法安全地在这两个函数之间往返时。

ToString的文档说,它使用当前的线程文化设置。 Parse的文档说,它也使用当前的线程文化设置(到目前为止一直很好 - 他们使用相同的文化),但有一个明确的评论:

  

格式化受当前DateTimeFormatInfo对象的属性的影响,默认情况下,该对象派生自“控制面板”中的“区域和语言选项”项。 Parse方法可能意外抛出FormatException的一个原因是当前DateTimeFormatInfo.DateSeparator和DateTimeFormatInfo.TimeSeparator属性设置为相同的值。

因此,根据用户设置,ToString / Parse代码可能会意外失败......

答案 2 :(得分:1)

您的代码建议该变量可以是日期,也可以是看起来像日期的字符串。日期你只需返回一个演员,但必须解析字符串。解析有两个警告;

  1. 如果您不确定是否可以解析此字符串,请使用DateTime.TryParse()

  2. 始终包含对要解析的文化的引用。 ToShortDateString()在不同的地方返回不同的输出。您几乎肯定想要使用相同的文化进行解析。我建议这个函数处理这两种情况;

    private DateTime ParseDateTime(object data)
    {
        if (data is DateTime)
        {
            // already a date-time.
            return (DateTime)data;
        }
        else if (data is string)
        {
            // it's a local-format string.
            string dateString = (string)data;
            DateTime parseResult;
            if (DateTime.TryParse(dateString, CultureInfo.CurrentCulture,
                                  DateTimeStyles.AssumeLocal, out parseResult))
            {
                return parseResult;
            }
            else
            {
                throw new ArgumentOutOfRangeException("data", 
                                   "could not parse this datetime:" + data);
            }
        }
        else
        {
            // it's neither a DateTime or a string; that's a problem.
            throw new ArgumentOutOfRangeException("data", 
                                  "could not understand data of this type");
        }
    }
    
  3. 然后像这样打电话;

    ParseDateTime(g[0]["MyUntypedDateField").ToShortDateString();
    

    请注意,错误数据会引发异常,因此您需要捕获该异常。

    也; 'as'运算符不适用于DateTime数据类型,因为这仅适用于引用类型,而DateTime是值类型。

答案 3 :(得分:0)

@Brian R. Bondy指出,这取决于 g [0] [“MyUntypedDateField”] 的实施。安全的做法是使用 DateTime.TryParse 作为运算符。

答案 4 :(得分:0)

Parse需要一个字符串用于输入,cast需要一个对象,所以在上面提供的第二个例子中,你需要执行两个演员:一个从一个对象到一个字符串,然后从一个字符串到一个DateTime。第一个没有。

但是,如果在执行强制转换时存在异常风险,那么您可能希望转到第二条路径,以便可以使用TryParse并避免抛出昂贵的异常。否则,转到最有效的路线,然后转换一次(从对象到DateTime)而不是两次(从对象到字符串再转换为DateTime)。

答案 5 :(得分:0)