【发布时间】:2012-06-06 12:19:05
【问题描述】:
我有一个程序,它存储了一堆包含许多 double 类型成员的结构实例。我经常将这些转储到一个文件中,我正在使用字符串生成器,例如:
StringBuilder builder = new StringBuilder(256);
builder.AppendFormat("{0};{1};{2};", x.A.ToString(), x.B.ToString(), x.C.ToString());
其中 'x' 是我的类型的一个实例,而 A、B、C 是双精度类型 X 的成员。我在每一个上调用 ToString() 以避免装箱。但是,这些对 ToString 的调用仍会在我的应用程序上下文中分配大量内存,我想减少这种情况。我在想的是有一个字符数组,并将每个成员直接写入其中,然后从该字符数组创建一个字符串并将其转储到文件中。几个问题:
1) 我的想法听起来合理吗?有没有人知道已经实现了类似的东西?
2) 是否已经内置了一些东西可以将双精度转换为字符数组(我猜这会达到一些参数化的精度?)。理想情况下想要传入我的数组和一些索引并让它开始写入那里。
我尝试这样做的原因是在我的应用程序运行时减少内存中的大峰值,因为我运行许多实例并且经常发现自己受到内存的限制。
干杯 一个
【问题讨论】:
-
StringBuilder对于像这样的简单连接来说太过分了。 -
你为什么不简单地使用:
builder.AppendFormat("{0};{1};{2};", x.A, x.B, x.C)来代替? -
@asawyer 其实还有很多会员,这只是举例
-
@user555265 在 int 上调用 ToString() 应该将其装箱,因为它很可能会覆盖 object.ToString() 的实现。见stackoverflow.com/questions/3499651/boxing-a-thing-of-the-past
-
@MartinLiversage 我知道,但不是 Double.ToString() 导致 builder.AppendFormat("{0};{1};{2};", x.A, x.B, x.C ),它是 StringBuilder.AppendFormat(string, object[]) (msdn.microsoft.com/en-us/library/cazfhf32)。另外,不要忘记我们在这里传递了一个数组。除了装箱的双精度数之外,该数组也分配在堆上。