.ToString()从StringBuilder创建一个新字符串,为什么不直接使用string呢?

时间:2015-11-06 10:06:13

标签: c#

我见过与字符串构建器相关的问题,但无法找到相关答案。

我的问题是"在这里使用字符串构建器是否明智?如果不是如何在这里明智地使用它"。

此方法将运行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;
    }
}

所有库方法都使用字符串作为参数而不是字符串构建器为什么? 我想我的概念中有很多困惑。

7 个答案:

答案 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*$'))

Is String.Format as efficient as StringBuilder

答案 5 :(得分:1)

IO 操作(甚至File.Exists)比String创建更耗时;你无法避免File.Exists测试这就是为什么,恕我直言,可读性最重要的是:

  1. 字符串格式
  2. 多余 if
  3. 实现:

    internal bool isFileExists() {
      return File.Exists(String.Format("{0}Registry\\{1}.html", 
        AppDomain.CurrentDomain.BaseDirectory,
        postalCode));
    }
    

答案 6 :(得分:0)

看起来很奇怪isFileExists()没有使用postalCode参数。它只是一个真实代码的示例或片段吗?

我建议你不要使用File.Exists()数千次。使用文件名创建一个hashtset,然后查找它。