在字符串中存储对象时,我是否可以确保将其转换为成功执行它是否依赖于其他内容?
DateTime dt = DateTime.UtcNow;
string pattern = dt.ToString();
DateTime retDt = DateTime.Parse(pattern);
这个问题是询问以下对象类型:
我试过阅读几个论坛,并没有看到任何矛盾的例子。我也没有 从我的代码中得到了任何例外,但我确信我没有尝试过所有可能的输入/场景。
答案 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
方法。