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;
    }