C# 中 ref,out, params 解析

方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output ),数组参数(by array)。

传值参数无须额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。

例1:

public static void method(string x,ref string y,out string z)

{

x="我是传值类型";

y="我是传址类型,传入的参数必须先被初始化";

z="我是输出参数,必须在方法中对我完成初始化";

}

static void Main()

{

string a="传值类型",b="传址类型",c;

Console.WriteLine("before method call:a={0},b={1},c=未赋值",a,b);

method(a,ref b,out c);

Console.WriteLine("after method call:a={0},b={1},c={3}",a,b,c);

}

输出结果如下:

可以看到a的值始终不变,b和c的值改变了。

例2:

public static void bubble(int x,int y)
        {
            int temp = x;
            x = y;
            y = temp;
        }
        static void Main()
        {
            int a = 5, b = 6;
            bubble(a,b);
            Console.WriteLine("value is :a={0},b={1}",a,b);
        }

输出结果:

 public static void bubble(ref int x,ref int y)
        {
            int temp = x;
            x = y;
            y = temp;
        }
        static void Main()
        {
            int a = 5, b = 6;
            bubble(ref a,ref b);
            Console.WriteLine("value is :a={0},b={1}",a,b);
        }

输出结果:

用冒泡算法来看,很明显的,使用了ref关键字的函数调用以后,a的b的值变化了。而没有使用ref的没有变化。

例3:

        static string outvalue(out string name)
        {
            string name1 = "蜡笔小新";
            name = name1;
            string name2 = "小色鬼";
            return name2;
        }
        static void Main()
        {
            string name = "小新";
            Console.WriteLine("before call:{0}", name);
            string result = outvalue(out name);
            Console.WriteLine("after call:{0}", name);
            Console.WriteLine("finally return:{0}", result);
        }

输出结果:

例4:

static void pararry(params object[] list)
        {
            for (int i = 0; i < list.Length; i++)
            {
                Console.WriteLine(list[i]);
            }
        }
        static void array(object[] list)
        {
            foreach (object _list in list)
            {
                Console.WriteLine(_list);
            }
        }
        static void Main()
        {
            object[] arr = new object[] { 1, "a", "b" };
            pararry("a", "b", "c", "...", "n");//传递多个参数,多个object数组
            pararry(arr);//将数组arr作为值参数传递
            array(arr);//传递一个参数,这个参数是一个数组
        }     

输出结果:

注意:paras类型参数主要用于在对数组长度未知(可变)的情况下进行函数声明。在方法声明中只允许一个paras关键字,并且该关键字只能为最后一个。

总结:

通过引用传递参数允许函数成员更改参数的值,并保持该更改。

ref和out这两个关键字的区别是:

1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

ref、out与params,ref是引用方法内的参数影响结果;out是引用方法中参数返回结果到主方法;而params是将可变同类参数(即数组)传入参数。使用中ref用于需要调用引用方法内的数据的。out用于利用引用方法对主方法进行操作,而prarams用于参数长度未知的情况。

转自 http://blog.163.com/[email protected]/blog/static/801797122010815113152548/

时间: 2024-09-28 04:46:07

C# 中 ref,out, params 解析的相关文章

C# 中out,ref,params参数的使用

C#中有三个高级参数,分别是out,ref,params: 1.out参数 方法使用return 只能返回一个值(一个数值或一个指针值),out参数可以帮助我们在一个方法中返回多个值,不限类型. 在使用out参数的时候需要注意: 在调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,赋值也会在方法中被覆盖掉. 方法使用了out参数传递变量时,就是要返回值,所以必须在方法内为其赋值. 方法的参数使用out关键字修饰时,在调用该方法时,也要在out参数传递的变量前面加上out关键字才

Spring中&lt;ref local=&quot;&quot;/&gt;与&lt;ref bean=&quot;&quot;/&gt;区别

小 Spring中<ref local=""/>与<ref bean=""/>区别 (2011-03-19 19:21:58) 转载▼ 标签: 杂谈   <ref local="xx"/>  用"local"属性指定目标其实是指向同一文件内对应"id"属性值为此"local"值的索引"local"属性的值必须和目标bean的id属性

c#中ref,out篇

QQ:1187362408 欢迎技术交流和学习 c#中ref,out篇(ref和out): TODO: 1,熟悉c#中使用ref,out的使用 其中关于传值参数:无须额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符 params 其中关于tips:params类型参数主要用于在对数组长度位置(可变)的情况下进行函数声明,在方法声明中只允许一个params关键字,并且该关键字只能为最后一个 总结:通过引用传递参数允许函数成员更改参数的值,兵保存更改 2,ref和

Report_报表中Ref Cursor数据源的概念和用法(案例)

2014-06-22 BaoXinjian 一.摘要 在Report Builder中,有两种数据源取法,一种是基于SQL的,另外一种就是基于Ref Cursor的写法 Ref Cursor在Report Builder 中主要用于一些公用的查询会使用到 比如有多个Report可能会用到同一段SQL或者类似SQL,一般会将这个SQL独立出来作为Ref Cursor放在Package中 当Report调用时,就可以通过调用package中的ref cursor实现查询,而不是讲这段SQL每个rep

SSM-SpringMVC-12:SpringMVC中BeanNameViewResolver这种视图解析器

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 视图解析器,这个很熟悉啊,之间就用过,就是可以简写/和.jsp的InternalResourceViewResolver 我这次书写的BeanNameViewResolver就是另外一种视图解析器,他有优点,也有缺点,优点可以访问项目外部的网页,并且灵活性很好,缺点有,最后写完案例你就明白了 要说的有处理器中的方法 package cn.dawn.day08ViewResolver; import org.

c#中可变参数params关键字学习

引用 https://www.cnblogs.com/maowp/p/8134342.html 基础知识 1.概念 params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字. 2.注意项 1.若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后. 2.不允许将params修饰符与ref和out修饰符组合起来使用. 3.

微信中QQ表情的解析(php)

微信公众平台接受的消息中,标签是用'/:'开头的字符串表示的,假设要在网页上显示(比方制作微信大屏幕),就须要进行转换. 所以我向微信公众平台按顺序发送了各个QQ表情,在微信公众平台后台能够看到接受的表情会被解析成https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/0.gif 这种图片.所以自己写一套解析函数就可以. 在微信公众平台后台发现,腾讯自己干了一件错误的事情:有一些表情没有被正确解析,这些标签的特点是有括号.引號这种字

C#中ref和out的区别浅析

这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:       ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都必

ABP中动态WebAPI原理解析

ABP中动态WebAPI原理解析 动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能,这应该算是对DRY的最佳诠释了. 如下图所示,一行代码就为所有实现了IApplicationService的类型,自动创建对应的动态WebAPI. 这么Magic的功能是如何实现的呢? 本文为你揭开其Magic的外表.你会发现,实现如此Magic的功能,最关键的代码