gpt4 book ai didi

c# - 什么时候使用 String.Format 与字符串连接比较好?

转载 作者:IT王子 更新时间:2023-10-29 03:34:34 26 4
gpt4 key购买 nike

我有一小段代码解析索引值以确定输入到 Excel 中的单元格。这让我开始思考......

有什么区别

xlsSheet.Write("C" + rowIndex.ToString(), null, title);

xlsSheet.Write(string.Format("C{0}", rowIndex), null, title);

一个比另一个“更好”吗?为什么?

最佳答案

我最初的偏好(来自 C++ 背景)是 String.Format。由于以下原因,我后来放弃了它:

  • 字符串连接可以说是“更安全”。我碰巧(我也见过其他几个开发人员碰过这种事)删除了一个参数,或者错误地弄乱了参数顺序。编译器不会根据格式字符串检查参数,您最终会遇到运行时错误(也就是说,如果您足够幸运,没有将它放在晦涩的方法中,例如记录错误)。通过串联,删除参数不太容易出错。您可能会争辩说出错的可能性很小,但它可能会发生。

- 字符串连接允许空值,String.Format 不允许。编写“s1 + null + s2”不会中断,它只是将 null 值视为 String.Empty。好吧,这可能取决于您的具体情况 - 在某些情况下您想要一个错误而不是默默地忽略一个空的 FirstName。然而,即使在这种情况下,我个人更喜欢自己检查空值并抛出特定错误,而不是我从 String.Format 获得的标准 ArgumentNullException。

  • 字符串连接性能更好。上面的一些帖子已经提到了这一点(没有真正解释为什么,这让我决定写这篇文章 :)。

想法是 .NET 编译器足够智能,可以转换这段代码:

public static string Test(string s1, int i2, int i3, int i4, 
string s5, string s6, float f7, float f8)
{
return s1 + " " + i2 + i3 + i4 + " ddd " + s5 + s6 + f7 + f8;
}

为此:

public static string Test(string s1, int i2, int i3, int i4,
string s5, string s6, float f7, float f8)
{
return string.Concat(new object[] { s1, " ", i2, i3, i4,
" ddd ", s5, s6, f7, f8 });
}

String.Concat 背后发生的事情很容易猜到(使用 Reflector)。数组中的对象通过 ToString() 转换为它们的字符串。然后计算总长度,只分配一个字符串(总长度)。最后,在一些不安全的代码段中,每个字符串都通过 wstrcpy 复制到生成的字符串中。

原因 String.Concat 更快?好吧,我们都可以看看 String.Format 正在做什么 - 您会惊讶于处理格式字符串所需的代码量。除此之外(我已经看到关于内存消耗的评论),String.Format 在内部使用了 StringBuilder。方法如下:

StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));

因此对于每个传递的参数,它保留 8 个字符。如果参数是一位数值,那就太糟糕了,我们浪费了一些空间。如果参数是在 ToString() 上返回一些长文本的自定义对象,那么甚至可能需要一些重新分配(当然是最坏的情况)。

与此相比,串联只是浪费了对象数组的空间(不算太多,考虑到它是一个引用数组)。没有对格式说明符的解析,也没有中介 StringBuilder。两种方法都存在装箱/拆箱开销。

我选择 String.Format 的唯一原因是涉及本地化。将格式字符串放在资源中可以让您支持不同的语言而不会弄乱代码(想想格式化值根据语言改变顺序的场景,即“{0} 小时 {1} 分钟后”在日语中可能看起来很不一样: ).


总结一下我的第一篇(也是很长的)博文:

  • 对我来说(在性能与可维护性/可读性方面)最好的方法是使用字符串连接,没有任何 ToString() 调用
  • 如果您追求性能,请让 ToString() 自己调用以避免装箱(我有点偏向于可读性)- 与您问题中的第一个选项相同
  • 如果您要向用户显示本地化的字符串(此处不是这种情况),String.Format() 有优势。

关于c# - 什么时候使用 String.Format 与字符串连接比较好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/296978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com