将对象存储在字符串中时,我可以确保将其转换回成功执行它是否依赖于其他东西?
DateTime dt = DateTime.UtcNow;
string pattern = dt.ToString();
DateTime retDt = DateTime.Parse(pattern);
这个问题询问以下对象类型:
- 时间跨度
- 约会时间
- 整数
- 长
- 漂浮
- 双倍的
我试过阅读几个论坛,并没有看到相互矛盾的例子。我的代码也没有任何异常,但我确信我没有尝试所有可能的输入/场景。
将对象存储在字符串中时,我可以确保将其转换回成功执行它是否依赖于其他东西?
DateTime dt = DateTime.UtcNow;
string pattern = dt.ToString();
DateTime retDt = DateTime.Parse(pattern);
这个问题询问以下对象类型:
我试过阅读几个论坛,并没有看到相互矛盾的例子。我的代码也没有任何异常,但我确信我没有尝试所有可能的输入/场景。
使用时,ToString
您可以指定数字和时间的格式(有关更多信息,请参阅本主题)。
在许多这些情况下,您希望使用的格式是往返格式(“R”表示 Single、Double 和 BigInteger 类型,“O”表示 DateTime。)这种格式确保所有信息都传递给字符串,并且可以被解析回完全相同的数据。
传递IFormatProvider
toToString
对于避免语言环境问题也很重要(例如,不同的语言环境可以使用不同的字符作为小数分隔符。)使用静态CultureInfo.InvariantCulture
解决了这个问题。
最后,如果您尝试保存数据然后检索它,您可能需要考虑使用序列化程序,它接收整个类并将它们写入各种格式。.NET 有几个序列化程序,其中最突出的两个是BinaryFormatter
(二进制)和DataContractSerializer
(XML)。
Parse 和 ToString 是否能够转换为您选择的类型取决于它们的实现。默认情况下,转换将无需任何更改即可工作。
请注意 DateTime,因为您可能希望指定使用 ToString 输出时区信息,以便您的解析将使用正确的时区信息创建新的 DateTime。
您需要注意,在使用ToString
这些类型的默认实现时,文化特定设置会发挥作用。
如果您总是在进行序列化的同一台机器上反序列化,这应该不是问题(除非用户可以在序列化和反序列化之间更改他们的文化设置)。
如果您打算在不同的机器上反序列化,您应该尝试使用文化不变表示。所有这些类型都有ToString
采用格式说明符的重载。不幸的是,文化不变说明符都略有不同。对于数字类型,它是“r”(“往返”格式)。对于DateTime
,它是“o”。因为TimeSpan
它是“c”。通常,这些Parse
方法接受当前区域性格式或不变格式。注意ParseExact
方法。