2012-08-14 43 views
0

所以从我所了解的string vs StringBuilder是字符串生成器将实际修改自己的实例,而字符串将只是一个新的。所以,如果我正确地理解了这一点,那么通过对不断变化的变量使用字符串方法,我基本上可以最终使用所有内存,直到计算机需要转储它以腾出空间。字符串生成器是正确的选择吗?

我在做什么是使用事件处理程序来监视串行通信。我将接收数据并解析出来,并将其显示在文本框中。事件处理程序使用字符串来完成此目前。关注更好的编程,而不是用完所有的内存,当我不需要时,我正试图清理我的代码。

我开始用字符串生成器进行编码,并开始出现StringBuilder不包含.contains方法的构建错误。

基本上我很好奇,如果我应该离开它独自一人?我应该采取不同的方式吗?我有没有正确的理解,string将不可避免地让我内存不足?

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 

    string indata = sp.ReadExisting(); 
    rx.AppendText(Environment.NewLine + indata); 
    string dataCheck = indata.ToUpper(); 
    if (dataCheck.Contains("CONNECT") || indata.Contains("CONNECTED")) 
    { 
     cState.Text = "Connected"; 
     connectLink(); 
    } 
    if (dataCheck.Contains("NO CARRIER")) 
    { 
     cState.Text = "Disconnected"; 
     disconnect(); 
    } 
    dataCheck = null; 
} 
+3

对于与此类似的问题,[codereview.se]也是一个很好的地方...顺便说一句,你可以摆脱'dataCheck = null;'赋值,因为它没有可测量的效果记忆。垃圾收集器最终会收集'dataCheck',不管你是否指定null。 – Adam 2012-08-14 00:22:49

+0

现在,你的代码被彻底打破了,这个问题是无关紧要的。 ReadExisting()永远不会给你一个字符串,如真实世界中的“CONNECT”。你只有在你调试你的代码时才会这样做。在没有调试器的情况下运行你的代码时,最好你会得到“CO”。 – 2012-08-14 00:34:22

+0

'|| indata.Contains(“CONNECTED”)不需要,因为搜索“CONNECT”将覆盖这种情况。另外,你很可能想要搜索'dataCheck'。 – 2012-08-14 02:37:32

回答

5

你是错的;使用字符串不会(通常)导致您用尽内存。

如果你正在做大量的串联,使用字符串效率较低,因为它需要建立一个新的字符串,并在每次连接时丢弃旧的字符串。
在这种情况下,您应该使用StringBuilder构建字符串,然后在需要显示时调用ToString()

你的代码不包含任何连接,所以使用StringBuilder不会有任何好处。

+3

*“你是不正确的;使用字符串不会导致你用完内存。”当然可以(理论上),但我不能说在这种情况下它是否是一个问题。我曾经必须解决许多大型字符串分配导致的OOM情况,这反过来又破坏了LOH,最终导致了OOM例外。 – 2012-08-14 00:20:56