【讨论】变量到底应该在循环外定义,还是在循环内定义

老龙友 2012-08-28 10:04:33
一直以来,当需要在循环内使用变量时,我都是在循环外定义变量,在循环内赋值。主要是从DOS时代过来习惯了。

但是不太清楚,.NET的机制,如果在循环内定义变量同时赋值,到底对性能是否会有影响。
...全文
974 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

除非编译器有优化,否则还是定义在外比较好,理论上,编译器应该是有优化的,

因为如果没有优化的话,按常理,应该是每次循环的话,都会重新开辟和申请一个该变量的内存区域. 这样的话,性能多少会有点影响
[/Quote]
定义和初始化是两个不同的概念,定义一个变量不需要分配很大的内存区域,只要很小的定义堆栈即可。但是由于定义的变量本身指示用来装载数据的,因此被编译到IL的时候,只有数据才是有意义的,变量起到桥梁的作用,因此编译的时候就定义一次,循环内多次被使用。另外如果要做到多次定义,这在IL编码中也无法实现,因为IL中没有循环的概念,只有类似GOTO语句,C#里面每次循环,变量名都一样,如果对于死循环,变量的命名问题很成问题,既然离开作用于变量就自动消失的,那么在IL这个全名命名体系下面,就尽可能做到一次定义多次使用(IL里面的变量作用于是整个函数,没有部分作用于的概念)
烈火蜓蜻 2012-08-30
  • 打赏
  • 举报
回复
除非编译器有优化,否则还是定义在外比较好,理论上,编译器应该是有优化的,

因为如果没有优化的话,按常理,应该是每次循环的话,都会重新开辟和申请一个该变量的内存区域. 这样的话,性能多少会有点影响
qldsrx 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:
你这个不是循环内循环外的问题,是有BUG了

ListItem l = new ListItem();//我的意思是这样定义,下拉框显示的全是c
foreach (var t in array)
{

l.Text = l.Value = t;
ddl.Items.Add(l);
}
[/Quote]
他问的是定义,不是初始化,两个不同的概念要分清楚。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
你这个不是循环内循环外的问题,是有BUG了
[/Quote]
ListItem l = new ListItem();//我的意思是这样定义,下拉框显示的全是c
foreach (var t in array)
{

l.Text = l.Value = t;
ddl.Items.Add(l);
}
SocketUpEx 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:

这个不一定,要看情况的。有时候变量必须定义到循环里面

一般值类型无所谓,引用类型要看情况了。
举个例子

DropDownList ddl = new DropDownList();//ddl是dropdownlist
string[] array = new string[] {"a","b","c" };
……
[/Quote]

你这个不是循环内循环外的问题,是有BUG了
就算放在循环外,也应该要这样的:
DropDownList ddl = new DropDownList();//ddl是dropdownlist
string[] array = new string[] {"a","b","c" };
ListItem l = null;//如果定义到foreach外边,下拉框显示的全是c
foreach (var t in array)
{
l = new ListItem();
l.Text = l.Value = t;
ddl.Items.Add(l);
}
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

这个不一定,要看情况的。有时候变量必须定义到循环里面
[/Quote]
一般值类型无所谓,引用类型要看情况了。
举个例子

DropDownList ddl = new DropDownList();//ddl是dropdownlist
string[] array = new string[] {"a","b","c" };
foreach (var t in array)
{
ListItem l = new ListItem();//如果定义到foreach外边,下拉框显示的全是c
l.Text = l.Value = t;
ddl.Items.Add(l);
}
bdmh 2012-08-28
  • 打赏
  • 举报
回复
循环外用不到,就在循环内
  • 打赏
  • 举报
回复
这个不一定,要看情况的。有时候变量必须定义到循环里面

qldsrx 2012-08-28
  • 打赏
  • 举报
回复
定义在内部和定义在外部,其最终产生的IL代码都是一样的,在IL代码里面,变量永远是定义在最外面且最上面的。
SocketUpEx 2012-08-28
  • 打赏
  • 举报
回复
您随意
这个不需要多纠结的



111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧