所以從我所瞭解的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;
}
對於與此類似的問題,[codereview.se]也是一個很好的地方...順便說一句,你可以擺脫'dataCheck = null;'賦值,因爲它沒有可測量的效果記憶。垃圾收集器最終會收集'dataCheck',不管你是否指定null。 – Adam 2012-08-14 00:22:49
現在,你的代碼被徹底打破了,這個問題是無關緊要的。 ReadExisting()永遠不會給你一個字符串,如真實世界中的「CONNECT」。你只有在你調試你的代碼時纔會這樣做。在沒有調試器的情況下運行你的代碼時,最好你會得到「CO」。 – 2012-08-14 00:34:22
'|| indata.Contains(「CONNECTED」)不需要,因爲搜索「CONNECT」將覆蓋這種情況。另外,你很可能想要搜索'dataCheck'。 – 2012-08-14 02:37:32