C#Casting vs. Parse

C#Casting vs. Parse

问题描述:

这对某些人来说可能看起来很简陋,但是这个问题一直在唠叨我,当我编写一些代码时,我想我会问。C#Casting vs. Parse

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

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

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

归根结底,是能够更好地铸造或解析?谢谢大家!

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

+2

当对象不是DateTime时,请不要使用Parse,而要使用ParseExact并指定预期的日期和时间格式,以避免依赖于当前的用户区域设置。看到我对这个问题的回答。 – qbeuek 2008-09-15 06:22:19

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

+0

让我们避免编写防御性代码。当提供的值是不同的格式或类型时,开发人员应该知道期望的类型/格式和**失败**(例如抛出异常)。 TryParse应仅在用户提供的输入上使用**。 – qbeuek 2008-09-15 06:26:04

解析需要一个输入字符串,需要一个对象,因此在上面提供的第二个示例中,您需要执行两个强制转换:一个从对象转换为字符串,然后从字符串转换为DateTime。第一个没有。

但是,如果在执行演员时有发生异常的风险,那么您可能需要转到第二条路线,以便您可以TryParse并避免引发昂贵的异常。否则,转到最有效的路线,只投一次(从对象到DateTime)而不是两次(从对象到字符串到DateTime)。

铸造是只有很好的答案。

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

ToString的文档说,它使用当前的线程文化设置。解析的文件说,它也使用当前线程的文化设置(到目前为止好 - 他们使用的是同一种文化),但有一个明确的一句话,说:

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

所以根据用户设置的情况下,toString /解析代码,并会出现意外故障时...

你的代码表明,该变量可以是日期或看起来像一个日期的字符串。日期你可以简单地返回一个强制转换,但字符串必须解析。解析带来两个警告;

  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"); 
        } 
    } 
    

然后调用这样;

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

请注意,坏的数据会引发异常,所以您需要捕获该异常。

另外; 'as'操作符不适用于DateTime数据类型,因为它仅适用于引用类型,而DateTime是值类型。