先看下面一段代码
static void Main(string[] args)
{
Console.WriteLine(GetIt());
Console.ReadKey();
}
static int GetIt()
{
int i = 8;
try
{
i++;
Console.WriteLine("a");
return i;
}
finally
{
Console.WriteLine("b");
i++;
}
}
上面程序的执行结果是:ab9
static void Main(string[] args)
{
//Console.WriteLine(GetIt());
Console.WriteLine(GetPerson().Age);
Console.ReadKey();
}
static Person GetPerson()
{
Person p = new Person();
p.Age = 8;
try
{
p.Age++;
Console.WriteLine("a");
return p;
}
finally
{
Console.WriteLine("b");
p.Age++;
}
}
上面程序的执行结果是:ab10
也就是说我们在执行到try 里面return语句时,先记录下要返回的值,但是并没有返回,而是去执行ffinally里面的语句,执行完成后,再返回try里面的先前记录的结果
让我们看看读取数据库中数据的条数的
public int QueryCount()
{
…..
try
{
return cmd.ExecuteScalar();
}
finally
{
cmd.Dispose();
}
}
先执行cmd.ExecuteScalar(),把返回值暂时存起来,然后再去执行finally(钱放在这,我去劫个色),然后把返回值返回。return都是最后执行,但是return后的表达式的计算则是在finally之前。
如果C#设计的是先执行cmd.Dispose()再执行return就会出现return执行失败了,因为cmd已经Dispose了。