局部变量实例化

当执行过程进入局部变量范围时,该变量视为被实例化。例如当调用下面方法时局部变量x被实例化和初始化三次,每一次对应于循环的一轮迭代。

static D[] F()
{

for (int i = 0; i < 3; i++)
{
int x = 2 * i + 1;//当x声明在循环里面,结果为1,3,5
...
}

但是,如果将x声明移到循环外,则x将只实例化一次。

static D[] F()
{

int x;
for (int i = 0; i < 3; i++)
{
      x = 2 * i + 1;//当x在循环外声明结果为5,5,5
 }

为捕获时,我们无法确切的知道局部实例化的频率,因为实例化的生存期不是连续的,有可能每次实例化都使用同一位置存储,但是,当用匿名函数捕获到局部变量时,实例化的效果就变得很明显了,下面示例

using System;

namespace 委托
{
class Program
{
public delegate void D();
static void Main(string[] args)
{
foreach (D d in F())

d();

Console.ReadKey();
}
static D[] F()

{
D[] result=new D[3];
//int x;
for (int i = 0; i < 3; i++)
{
int x = 2 * i + 1;//当x声明在循环里面,结果为1,3,5
//x = 2 * i + 1;//当x在循环外声明结果为5,5,5
result[i] = () => { Console.WriteLine(x); };
}
return result;
}
}
}

但是如果for循环声明了一个迭代变量,则该变量视为在循环外部声明。

static D[] F()

{
D[] result=new D[3];
for (int i = 0; i < 3; i++)
{
result[i] = () => { Console.WriteLine(x); };
}
return result;
}

输出的结果将为3,3,3

posted @ 2012-12-20 10:58  FengLu-1  阅读(488)  评论(0编辑  收藏  举报