一个关于流程控制的问题
代码
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Console.WriteLine(Test2()); // 输出 AA
TestClass ts = Test();
Console.WriteLine(ts.str); // 输出 CC
Console.ReadLine();
}
public static TestClass Test()
{
TestClass ts = new TestClass();
try
{
ts.str = "AA"; //
return ts; // 在执行return的时候、返回值就已经确定了,在此时要对数据进行拷贝
// 由于 Ts 是引用类型即是一个指针,数据拷贝直接拷贝的是 内存地址
// 由于方法到此时还没有执行完毕所以还要继续执行
}
catch (Exception ex)
{
ts.str = "BB";
Console.WriteLine(ex.Message);
return ts;
}
finally
{
ts.str = "CC"; // 由于Finally的特殊性:无论是否发生异常都要执行finally语句
// 该语句会在执行return 语句之后 方法执行完毕前 执行。
// 由于数据拷贝是在return语句执行是发生的,并且拷贝的是内存地址,
// 而该语句又是对内存地址所指向的数据进行修改、而不是修改这个内存地址,
// 所以 此操作影响了外界到的数据、更确切的说是影响了其内存地址中的数据
}
}
public static string Test2()
{
string str = "";
try
{
str = "AA"; //
return str; // 在执行return的时候、返回值就已经确定了,在此时要对数据进行拷贝
// 由于 string 是值类型,数据拷贝直接拷贝的是 数据
// 由于方法到此时还没有执行完毕所以还要继续执行
}
catch (Exception ex)
{
str = "BB";
Console.WriteLine(ex.Message);
return str;
}
finally
{
str = "CC"; // 由于Finally的特殊性:无论是否发生异常都要执行finally语句
// 该语句会在执行return 语句之后 方法执行完毕前 执行。
// 由于数据拷贝是在return语句执行是发生的,并且拷贝的是数据,
// 所以该语句的执行不会影响到返回值
}
}
}
public class TestClass
{
public string str;
}