码迷,mamicode.com
首页 > 其他好文 > 详细

值参数和引用参数

时间:2014-12-26 12:31:11      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:


值参数
方法被调用时系统做如下操作:
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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!