下列哪些是更好的代码在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/分析代码可以和将会意外地失败...

你的代码表明,该变量可以是任何一个日期或一串,看起来像一个日期。有空你可以简单地返回机智的投,但是串必须进行分析。分析附带了两个需要注意的事项;

  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();

注意到,错误的数据引发的一个例外,所以你想抓住那个。

也;本'作为'操作者不能工作的日期时间的数据类型,因为这只适用于参照类型和日期时间是一个值的类型。

作为@Brian R.邦迪指出它取决于执行情况 g[0]["MyUntypedDateField"].安全的做法是使用 DateTime。TryParse作为 操作员。

分析需要一串,用于输入、铸造要求的一个目的,因此在第二例中,你提供以上,那么你就需要执行两个投下:一个从一个对象一串,然后从一个字符串一日期时间。第一不。

然而,如果有一个风险是例外的,当你执行铸塑,然后你可能要走第二条路线所以你可以TryParse和避免昂贵的例外被抛出。否则,最有效的路线,并且只要投一次(从对象的日期时间),而不是两倍(从对象串DateTime).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top