我见过与字符串构建器相关的问题,但无法找到相关答案。
我的问题是"在这里使用字符串构建器是否明智?如果不是如何在这里明智地使用它"。
此方法将运行100000次。为了节省一些内存,我在这里使用了stringbuilder。但问题是.ToString()
方法。无论如何,我将不得不使用.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;
}
}
所有库方法都使用字符串作为参数而不是字符串构建器为什么? 我想我的概念中有很多困惑。
答案 0 :(得分:4)
实际上你没有使用字符串构建器。你首先通过以下方式创建一个字符串:
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");
答案 1 :(得分:2)
您实际上是在这里创建4 strings
。
第一个是AppDomain.CurrentDomain.BaseDirectory + "Registry\\"
第二个是将+ postalCode
添加到该字符串时
添加+ ".html"
时的第三个
当你致电fileName.ToString()
时的第四个。
如果你想使用StringBuilder
,你应该这样做:
StringBuilder fileName = new StringBuilder(AppDomain.CurrentDomain.BaseDirectory);
fileName.Append("Registry\\");
fileName.Append(".html");
正如Hans Kesting亲切地提醒我的那样,你并非真的创造了4 strings
。编译器将其优化为对String.Concat()
的一次调用。
答案 2 :(得分:2)
鉴于你的代码做了什么(检查文件是否存在),真正的瓶颈将不是使用字符串或字符串构建器,而是检查文件是否真的存在...所以我会让系统进行字符串和照顾表演:
internal bool isFileExists()
{
return System.IO.File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Registry\\" , postalCode , ".html"));
}
答案 3 :(得分:1)
在您的情况下,首先创建StringBuilder
然后创建string
是没有意义的。
Strings
在C#中是不可变的,当您需要对它们进行更改(替换,追加等)时,会在字符串池中创建另一个字符串。
这样的分配有成本,并且在几个不同的操作的情况下,这个成本加起来并且它变得非常昂贵。
StringBuilder
是一个可以在内部更改的对象,并且对于上述操作要快得多(成本较低),因此最好使用它。
一个人比其他人好的点根据场景而变化,但根据经验,如果你发现自己在相同的方法中反复改变相同的字符串,那么使用它可能是一个好主意而是一个StringBuilder。
答案 4 :(得分:1)
您也可以使用string.Format。它在内部使用StringBuilder。
在你的情况下:
isNumeric = @( c) ~isempty( regexp(c,'^\d*$'))
答案 5 :(得分:1)
IO 操作(甚至File.Exists
)比String
创建更耗时;你无法避免File.Exists
测试这就是为什么,恕我直言,可读性最重要的是:
if
实现:
internal bool isFileExists() {
return File.Exists(String.Format("{0}Registry\\{1}.html",
AppDomain.CurrentDomain.BaseDirectory,
postalCode));
}
答案 6 :(得分:0)
看起来很奇怪isFileExists()没有使用postalCode参数。它只是一个真实代码的示例或片段吗?
我建议你不要使用File.Exists()数千次。使用文件名创建一个hashtset,然后查找它。