.ToString()从StringBuilder创建一个新字符串,所以为什么不直接使用字符串呢
本文关键字:字符串 为什么不 创建 StringBuilder ToString 一个 | 更新日期: 2023-09-27 18:21:00
我看到了与字符串生成器相关的问题,但无法找到相关的答案。
我的问题是"在这里使用字符串生成器明智吗?如果不是如何在这里明智地使用它"。
这个方法将运行100000次。为了节省一些内存,我在这里使用了字符串生成器。但问题在于CCD_ 1方法。无论如何,我必须使用.ToString()
方法创建一个字符串,所以为什么不将filename
初始化为字符串而不是StringBuilder
呢。
internal bool isFileExists()
{
StringBuilder fileName = new StringBuilder(AppDomain.CurrentDomain.BaseDirectory + "Registry''" + postalCode + ".html");
if (System.IO.File.Exists(fileName.ToString()))
{
return true;
}
else
{
return false;
}
}
所有库方法都使用字符串作为参数而不是字符串生成器,为什么?我想我在概念上有很多困惑。
实际上您没有使用字符串生成器。您首先通过以下方式生成字符串:
AppDomain.CurrentDomain.BaseDirectory + "Registry''" + postalCode + ".html"
然后将其提供给字符串生成器。
正确使用StringBuilder:
StringBuilder fileName = new StringBuilder();
fileName.Append(AppDomain.CurrentDomain.BaseDirectory);
fileName.Append("Registry''");
fileName.Append(postalCode );
fileName.Append(".html");
如果你制作内衬来制作字符串,你可以通过以下方式制作字符串:
string filenamestr = AppDomain.CurrentDomain.BaseDirectory + "Registry''" + postalCode + ".html";
在这种情况下,您正在创建一个文件路径,因此建议使用:
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Registry''" , postalCode , ".html");
给定代码的作用(检查文件是否存在),真正的瓶颈不是使用字符串或字符串生成器,而是检查文件是否真的存在。。。因此,我会让系统进行字符串的连接并考虑性能:
internal bool isFileExists()
{
return System.IO.File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Registry''" , postalCode , ".html"));
}
您实际上在这里创建了4个strings
。第一个是AppDomain.CurrentDomain.BaseDirectory + "Registry''"
第二个是将+ postalCode
添加到该字符串中
第三个是添加+ ".html"
第四个是当你呼叫fileName.ToString()
时。
如果你想使用.ToString()
0,你应该这样做:
StringBuilder fileName = new StringBuilder(AppDomain.CurrentDomain.BaseDirectory);
fileName.Append("Registry''");
fileName.Append(".html");
正如Hans Kesting善意地提醒我的那样,你并不是真的在创造4个strings
。编译器将其优化为一次对String.Concat()
的调用。
您也可以使用字符串。总体安排它在内部使用StringBuilder。
在您的情况下:
var fileName = string.Format("{0}Registry''{1}.html", AppDomain.CurrentDomain.BaseDirectory, postalCode);
是String.Format与StringBuilder 一样高效
IO操作(甚至是File.Exists
)比创建String
更耗时;你无法避免File.Exists
测试,这就是为什么,IMHO,可读性是最重要的:
- 字符串格式
- 无冗余
if
实施:
internal bool isFileExists() {
return File.Exists(String.Format("{0}Registry''{1}.html",
AppDomain.CurrentDomain.BaseDirectory,
postalCode));
}
在您的情况下,先创建StringBuilder
,然后创建string
是没有意义的。
Strings
在C#中是不可变的,当您需要对它们进行更改(Replace、Append等)时,会在字符串池中创建另一个字符串。这样的分配是有成本的,如果有几个不同的操作,这个成本加起来就会变得非常昂贵。
StringBuilder
是一个可以在内部更改的对象,并且对于上行操作来说要快得多(成本较小),因此最好使用它
一个比另一个好的点会根据场景而变化,但根据经验,如果你发现自己在同一个方法中一遍又一遍地更改同一个字符串,那么使用StringBuilder可能是个好主意。
看起来很奇怪isFileExists()没有使用postalCode参数。它只是一个例子还是一段真实的代码?
我建议你不要使用File.Exists()数千次。用文件名制作一个hashtset,然后查找它。