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)
As @Brian R. Bondy指出它取决于执行g [ 0] [“MyUntypedDateField”]。安全的做法是使用DateTime.TryParse和作为运算符。
让我们避免编写防御性代码。当提供的值是不同的格式或类型时,开发人员应该知道期望的类型/格式和**失败**(例如抛出异常)。 TryParse应仅在用户提供的输入上使用**。 – qbeuek 2008-09-15 06:26:04
解析需要一个输入字符串,需要一个对象,因此在上面提供的第二个示例中,您需要执行两个强制转换:一个从对象转换为字符串,然后从字符串转换为DateTime。第一个没有。
但是,如果在执行演员时有发生异常的风险,那么您可能需要转到第二条路线,以便您可以TryParse并避免引发昂贵的异常。否则,转到最有效的路线,只投一次(从对象到DateTime)而不是两次(从对象到字符串到DateTime)。
铸造是只有很好的答案。
您必须记住,ToString和Parse结果并不总是准确的 - 有些情况下,您无法安全地在这两个函数之间往返。
ToString的文档说,它使用当前的线程文化设置。解析的文件说,它也使用当前线程的文化设置(到目前为止好 - 他们使用的是同一种文化),但有一个明确的一句话,说:
格式是由当前的性能影响DateTimeFormatInfo对象,默认情况下它是从“控制面板”中的“区域和语言选项”项派生的。 如果当前的DateTimeFormatInfo.DateSeparator和DateTimeFormatInfo.TimeSeparator属性设置为相同的值,则Parse方法可能会意外抛出FormatException的一个原因是。
所以根据用户设置的情况下,toString /解析代码,并会出现意外故障时...
你的代码表明,该变量可以是日期或看起来像一个日期的字符串。日期你可以简单地返回一个强制转换,但字符串必须解析。解析带来两个警告;
,如果你不能确定这个字符串可以解析,然后使用
DateTime.TryParse()
。-
始终包含对您要解析的文化的引用。
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是值类型。
当对象不是DateTime时,请不要使用Parse,而要使用ParseExact并指定预期的日期和时间格式,以避免依赖于当前的用户区域设置。看到我对这个问题的回答。 – qbeuek 2008-09-15 06:22:19