C#foreach内存缓存和字符串内存优化

时间:2012-03-22 14:47:13

标签: c#

foreach (string sn in MACOrSerial.Split(','))
{
    MACOrSerial = sn.Trim();   
}

MACORSerial包含以逗号分隔的文本字符串(EX.AA123241,BB123431,CC1231243)。 我抓住一个子串并将其放入相同的MACORSerial中。

这不会给我带来任何问题,因为foreach仍会在内存中使用原始 MACOrSerial。

虽然我认为这是最节省内存的方法,但它是否合适或者我应该使用新名称创建另一个字符串,例如

MacORSerialSubString = sn.Trim()?

我没有任何记忆问题。我只是想确保我的代码干净简洁。

5 个答案:

答案 0 :(得分:8)

您的假设不正确 - 循环超过string[]产生的Split - 这些都是新的字符串实例。

您没有通过将字符串重新分配给原始变量来保存任何内存,并且您通过重用变量而失去了可读性。

这是一种更具可读性并使用一些内置功能的方法:

string[] serialNumbers = MACOrSerial.Split(new [] {',', ' ', '\r', '\n' }, 
                                   StringSplitOptions.RemoveEmptyEntries);

foreach (string sn in serialNumbers)
{
    // do stuff
}

答案 1 :(得分:4)

我的$ .02-您发布的代码非常不直观,因为它打破了预期的模式。

恕我直言,以一种其他开发人员可以一眼就能理解的方式编写代码,而不是(实际上/尝试)对内存进行微优化,尤其是当(正如其他人已经指出)你的微观时,更为重要。 -optimization实际上并没有减少使用的内存量。

答案 2 :(得分:2)

我会创建一个新变量,以便您的代码更清晰。它对记忆没有任何明显的影响。

答案 3 :(得分:1)

为了清晰(以及稍后维护)代码,我更喜欢使用单独的变量。另外,我会在前面删除空字符串:

foreach (string sn in MACOrSerial.Split(',', StringSplitOptions.RemoveEmptyEntries))
{
    string MacORSerialSubString = sn.Trim();
} 

答案 4 :(得分:1)

实际上,您的迭代将使用MACOrSerial.Split()调用的结果,该调用是一个独立于MACOrSeria l变量的数组。

在内存使用方面使用MACOrSerial或其他字符串变量之间没有区别,每次调用sn.Trim(),生成一个新字符串,它只是对这个新字符串放在你的字符串变量中。