从基本系统类型转换为字符串可逆吗?

时间:2013-09-22 08:28:10

标签: c# type-conversion

在字符串中存储对象时,我是否可以确保将其转换为成功执行它是否依赖于其他内容?

DateTime dt = DateTime.UtcNow;
string pattern = dt.ToString();
DateTime retDt = DateTime.Parse(pattern);

这个问题是询问以下对象类型:

  • 时间跨度
  • 日期时间
  • INT

我试过阅读几个论坛,并没有看到任何矛盾的例子。我也没有 从我的代码中得到了任何例外,但我确信我没有尝试过所有可能的输入/场景。

3 个答案:

答案 0 :(得分:2)

使用ToString时,您可以指定格式(有关详细信息,请参阅this topic)。

在许多这些情况下,您希望使用的格式是往返格式(Single,Double和BigInteger类型为“R”,DateTime为“O”。)此格式可确保所有信息都传递给字符串,并且可以解析回完全相同的数据。

IFormatProvider传递给ToString对于避免语言环境问题也很重要(例如,不同的语言环境可以为小数点分隔符使用不同的字符。)使用静态CultureInfo.InvariantCulture解决此问题问题

最后,如果您尝试保留数据然后检索数据,您可能需要考虑使用序列化程序,这需要整个类并将它们写入各种格式。 .NET有几个序列化程序,其中两个最突出的是BinaryFormatter(二进制)和DataContractSerializer(XML)。

答案 1 :(得分:1)

Parse和ToString能够转换为您选择的类型,取决于它们的实现。对于默认设置,转换无需任何更改即可运行。

请注意DateTime,因为您可能希望指定使用ToString输出时区信息,以便您的解析将使用正确的时区信息创建新的DateTime。

答案 2 :(得分:1)

在使用这些类型的默认ToString实现时,您需要注意文化特定设置。

如果您始终在进行序列化的同一台计算机上进行反序列化,则不应该是一个问题(除非用户可以在序列化和反序列化之间更改其文化设置)。

如果您打算在其他计算机上反序列化,则应尝试使用区域性不变表示。所有这些类型都有ToString的重载,它们采用格式说明符。不幸的是,文化不变的说明符都略有不同。对于数字类型,它是“r”(“往返”格式)。对于DateTime,它是“o”。对于TimeSpan,它是“c”。通常,Parse方法接受当前的文化格式或不变格式。注意ParseExact方法。