在C#中,重新初始化先前声明的变量而不是声明和初始化新变量是否有利有弊?(忽略对简洁性和人类可读性的看法.)
例如,比较这两个样本:
DataColumn col = new DataColumn();
col.ColumnName = "Subsite";
dataTable.Columns.Add(col);
col = new DataColumn(); // Re-use the "col" declaration.
col.ColumnName = "Library";
dataTable.Columns.Add(col);
Run Code Online (Sandbox Code Playgroud)
VS
DataColumn col1 = new DataColumn();
col1.ColumnName = "Subsite";
gridDataTable.Columns.Add(col1);
DataColumn col2 = new DataColumn(); // Declare a new variable instead.
col2.ColumnName = "Library";
gridDataTable.Columns.Add(col2);
Run Code Online (Sandbox Code Playgroud)
一个涉及循环的类似示例:
string str;
for (int i = 0; i < 100; i++)
{
str = "This is string #" + i.ToString(); // Re-initialize the "str" variable.
Console.WriteLine(str);
}
Run Code Online (Sandbox Code Playgroud)
VS
for (int i = 0; i < 100; i++)
{
string str = "This is string #" + i.ToString(); // Declare a new "str" each iteration.
Console.WriteLine(str);
}
Run Code Online (Sandbox Code Playgroud)
编辑:到目前为止,谢谢大家的答案.读完之后,我想我会稍微扩展一下我的问题:
如果我错了,请纠正我.
当我声明并初始化类似System.String的引用类型时,我有一个指向该对象的指针,该对象存在于堆栈中,而对象的内容存在于堆上(只能通过指针访问).
在第一个循环示例中,似乎我们只创建了一个指针"str",我们创建了100个String类的实例,每个实例都存在于堆上.在我看来,当我们遍历循环时,我们只是将"str"指针改为每次都指向String类的新实例.那些不再指向它们的"旧"字符串将被垃圾收集 - 尽管我不确定何时会发生这种情况.
在第二个循环示例中,除了创建100个String类实例之外,我们似乎创建了100个指针.
不过,我不确定堆栈中不再需要的项目会发生什么.我不认为垃圾收集器也摆脱了这些物品; 也许一旦你退出他们的范围,他们会立即从堆栈中删除?即使这是真的,我认为只创建一个指针并更新它指向的内容比创建100个不同的指针更有效,每个指针都指向一个唯一的实例.
我理解"过早优化是邪恶的"论点,但我只是想要更深入地了解事物,而不是将我的程序优化为死亡.
你的第二个例子有一个更清晰的答案,第二个例子是更好的答案.原因是变量str仅在for块中使用.在for块之外声明变量意味着另一段代码可能会错误地绑定到此变量,从而导致应用程序中出现错误.您应该在最具体的范围内声明所有变量,以防止意外使用.
对于第一个样本,我认为这更符合偏好.对我来说,我选择创建一个新变量,因为我相信每个变量都应该有一个目的.如果我重用变量,通常表明我需要重构我的方法.