避免在finally撰写无效代码:
先提出一个问题,即:是否存在一种打破try- finally执行顺序的情况。答案是:没有 (除非应用程序本身因为某些很少出现的特殊情况在try块中退出)。你应该始终认为finally内代码会在方法return之前被执行,哪怕return是在try块中。但需要区分引用类型变量和值类型变量在 finally中会导致不同结果 。
private static int TestIntReturnInTry() { int i; try { return i = 1; } finally { i = 2; Console.WriteLine("\t将int结果改为2,finally执行完毕"); } }
它返回的将是1。代码中,i=2实际上是一段无效代 码 ,如果编译采用Release模式,编译器会直接将i=2删除,它不会为其生成对应的IL代码。但是:
static User TestUserReturnInTry() { User user = new User() { Name = "Mike", BirthDay = new DateTime(2010, 1, 1) }; try { return user; } finally { user.Name = "Rose"; user.BirthDay = new DateTime(2010, 2, 2); Console.WriteLine("\t将user.Name改为Rose"); } }
TestUserReturnInTry方法返回的User中,Name的值已经改变为Rose了。