我前几天和一位同事讨论了这个假设情况。运行编译代码时C# - 变量范围和处理如何影响处理效率?
public void Main()
{
string1 = null;
string2 = null,
MyDto dto = Repository.GetDto();
foreach(var row in dto.Rows)
{
ProcessStrings(row, string1, string2)
}
}
public void ProcessStrings(DataRow row, string string1, string string2)
{
string1 = GetStringFromDataRow(row, 1);
string2 = GetStringFromDataRow(row, 2);
// do something with the strings
}
如何将这些在处理不同:考虑这个伪代码:
public void Main()
{
MyDto dto = Repository.GetDto();
foreach(var row in dto.Rows)
{
ProcessStrings(row);
}
}
public void ProcessStrings(DataRow row)
{
string string1 = GetStringFromDataRow(row, 1);
string string2 = GetStringFromDataRow(row, 2);
// do something with the strings
}
那么这个功能相同的选择吗?我们是否认为第二个版本的效率更高一些,因为字符串变量会占用较少的内存并且只能被放置一次,而在第一个版本中,它们在循环的每一遍都会被处理掉?
如果第二个版本中的字符串被ref
或out
参数传递,会有什么区别吗?
他们没有被处置。他们正在GC'd。 – Karolis
我期望第二个版本稍微慢一点*,因为你传递的是不必要的参数。您正在交易参数的局部变量,但两者都只是对实际字符串对象的引用。 –
@PieterWitvoet在CPU级这两个例子可以处理使用CPU寄存器和/或叠层,其可能或可能不实际具有相同的执行配置文件的变量和参数。换句话说,即使C#代码不同,在最终代码中可能根本就没有任何区别。然而,有些代码很可能会被移动,但是我怀疑这是否会在高度理论层面上起作用。 –