从基本系统类型到字符串的转换是否可逆

本文关键字:转换 是否 字符串 本系统 类型 | 更新日期: 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方法。

相关文章: