c# - 重新初始化变量或声明新的?

标签 c#

在 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);

对比

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);

涉及循环的类似示例:

string str;
for (int i = 0; i < 100; i++)
{
    str = "This is string #" + i.ToString(); // Re-initialize the "str" variable.
    Console.WriteLine(str);
}

对比

for (int i = 0; i < 100; i++)
{
    string str = "This is string #" + i.ToString(); // Declare a new "str" each iteration.
    Console.WriteLine(str);
}

编辑:感谢大家到目前为止的回答。阅读它们之后,我想我应该稍微扩展一下我的问题:

如有错误请指正。

当我声明和初始化像 System.String 这样的引用类型时,我有一个指向该对象的指针,它存在于堆栈上,对象的内容存在于堆上(只能通过指针访问)。

在第一个循环示例中,我们似乎只创建了一个指针“str”,并且创建了 String 类的 100 个实例,每个实例都存在于堆中。在我看来,当我们遍历循环时,我们只是每次都将“str”指针更改为指向 String 类的一个新实例。那些不再有指向它们的指针的“旧”字符串将被垃圾收集——尽管我不确定什么时候会发生。

在第二个循环示例中,除了创建 String 类的 100 个实例之外,我们似乎还创建了 100 个指针。

不过,我不确定堆栈中不再需要的项目会发生什么情况。我不认为垃圾收集器也处理掉了这些元素;也许一旦您退出它们的范围,它们就会立即从堆栈中删除?即使那是真的,我认为只创建一个指针并更新它指向的内容比创建 100 个不同的指针更有效,每个指针都指向一个唯一的实例。

我理解“过早的优化是邪恶的”论点,但我只是想更深入地了解事物,而不是将我的程序优化到死。

最佳答案

你的第二个例子有一个更清晰的答案,第二个例子更好。原因是变量 str 仅在 for block 中使用。在 for block 之外声明变量意味着另一段代码可能会错误地绑定(bind)到该变量,从而导致您的应用程序出现错误。您应该在最具体的范围内声明所有变量,以防止意外使用。

对于第一个示例,我认为这更像是一个偏好问题。对我来说,我选择创建一个新变量,因为我相信每个变量都应该有一个单一的目的。如果我重用变量,这通常表明我需要重构我的方法。

关于c# - 重新初始化变量或声明新的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1189353/

相关文章:

c# - Entity Framework 'database first' 在 Visual Studio 2017 中的替代品是什么

c# - 如何在链接按钮的 OnClientClick 中调用 java 脚本函数(在 .cs 中)?

c# - 使用交易范围和查询

c# - 使用内部连接从 Dapper 获取数据

c# - 发布base64转换后的图像数据

c# - EF6 可选 1 :1 include not working

c# - 了解一个人的感受如何?

c# - 监控现场麦克风输入

C# 泛型或反射 - 调用未知类的函数

c# - 是否可以从 .net 应用程序禁用 c++ 断言