标签:
值参数 方法被调用时系统做如下操作: 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(); } } }
标签:
原文地址:http://www.cnblogs.com/leijiangtao/p/4186399.html