先看个例子
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 } }
普通参数
ref引用参数
out输出参数