ref out param 区别

ref out param 区别

大家好,又见面了,我是全栈君。

如果在方法声明参数中未使用ref或out关键字,在方法中更改参数的值,当控制传递回调用过程时,不会保留更改的值;我们可以通过方法参数关键字,更改这种行为。
1.ref
2.out
3.params

ref和out关键字都可以使参数按引用传递,当控制权传递回调用方时,在被调方法中对参数所做的任何修改都将反映在该变量中,在使用时,都要求方法定义和调用方法显式使用ref或out关键字,但是它们有如下的几个区别:
a.当使用ref关键字时,传递到ref参数的变量必须事先初始化,而与 out不同,out 的参数在传递前不需要初始化,请看示例:
 static void Main(string[] args)
        {

            string aa = “0”;  //传递给ref参数前,必须先初始化
            TestRef(ref aa);
            Console.WriteLine(aa);

         }
  public static void TestRef(ref string refTest)
        {

            refTest = “1”;
         }
结果输出 “1”

 static void Main(string[] args)
        {

            string aa;  //传递给out参数前,不必先初始化
            TestRef(out aa);
            Console.WriteLine(aa);
         }
 public static void TestRef(out string refTest)
        {

            refTest = “1”;
         }
结果输出”1″
ref和out在运行时的处理方式不同,但是在编译的时候的处理方式确实相同的,所以下面的两个函数是相同的
public void SampleMethod(ref int i) {  }
public void SampleMethod(out int i) {  }

在使用ref或out传递数组参数时,我们也要注意:
使用out传递时,在被调用方法中需要对数组进行赋值,这个是需要注意的地方;使用ref时,和上述的要求一样,需要先进行初始化,即由调用方明确赋值,所以不需要由被调用方明确赋值,请看代码:
  static void Main(string[] args)
        {

            string[] aa =null;//明确赋值
            TestRef(ref aa);
            Console.WriteLine((aa!=null&&aa.Length>0)?aa[0]:”null”);
  
        }
 public static void TestRef(ref string[] refTest)
        {

           //这里不要明确赋值
            if (refTest != null)
            {

                if (refTest.Length > 0)
                {

                    refTest[0] = “A”;
                }
            }
            
        }

 static void Main(string[] args)
        {

            string[] aa ;//
            TestRef(out aa);
            Console.WriteLine((aa!=null&&aa.Length>0)?aa[0]:”null”);
  
        }
        public static void TestRef(out string[] refTest)
        {

            refTest = new string[] { “a”, “b”, “c”, “d” }; //由于out参数不需要在传递前进行初始化,这里需要对对参数进行赋值
            if (refTest != null)
            {

                if (refTest.Length > 0)
                {

                    refTest[0] = “A”;
                }
            }
         }

使用out参数,我们可以让方法有多个返回值,如:
 static void Method(out int i, out string s1, out string s2)
    {

        i = 44;
        s1 = “I’ve been returned”;
        s2 = null;
    }
    static void Main()
    {

        int value;
        string str1, str2;
        Method(out value, out str1, out str2);
        // value is now 44
        // str1 is now “I’ve been returned”
        // str2 is (still) null;
    }

params关键字:
params 关键字可以指定在参数数目可变处采用参数的方法参数,在使用时要注意几点:
1.在方法声明中的params关键字后,不允许再出现其他参数
2.在方法声明中只允许使用一个params关键字

 static void Main(string[] args)
        {

           
 TestParams(1, “a”, “cc”);//方式1
            object[] obj = new object[] {1,”a”,”c” };//数组也可以传递过去,只要类型匹配
            TestParams(obj);
         }

 public static void TestParams(params object[] para)
        {

            for (int i = 0; i < para.Length; i++)
            {

                Console.WriteLine(para[i]);
            }
        }



本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2011/11/15/2249873.html,如需转载请自行联系原作者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108027.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 为什么你学不过动态规划?告别动态规划,谈谈我的经验[通俗易懂]

    为什么你学不过动态规划?告别动态规划,谈谈我的经验[通俗易懂]动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看0-1背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验对于动态规划,春招秋招时好多题都会用到动态…

    2022年10月29日
  • IDEA这些既好用又好玩的三十多个宝贝插件你还不知道吗?「建议收藏」

    小编整理的一些好用的有趣的插件如果有什么问题,欢迎大家评论,群文件也有这些IDEA插件QQ交流群:99979568IDEA下载插件教程如果无法在线下载插件,文末有我下载好的安装包,以及安装包安装的教程强烈推荐的插件PresentationAssistant快捷键展示Codota代码智能提示AlibabaJavaCodeGuidelines—阿里巴巴Java代码规范Translation-必备的翻译插件SequenceDiagra.

    2022年4月8日
  • npn饱和截止放大怎么判断_二极管饱和状态

    npn饱和截止放大怎么判断_二极管饱和状态幼儿园水平理解三极管截止、放大和饱和状态!书上看不懂,听课听不懂的过来!绕不开的三极管结构以NPN为例,晶体三极管的结构,这是很多人不想看的,但是确实是非常重要的!不看结构是理解不了工作原理的!(这样记忆:N是negative,负,代表多子为电子;P是positive,正,代表多子为空穴)注意观察三极管的结构,有助于理解工作时的状态。两张图结合起来看,略作解释:1.图中空心为空穴带正…

    2022年9月10日
  • 华为HarmonyOS开发者日(华为手机的开发者选项在哪里)

    今年9月的华为开发者大会HDC2020上,华为发布了面向全场景的分布式操作系统HarmonyOS2.0。这款操作系统一经发布便获得了业内的热切关注,在开源社区更是掀起了一股讨论的热潮。…

    2022年4月14日
  • 关于FIONREAD命令的作用[通俗易懂]

    关于FIONREAD命令的作用[通俗易懂]当在ioctl里使用FIONREAD时,除了获得所指定的读缓存大小以外,还有清除设备准备就绪状态的作用.代码CodehighlightingproducedbyActiproCodeHig

    2022年7月3日
  • 如何学习Android开发编程-初学者的5个步骤

    如何学习Android开发编程-初学者的5个步骤如何学习Android开发编程-初学者的5个步骤在本文中,您将发现如何学习Android开发编程。了解如何成为一名Android开发人员,并按照以下5个步骤操作。您是否想学习Android?如果是,但您不知道如何操作,则此文章适合您。它将帮助您以Android开发人员的身份开始冒险。准备?321如何学习Android开发-初学者的6个关键步骤1.看看…

    2022年5月10日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号