细讲C#中的ref与out的区别

很多时候参数按地址传递时加有OUT关键字,到底他和REF有什么区别呢?

好,我们直奔主题,ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。

使用ref前必须对变量赋值,out不用。


namespace test

{

    class Program

    {

         //一个 out 测试的静态方法
        static void outTest(out int x,out int y) {
            /*
            离开这个函数前,必须对x和y赋值,否则会报错。
             y=x
            上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使用过函数前赋值也不行
            */
            x = 1;
            y = 1;
        }

        //一个ref测试的静态方法(方法内没有任何处理)
        static void refTest(ref int x, ref int y) {}
        //一个ref测试的静态方法(方法内对x,y做个简单的处理)
        static void refTest2(ref int x, ref int y) {
            x = y;
        }

        static void Main(string[] args)
        {
            int a, b; //这两个初始化并没有赋值对不对
            outTest(out a,out b);
            Console.WriteLine("a={0};b={1}",a,b);
            //打印结果:a=1;b=1
            int c = 11, d = 22;//这两参数开始是有赋值的对不对
            outTest(out c, out d);
            Console.WriteLine("c={0};d={1}",c,d);
            //打印结果:c=1;d=1
            //现在开始ref
            int m, n;//这两个变量没有赋值,
            //现在我们调用refTest方法 看可不可以
            // refTest(ref m, ref n);  //抱错对不对,为什么,ref使用前,变量必须赋值
            int o = 11, p = 22;
            refTest(ref o, ref p);
            Console.WriteLine("o={0};p={1}",o,p);
            //打印结果:o=11;p=22
            int k = 11, j = 22;
            refTest2(ref k, ref j);
            Console.WriteLine("k={0};j={1}",k,j);
            //打印结果:k=22;j=22
            Console.ReadKey();
        }
    }
}
  • 所以他们的特点很明显
    1.out类型参数是按地址传递,能改变原来的数值,使用out传参前,对变量可以赋值也可以不赋值。带有out类型参数的函数, 会清空变量,所以在离开该函数的时候,所有out引用的变量都要赋值。
    2.ref类型参数是按地址传递,能改变原来的数值,使用ref传参前,变量必须赋值,带有ref类型参数的函数,不会清空变量,所以离开该函数的时候,所有ref引用的变量可以赋值也可以不赋值。
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. C++基础 大多数编程语言通过两种方式来进一步补充其基本特征1)赋予程序员自定义数据类型的权利,从而实现对语...
    王侦阅读 843评论 0赞 3
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,689评论 0赞 13
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,448评论 8赞 265
  • 一个优秀的麻木主义者。 我说过好的坏的一切我都接受,毫无色彩的接受,大可以猛烈地洒落让我尽快忘掉。我知道一切突然和...
    冰蛋不说话阅读 739评论 0赞 1
  • (一) 【走都走了 还回什么头】 十二月的北京已经冷的不像话,宽阔的道路两旁,树叶也散漫的掉了一地,刺骨的寒风吹的...
    阿拉灯神丁耶阅读 374评论 1赞 2

友情链接更多精彩内容