首页 新闻 会员 周边 捐助

两种写法,哪种比较优化?为什么!

0
悬赏园豆:10 [待解决问题]

近日在公司看到有人这样子写代码:

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变量,始终指向最后一次循环的堆所在的对象??

dotnetgeek的主页 dotnetgeek | 菜鸟二级 | 园豆:482
提问于:2013-03-13 11:26
< >
分享
所有回答(2)
0

如果整个循环中只要用到一个Model对象,那么毫无疑问你的写法是对的。如果是根据不同的i去获取不同的Model实例,那么应该是第一种写法。第一种写法创建了100个Model对象(虽然其中某些很快就进入GC流程),第二种做法只会创建一个。

水牛刀刀 | 园豆:6350 (大侠五级) | 2013-03-13 11:32

嗯,他循环里面只是获取model出来进行处理就完了,如果需要将Model放到List<T>集合里面的话,那就需要用第一种了。

支持(0) 反对(0) dotnetgeek | 园豆:482 (菜鸟二级) | 2013-03-13 11:34
0

两种写法针对的需求不同

1、如果model返回的是同一个实例,不管数据是否一样,使用第一种方式,并在循环中不断更改model里面的成员值,这种方式是最优的

2、如果你在循环里面要访问的model压根就不是一个(成员不是一样的),那么你必须在循环中每次都取创建。这样会增加GC次数,在效率和内存上都比第一种方式第,但是这解决另一种需求必须这样写的

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-13 13:54

那你同意我贴中的说法吗?

支持(0) 反对(0) dotnetgeek | 园豆:482 (菜鸟二级) | 2013-03-13 13:56

@dotnetgeek: 同意

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-13 13:58

@滴答的雨: 

而且,像第一种,循环过程中,栈中每个变量都对堆中的对象有引用,一直都会保持指向,知道循环结束GC才会对这100个对象进行回收,而我这种写法,当循环到第i个的时候,i-1个就已经切断指向了。可以马上被GC回收了。是吧?

支持(0) 反对(0) dotnetgeek | 园豆:482 (菜鸟二级) | 2013-03-13 14:02

@dotnetgeek: 这个倒是没注意for的代码块域是整个循环还是单个迭代了……个人认为应该是没过一个迭代项,里面的临时变量都会被gc

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-13 15:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册