.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;
    }
}

所有库方法都使用字符串作为参数而不是字符串生成器,为什么?我想我在概念上有很多困惑。

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

实际上您没有使用字符串生成器。您首先通过以下方式生成字符串:

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,可读性是最重要的:

  1. 字符串格式
  2. 冗余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,然后查找它。