如果在方法声明参数中未使用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]);
            }
        }

ref out param 区别相关推荐

  1. 浅谈ref与out区别

    今天又一次碰到了ref与out区别的问题,当初总认为自己学的还不错,但每次遇到后都要纠结一番,这次再次学习和巩固一下. MSDN中的定义: ref 关键字使参数按引用传递.其效果是,当控制权传递回调用 ...

  2. vue3 ref 和 reactive 区别

    前言 最近学习cloud项目,前端使用到 vue3 + ts 等技术,在写需求过程中遇到响应式数据问题,经百度查找相关笔记,在此记录一下,在实战中成长吧. 问题 出现的问题:定义一个默认数组并且 fo ...

  3. out和ref之间的区别

    首先:两者都是按引用传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空.这 ...

  4. c#中out和ref的使用区别 [转]

    ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点.使用ref前必须对变量赋值,out不用. out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都 ...

  5. C#中out和ref之间的区别【转】

    首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...

  6. C#中out和ref使用的区别

    看了网上许多关于out和ref关键字的使用介绍,自己为了方便记住,稍微简略总结了下两者的区别: a. 赋值: (1)ref要求变量使用前必须先赋值(2)out不必要,赋了也没关系,但会清零 b. 传出 ...

  7. html标签ref,HTML: param 标签

    在线示例 设置参数 "autoplay" 为 "true",音频载入后会自动播放: 示例html> 基础教程(nhooo.com) 注意: Interne ...

  8. ref和out区别总结

    ref:是必需要先初始化才能用,但调用时可以对它什么也不做. out:可以不初始化也能用,但调用时一定要对其赋值(即使已经初始化的也要赋值,哪怕是赋一个和原来一样的值). 转载于:https://ww ...

  9. C#中ref与out区别

    static void Main(string[] args){//out testint a, b;//out使用前,变量可以不赋值outTest(out a, out b);Console.Wri ...

最新文章

  1. solr怎么设置搜索结果排名靠前?
  2. MySQL前缀索引与覆盖索引:前缀索引对于索引精简 覆盖索引对于查询数据索引化
  3. 手游特效太多怎么办?这里有一份性能优化方案可参考
  4. Kafka系统的组件、角色以及和zookeeper的关系
  5. mysql改了排序规则不生效_Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题...
  6. SpringBoot之Dubbox
  7. 依赖反转原理,IoC容器和依赖注入:第1部分
  8. ExtJS用户带验证码登录页面
  9. 用户权限框架php,ThinkPHP5ACL用户权限模块用法详解
  10. pgAdmin4 CentOS7部署
  11. PHP 对接阿里云短信
  12. c语言put()用法,C++ get()和put()读写文件详解
  13. python中base函数_详细的python basemap中各函数的所有参量注释
  14. 阿里妈妈称日均覆盖人数破7000万
  15. 使用 var 关键字在 Java 中使用动态类型
  16. OutOfMemoryError的原因有哪些?怎么解决?
  17. 特斯拉、蔚来们狂奔,宝马们不想成为“诺基亚”
  18. 曲奇视频观看影视剧非常不错的一个平台app
  19. linux下wget通过代理下载(shadow-socks + privoxy)
  20. Codeforces Round #520 (Div. 2) C. Banh-mi

热门文章

  1. C语言实现hash/DJB2算法(附完整源码)
  2. C语言实现UDP网络通信(附服务端和客服端完整源码)
  3. C语言位、字节、半字、字的概念和内存位宽
  4. C++数据结构struct
  5. QT的QCommandLineParser类的使用
  6. C++ Lists(链表)
  7. 华为鸿蒙会选择开源吗,而华为已经承诺鸿蒙系统会彻底开源,鸿蒙是开源系统...
  8. python爬虫今日头条街拍美图开发背景_分析Ajax请求并抓取今日头条街拍美图:爬取详情页的url与实际页面上显示不符...
  9. CUDA ERROR: device-side assert triggered at解决
  10. kylin3.x安装,解决load hive表的时候提示shaded-guava问题