以下哪项是c#中更好的代码?为什么?
((DateTime)g[0]["MyUntypedDateField"]).ToShortDateString()
或
DateTime.Parse(g[0]["MyUntypedDateField"].ToString()).ToShortDateString()
最终,投射或解析会更好吗?
答案 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)
您的代码建议该变量可以是日期,也可以是看起来像日期的字符串。日期你只需返回一个演员,但必须解析字符串。解析有两个警告;
如果您不确定是否可以解析此字符串,请使用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是值类型。
答案 3 :(得分:0)
@Brian R. Bondy指出,这取决于 g [0] [“MyUntypedDateField”] 的实施。安全的做法是使用 DateTime.TryParse 和作为运算符。
答案 4 :(得分:0)
Parse需要一个字符串用于输入,cast需要一个对象,所以在上面提供的第二个例子中,你需要执行两个演员:一个从一个对象到一个字符串,然后从一个字符串到一个DateTime。第一个没有。
但是,如果在执行强制转换时存在异常风险,那么您可能希望转到第二条路径,以便可以使用TryParse并避免抛出昂贵的异常。否则,转到最有效的路线,然后转换一次(从对象到DateTime)而不是两次(从对象到字符串再转换为DateTime)。
答案 5 :(得分:0)