String / StringBuilder - 在不创建临时字符串的情况下创建子字符串

时间:2014-09-14 18:19:57

标签: .net string stringbuilder

首先,这是一个.net 2.0 DLL,通常由.NET 4.0+应用程序调用。 (它是2.0,因为这是一个商业图书馆,许多仍然在2.0 - 3.5)。

我们有一些情况,我们有一个字符串或StringBuilder,需要一个子字符串。在各种地方,它是4种组合中的任何一种(source = string或StringBuilder,new object = string或StringBuilder)。我们遇到的问题是我们的程序使用了大量的内存,并且大约4条指令存在的所有临时字符串都使垃圾收集器工作了很多。

我提出的最好的是(我们的代码不是这样编写的,我只是简单地说明这一点:

string srcString =“感谢您的帮助”;

StringBuilder srcStrBldr = new StringBuilder(“感谢您的帮助”);

  1. StringBuilder middle = new StringBuilder(srcStrBldr.ToString,7,7,7);
  2. StringBuilder middle = new StringBuilder(srcString,7,7,7);
  3. string middle = srcStrBldr.ToString()。Substring(7,7);
  4. 问题:

    1. 运行.NET 4.0应用程序时,是否仍在使用内部的.NET 2.0字符串类?
    2. 通过反射器查看StringBuilder代码表明,如果字符串是在同一个线程中创建的,并且ArrayLength足够短,那么#1将会很好用。但是,在VisualStudio下运行,它是一个单线程应用程序,StringBuilder.m_currentThread == 0,它与当前线程不匹配 - 因此创建了一个临时字符串。有什么方法吗? (我试图让VisualStudio进入这段代码 - 但无法实现 - 唉!)
    3. #2上面我认为没问题。
    4. #3清楚地创建了一个临时字符串。
    5. 有更好的方法吗?如果它正在使用.NET 2.0类,那么能够访问StringBuilder.m_S​​tringValue将允许我编写上述所有不创建临时字符串对象的代码。我可以用反射做到这一点,但这需要时间,然后让我在速度与内存使用权的交易。而且,如果内部代码发生变化(不太可能,但可能),该怎么办。

      那么......有什么建议吗?

0 个答案:

没有答案