c#中out、ref和params的用法与区别 params可以传不定长的参数
2010-12-16 11:45
633 查看
来自:http://congfeng02.javaeye.com/blog/435272
ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为
ref/out形式。两者都可以使函数传回多个结果。
两者区别:
两种参数类型的设计思想不同,ref的目的在于将值类型参数当作引用型参数传递到函数,是函数的输入参数,并且在函数内部的任何改变也
都将影响函数外部该参数的值;而out的目的在于获取函数的返回值,是输出参数,由函数内部计算得到的值再回传到函数外部,因此必须在
函数内部对该参数赋值,这将冲掉函数外部的任何赋值,使得函数外部赋值毫无意义。
表现为:
1、out必须在函数体内初始化,这使得在外面初始化变得没意义。也就是说,out型的参数在函数体内不能得到外面传进来的初始值。
2、ref必须在函数体外初始化。
3、两者在函数体内的任何修改都将影响到函数体外面。
例:
params 关键字可以指定在参数数目可变处采用参数的方法参数。
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
输出
1
2
3
1
a
test
10
11
12
ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为
ref/out形式。两者都可以使函数传回多个结果。
两者区别:
两种参数类型的设计思想不同,ref的目的在于将值类型参数当作引用型参数传递到函数,是函数的输入参数,并且在函数内部的任何改变也
都将影响函数外部该参数的值;而out的目的在于获取函数的返回值,是输出参数,由函数内部计算得到的值再回传到函数外部,因此必须在
函数内部对该参数赋值,这将冲掉函数外部的任何赋值,使得函数外部赋值毫无意义。
表现为:
1、out必须在函数体内初始化,这使得在外面初始化变得没意义。也就是说,out型的参数在函数体内不能得到外面传进来的初始值。
2、ref必须在函数体外初始化。
3、两者在函数体内的任何修改都将影响到函数体外面。
例:
using System; namespace ConsoleApplication1 { class C { public static void reffun(ref string str) { str += " fun"; } public static void outfun(out string str) { str = "test"; //必须在函数体内初始, 如无此句,则下句无法执行,报错 str += " fun"; } } class Class1 { [STAThread] static void Main(string[] args) { string test1 = "test"; string test2; //没有初始 C.reffun( ref test1 ); //正确 C.reffun( ref test2 ); //错误,没有赋值使用了test2 C.outfun( out test1 ); //正确,但值test无法传进去 C.outfun( out test2 ); //正确 Console.Read(); } } }
params 关键字可以指定在参数数目可变处采用参数的方法参数。
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
// cs_params.cs using System; public class MyClass { public static void UseParams(params int[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); } public static void UseParams2(params object[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); } static void Main() { UseParams(1, 2, 3); UseParams2(1, 'a', "test"); // An array of objects can also be passed, as long as // the array type matches the method being called. int[] myarray = new int[3] {10,11,12}; UseParams(myarray); } }
输出
1
2
3
1
a
test
10
11
12
相关文章推荐
- C#中ref、out类型参数的区别和params类型参数的用法
- C#中ref、out类型参数的区别和params类型参数的用法
- c#中out、ref和params的用法与区别
- c#中out、ref和params的用法与区别
- c#.net中参数修饰符ref,out ,params得区别
- c#.net中参数修饰符ref,out ,params得区别
- c#中out、ref和params的用法与区别
- c#中out、ref和params的用法与区别
- c#.net中参数修饰符ref,out ,params得区别
- c#.net中参数修饰符ref,out ,params得区别
- c#中out、ref和params的用法与区别
- c#.net中参数修饰符ref,out ,params的区别
- c#.net中参数修饰符ref,out ,params得区别?
- C#中参数修饰符ref和out以及params的区别
- c#.net中参数修饰符ref,out ,params得区别
- C#中参数修饰符ref,out ,params的区别
- C#中参数修饰符ref和out以及params的区别
- c#中out、ref和params的用法与区别
- c#中out、ref和params的用法与区别
- 在C#中关于传递参数ref和out分别有什么区别