题
下列哪些是更好的代码在c#为什么?
((DateTime)g[0]["MyUntypedDateField"]).ToShortDateString()
或
DateTime.Parse(g[0]["MyUntypedDateField"].ToString()).ToShortDateString()
最终,它是更好地铸造或分析?
解决方案
如果g[0]["MyUntypedDateField"]是一个真正的DateTime目,然后演员是更好的选择。如果这不是真的日期时间,那么你没有选择,只能使用的分析(你会得到一个InvalidCastException如果你试图使用铸)
其他提示
铸造的 只 很好的答案。
你必须记住,ToString和分析结果并不总是准确的-在有些情况下,当你无法安全地往返之间这两个职能。
该文件的ToString说,它使用当前的线文化设置。文件的分析说,它也使用当前的线设置文化(到目前为止好-他们使用相同的文化),但有一个明确的话,即:
格式化影响的性质的当前DateTimeFormatInfo对象,其中通过默认来自该区域和语言的选择项目在控制面板。 原因之一的分析方法可能会意外地扔FormatException是,如果目前的DateTimeFormatInfo.DateSeparator和DateTimeFormatInfo.TimeSeparator性设定为相同的价值。
因此,根据用户的设置,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();
注意到,错误的数据引发的一个例外,所以你想抓住那个。
也;本'作为'操作者不能工作的日期时间的数据类型,因为这只适用于参照类型和日期时间是一个值的类型。
作为@Brian R.邦迪指出它取决于执行情况 g[0]["MyUntypedDateField"].安全的做法是使用 DateTime。TryParse 和 作为 操作员。
分析需要一串,用于输入、铸造要求的一个目的,因此在第二例中,你提供以上,那么你就需要执行两个投下:一个从一个对象一串,然后从一个字符串一日期时间。第一不。
然而,如果有一个风险是例外的,当你执行铸塑,然后你可能要走第二条路线所以你可以TryParse和避免昂贵的例外被抛出。否则,最有效的路线,并且只要投一次(从对象的日期时间),而不是两倍(从对象串DateTime).