c#开发园地

c#开发园地

管理
默认的函数传递参数是值传递,也就是传递实参的值。对于值类型,传递了内部值的一个副本,对于引用类型,传递了内部保存的指针(对象的地址)。
而ref/out关键字指定传递参数本身(也就是指向变量的指针),在函数中控制形参就和控制实参一样

而ref/out不是用装箱和拆箱实现的,因为每次装箱后的对象所在堆中地址都不相同。

函数的返回值是按照值传递的


而闭包(匿名函数/lambda表达式)内的方法体能直接捕获外界的变量并使用,这个捕获就是ref捕获(捕获变量所在的地址),任何对变量的改动都会直接改变捕获的变量本身,而这个变量因为被匿名函数中的同名变量引用,所以就算它所在的函数出了作用域,他还是会存在。但闭包不能捕获ref/out参数,因为闭包本身就是用ref/out的方式捕捉变量,而原本是ref/out的变量给闭包的只是本身的地址,而不是内部的值(这个才是ref/out变量引用的变量的地址)
比如在一个函数中,一个全局的委托变量关联了一个匿名函数,而匿名函数内部又捕获了这个函数的一个局部变量,就算这个函数执行完毕,这个局部变量也不会被销毁。

首先需要明确空数组的概念,空数组在内存中是存在的,只是没有项。而引用空数组的变量也不等于null
我们可以这样声明一个空整形数组 int[] x=new int[0];而用foreach遍历一个空数组是绝对安全的(不会运行到foreach内部)
用params关键字传递数组参数,可以保证对方函数在后台帮我我们建立一个数组,如果一个参数不传,就建立一个空数组

声明:
 void chl(params int[] b){
foreach(int x in b){//直接遍历数组,绝对安全,因为后台为我们智能生成数组,哪怕是一个空数组
内部代码
}
           }

使用  objectX.chi(1,2,3)   objectX.chi()   objectX.chi(2)   objectX.chi(1,2,3,3)   都是可以的,无论如何后台都会为我们生成数组,对于不确定要穿第几个参数,又不想生成一个数组传递的话,用params是最省力的。

关于params关键字使用要求 1,必须是最后一个参数2必须是一维数组3,不构成方法签名的一部分(不能做为重载的依据)4,不允许用ref/out修饰


ref/out参数可以通过方法无穷此传递,例如
        void mm()
        {int x = 12;
            n(ref x);
            Console.WriteLine(x.ToString());
            Console.Read();//输出14
        }
        void n(ref int x) { nn(ref x); }
        void nn(ref int x) { x = 14; }


posted on 2008-04-04 18:16  chl  阅读(417)  评论(0)    收藏  举报