近日在公司看到有人这样子写代码:
for(int i=0;i<100;i++)
{
Model model=BLL.GetModel();
//todo something;
}
然后我的想法是,Model声明在For循环的内部,请问,这里是不是就相当于创建了100个临时Model对象了,在栈上有100个model变量,然后分别指向对应的堆上100个对象??
如果让我来写的话,我是这样写:
Model model=new Model(); //把model声明在循环外部
for(int i =0;i<100;i++)
{
//todo something;
}
而我这种写法是不是相当于在栈上只有一个model变量,始终指向最后一次循环的堆所在的对象??
如果整个循环中只要用到一个Model对象,那么毫无疑问你的写法是对的。如果是根据不同的i去获取不同的Model实例,那么应该是第一种写法。第一种写法创建了100个Model对象(虽然其中某些很快就进入GC流程),第二种做法只会创建一个。
嗯,他循环里面只是获取model出来进行处理就完了,如果需要将Model放到List<T>集合里面的话,那就需要用第一种了。
两种写法针对的需求不同
1、如果model返回的是同一个实例,不管数据是否一样,使用第一种方式,并在循环中不断更改model里面的成员值,这种方式是最优的
2、如果你在循环里面要访问的model压根就不是一个(成员不是一样的),那么你必须在循环中每次都取创建。这样会增加GC次数,在效率和内存上都比第一种方式第,但是这解决另一种需求必须这样写的
那你同意我贴中的说法吗?
@dotnetgeek: 同意
@滴答的雨:
而且,像第一种,循环过程中,栈中每个变量都对堆中的对象有引用,一直都会保持指向,知道循环结束GC才会对这100个对象进行回收,而我这种写法,当循环到第i个的时候,i-1个就已经切断指向了。可以马上被GC回收了。是吧?
@dotnetgeek: 这个倒是没注意for的代码块域是整个循环还是单个迭代了……个人认为应该是没过一个迭代项,里面的临时变量都会被gc