首页 > 代码库 > 值参数和引用参数

值参数和引用参数

值参数方法被调用时系统做如下操作:1.在栈中为形参分配空间;2.将实参的值复制给形参;在变量用作实参前,变量必须要被赋值(除非是输出参数),对于引用类型,变量可以被设置为一个实际的引用或null。
namespace ConsoleApplication1{    class A    {        public int val=10;    }    class Program    {        static void method(A obj2,int f1)        {            obj2.val = obj2.val + 5;            f1 = f1 + 3;            Console.WriteLine("{0} {1}", obj2.val,f1);        }        static void Main(string[] args)        {            A obj = new A();            int t = 13;            method(obj,t);            Console.WriteLine("{0} {1}", obj.val, t);            Console.ReadLine();        }    }}
技术分享技术分享
技术分享技术分享
技术分享
引用参数
使用引用参数时,必须在方法的声明和调用都使用ref修饰符。实参必须是变量,在用作实参前必须被赋值。如果是引用类型变量,可以赋值为一个引用或者null;对于值参数系统在栈上为形参分配内存,相反,引用参数具备以下特征:
1.不会为形参在栈上分配内存;
2.形参的参数名作为实参变量的别名,指向相同的内存位置。
class Program    {        static void method(ref A  obj2,ref int  f1)        {            obj2.val = obj2.val + 5;            f1 = f1 + 3;            Console.WriteLine("{0} {1}", obj2.val,f1);        }        static void Main(string[] args)        {            A obj = new A();            int t = 13;            method(ref obj,ref t);            Console.WriteLine("{0} {1}", obj.val, t);            Console.ReadLine();        }    }
技术分享
技术分享
引用类型作为值参数
对于一个引用类型对象,不管是将他作为值参数还是引用参数传递,我们都可以在方法内部修改他的成员值。
namespace ConsoleApplication1{ class A { public int val=10; } class Program { static void method(A obj2) { obj2.val = 5; Console.WriteLine("{0}", obj2.val); obj2 = new A(); Console.WriteLine("{0}", obj2.val); } static void Main(string[] args) { A obj = new A(); Console.WriteLine("{0}", obj.val); method(obj); Console.WriteLine("{0}", obj.val); Console.ReadLine(); } }}
技术分享
将引用类型的对象作为值参数传递,如果在方法内部创建一个新的对象赋值给形参,将切断形参和实参之间的联系,并且在方法结束后,新的对象也将不复存在。

  引用类型作为引用参数

namespace ConsoleApplication1{    class A    {        public int val=10;    }    class Program    {        static void method(ref A  obj2)        {            obj2.val = 5;            Console.WriteLine("{0}", obj2.val);            obj2 = new A();//此时分配的内存形参和实参都指向这一块内存,就算方法执行完后,也不会释放的,obj将指向这块内存            Console.WriteLine("{0}", obj2.val);        }        static void Main(string[] args)        {            A obj = new A(); //static void method(ref A  obj2){....}方法执行完后这个内存将会被垃圾收集器自动收集            Console.WriteLine("{0}", obj.val);            method(ref obj);            Console.WriteLine("{0}", obj.val);            Console.ReadLine();        }    }}
技术分享

 

 

 

值参数和引用参数