引用参数与输出参数的区别

先看个例子

using System;

namespace NetBase
{
    /// <summary>
    /// 定义一个引用类型,数据会存在内存堆上
    /// </summary>
    internal class MyClass
    {
        public int Val = 20;
    }

    internal class Program
    {
        
        static void Main(string[] args)
        {
            Console.WriteLine("--------普通参数调用-------------");
            Test1();
            Console.WriteLine("--------引用参数调用-------------");
            Test2();
            Console.WriteLine("--------输出参数调用-------------");
            Test3();
        }

        #region 普通参数
        /// <summary>
        /// 将参数中的值+5
        /// </summary>
        /// <param name="f1">引用类型,内存堆</param>
        /// <param name="f2">值类型,内存栈</param>
        static void MyMethod(MyClass f1, int f2)
        {
            f1.Val = f1.Val + 5;
            f2 = f2 + 5;
        }

        private static void Test1()
        {
            var a1 = new MyClass();
            var a2 = 10;
            //a1中val初始化20,a2初始化10
            MyMethod(a1, a2);
            Console.WriteLine(a1.Val);
            Console.WriteLine(a2);
            //输出结果 25,10
            //引用类型受到了方法的影响,值类型没有收到影响
            Console.ReadKey();
        }
        #endregion

        #region 引用参数
        /// <summary>
        /// 将参数中的值+5
        /// </summary>
        /// <param name="f1">引用类型,内存堆</param>
        /// <param name="f2">值类型,内存栈</param>
        static void MyMethod(ref MyClass f1, ref int f2)
        {
            f1.Val = f1.Val + 5;
            f2 = f2 + 5;
        }
        private static void Test2()
        {
            var a1 = new MyClass();
            var a2 = 10;
            //a1中val初始化20,a2初始化10
            MyMethod(ref a1, ref a2);
            Console.WriteLine(a1.Val);
            Console.WriteLine(a2);
            //输出结果 25,10
            //引用类型受到了方法的影响,值类型没有收到影响
            Console.ReadKey();
        }
        #endregion

        #region 输出参数
        /// <summary>
        /// 将参数中的值+5
        /// </summary>
        /// <param name="f1">引用类型,内存堆</param>
        /// <param name="f2">值类型,内存栈</param>
        static void MyMethod2(out MyClass f1, out int f2)
        {
            //out参数必须在方法内对其进行赋值
            f1 = new MyClass {Val = 25};
            f2 = 15;
        }
        private static void Test3()
        {
            MyClass a1;
            int a2;
            //out的参数不能在方法外初始化
            MyMethod2(out a1, out a2);
            Console.WriteLine(a1.Val);
            Console.WriteLine(a2);
            //输出结果 25,10
            //引用类型受到了方法的影响,值类型没有收到影响
            Console.ReadKey();
        }
        #endregion
    }
}
View Code

普通参数

ref引用参数

out输出参数

猜你喜欢

转载自www.cnblogs.com/tanfuchao/p/8976240.html