从基本系统类型到字符串的转换是否可逆
本文关键字:转换 是否 字符串 本系统 类型 | 更新日期: 2023-09-27 18:32:22
当将对象存储在字符串中时,我能否确保将其重新转换将成功执行,它是否取决于其他内容?
DateTime dt = DateTime.UtcNow;
string pattern = dt.ToString();
DateTime retDt = DateTime.Parse(pattern);
此问题询问的是以下对象类型:
- 时间跨度
- 日期时间
- 国际
- 长
- 浮
- 双
我尝试阅读了几个论坛,没有看到任何矛盾的例子。我也没有我的代码中还没有出现任何异常,但我确定我还没有尝试所有可能的输入/场景。
使用ToString
时,您可以指定数字和时间的格式(有关详细信息,请参阅本主题)。
在许多情况下,您希望使用的格式是往返格式("R"表示单、双精度和 BigInteger 类型,"O"表示日期时间。此格式可确保所有信息传递到字符串,并且可以解析回完全相同的数据。
将IFormatProvider
传递给ToString
对于避免区域设置问题也是必不可少的(例如,不同的区域设置可以为小数分隔符使用不同的字符)。使用静态CultureInfo.InvariantCulture
可以解决此问题。
最后,如果您尝试持久化数据然后检索它,您可能需要考虑使用序列化程序,它采用整个类并将其写入各种格式。 .NET 有几个序列化程序,其中最突出的两个是 BinaryFormatter
(二进制)和DataContractSerializer
(XML)。
Parse 和 ToString 是否能够与您选择的类型进行转换取决于它们的实现。 对于默认值,转换将无需任何更改即可进行。
不过,请注意日期时间,因为您可能希望指定使用 ToString 输出时区信息,以便您的解析将使用正确的时区信息创建新的日期时间。
注意,在对这些类型使用默认ToString
实现时,特定于区域性的设置会发挥作用。
如果始终在执行序列化的同一台计算机上反序列化,则应该不是问题(除非用户可以在序列化和反序列化之间更改其区域性设置)。
如果要在其他计算机上反序列化,则应尝试使用区域性固定表示形式。所有这些类型都具有采用格式说明符的重载ToString
。遗憾的是,区域性不变说明符都略有不同。对于数字类型,它是"r"("往返"格式)。对于DateTime
,它是"o"。对于TimeSpan
,它是"c"。通常,Parse
方法接受当前区域性格式或固定格式。注意ParseExact
方法。