C#的参数类型:params、out和ref

parmas类型的参数

 1 using System;
 2 public class MyClass
 3 {
 4     public static void UseParams(params int[] list)
 5     {
 6         for (int i = 0 ; i < list.Length; i++)
 7         {
 8             Console.WriteLine(list[i]);
 9         }
10         Console.WriteLine();
11     }
12     public static void UseParams2(params object[] list)
13     {
14         for (int i = 0 ; i < list.Length; i++)
15         {
16             Console.WriteLine(list[i]);
17         }
18         Console.WriteLine();
19     }
20     static void Main()
21     {
22         UseParams(1, 2, 3);
23         UseParams2(1, ‘a‘, "test");
24         int[] myarray = new int[3] {10,11,12};
25         UseParams(myarray);
26     }
27 }

上面的代码运行后将会输出

1
2
3

1
a
test

10
11
12

当需要传递多个参数,或参数个数不定的时候,就可以用params类型的参数。

params类型的参数搭配数组使用,实现一个不定长的数组参数 
最常用的应该是Console.WriteLine,其中有一个重载如下: 
public static void WriteLine(string FormatString, params object[] values); 
常见的调用方式:Console.WriteLine("宽:{0},高:{1}",this.Width,this.Height); 
前面的"宽:{0},高:{1}"被装入FormatString 
this.Width,this.Height被装入values[0]和values[1]之中,如果我们再加几个参数上去,那将按下标继续存入数组中

ref关键字

ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:

 1 class RefExample
 2 {
 3     static void Method(ref int i)
 4     {
 5         i = 44;
 6     }
 7     static void Main()
 8     {
 9         int val = 0;
10         Method(ref val);
11         // val is now 44
12     }
13 }

传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化。

如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两个参数,则可以进行重载,如下例所示:

class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}

属性不是变量,因此不能作为 ref 参数传递。

ref类型的参数是指在将一个变量做为一个参数传递给某个方法的时候,使用引用传递。 
如果变量是值类型的话,ref和out起的效果是一样,只是ref参数在使用前必须先赋值,而out不用。 
定义方法: 
void Test(ref int v1,ref float v2) 

  v1 = 1; 
  v2 = 0.5f; 

调用方法: 
int a = 0; 
float b = 0; 
Test(ref a,ref b); 
---------------------无敌分隔线--------------------- 
ref比较容易混淆的地方在于如果参数是引用类型的变量时,处理的结果与直接传一个引用类型变量有什么区别? 
测试类: 
public class Class1 

  public int X = 0; 
  public int Y = 5; 

定义方法: 
private void Test(Class1 c) 
{//直接传引用类型 
  c.Y = 10; 
  c.X = 10; 
  //非ref传递,这句改不了引用的内存空间 
  c = new Class1(); 

private void Test(ref Class1 c) 
{//通过ref传引用,允许被调用的方法修改 该引用 所 引用的对象,因为引用本身是按引用来传递的。 
  c.Y = 10; 
  c.X = 10; 
   
  //c通过ref传递,这里c会变成一个新的Class1 
  c = new Class1(); 

调用方法: 
Class1 a = new Class1(); 
Test(a); 
Console.WriteLine("X:{0},Y:{1}",a.X,a.Y); 
Class1 b = new Class1(); 
Test(ref b); 
Console.WriteLine("X:{0},Y:{1}",b.X,b.Y); 
输出结果: 
X:10,Y:10 
X:0,Y:5 
通过输出结果我们可以看到使不使用ref的区别 
用ref的话,c可以更改指向,从而放弃它原来所引用的那块内存空间 
如果不用的话,只能改c内存空间中的数据,不可以更改指向。

out关键字

out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。例如:

 1 class OutExample
 2 {
 3     static void Method(out int i)
 4     {
 5         i = 44;
 6     }
 7     static void Main()
 8     {
 9         int value;
10         Method(out value);
11         // value is now 44
12     }
13 }

尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。

属性不是变量,因此不能作为 out 参数传递。

out类型的参数做为输出参数使用,用于一个方法返回多个值类型的变量,一般对值类型使用。 
定义方法: 
void Test(out int v1,out float v2) 

  v1 = 1; 
  v2 = 0.5f; 

调用方法: 
int a; 
float b; 
Test(out a,out b); 
基本上和Sql Server的output参数一样

以上内容引自微软MSDN

时间: 2024-10-05 21:51:10

C#的参数类型:params、out和ref的相关文章

问题:C# params类型参数;结果:C#的参数类型:params、out和ref

C#的参数类型:params.out和ref PS:由于水平有限,难免会有错误和遗漏,欢迎各位看官批评和指正,谢谢~ 首先回顾一下C#声明一个方法的语法和各项元素,[]代表可选 [访问修饰符] 返回值 方法名([参数类型] 数据类型 参数名) {方法体} 这篇文章主要是为了讲解 参数表里面的可选项[参数类型],这个参数类型的设置会影响到我们对参数施加操作后的结果或影响我们对方法的调用方式. C#之中参数类型分为4种: 无:默认的,普通参数 params:不定长参数 out:输出变量 ref:引用

out参数,ref参数,params参数数组

params参数数组 params关键字可以为方法指定数目可变的参数.params关键字修饰的参数,可以传入任意数目的同类型参数,甚至可以不传入参数. 不过params修饰的参数必须是方法的最后一个参数,并且一个方法只能有一个params修饰的参数. 示例 public class MyClass { public static void UseParams(params int[] list) { for (int i = 0; i < list.Length; i++) { Console.

固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型

一.Convert类常用的类型转换方法Convert.ToInt32() 转换为整型(int)Convert.ToChar() 转换为字符型(char)Convert.ToString() 转换为字符串型(string)Convert.ToDateTime() 转换为日期型(datetime)Convert.ToDouble() 转换为双精度浮点型(double)Conert.ToSingle() 转换为单精度浮点型(float) 二.运算符算术运算符 + - * / %逻辑运算符 & | ^

C#方法的参数类型

在C#中,方法的参数类型有四种: 值类型 引用类型 输出类型 数组型参数 值参数: 所谓值参数,就是利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并将此拷贝传递给该方法,这样做的结果就是被调用的方法不会修改实参的值,保证了实际值的安全,在调用方法时,如果形参的类型时值类型的话,必须保证实参的类型也是值类型的数据. 例子: public class MyClass { public MyClass() { // //TODO: 在此处添加构造函数逻辑 // } public void Ch

Python 函数参数类型大全(非常全!!!)

Python 函数参数类型大全(非常全!!!) 1.在python编写程序里面具有函数文档,它的主要作用是为了让别人可以更好的理解你的函数,所以这是一个好习惯,访问函数文档的方式是: MyFunction.__doc__ 2.python编写程序函数的时候具有两类参数: 形式参数(形参)及其实际参数(实参). 跟绝大部分编程语言一样,形参指的是函数创建和定义过程中小括号里的参数,而实参指的是函数在调用过程中传递进去的参数. 3.关键字参数,是指函数在调用的时候,带上参数的名字去指定具体调用的是哪

Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化,struts2的文件上传下载. 把这几个功能都学会了使用之后,struts2基本上就学完了.所以接下来的文章就是对这几个功能进行讲解.如何使用.

第一个app-进阶:1、让EditText屏蔽软键盘仍能光标闪动:2、EditText 的inputType参数类型(密码方式-隐藏显示、只允许输入数字等等)

EditText屏蔽软键盘后,光标消失问题 开始我有个需求:屏蔽系统软键盘 于是找到并使用这个方法: //edit_text1.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出//edit_text2.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出//edit_text3.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出 让三个EditText都成功地没有软键盘弹出. 后来我

LoadRunner压力测试之Unique Number参数类型、Random Number参数类型浅析

前几天工作需要用LoadRunner进行压力测试,期间对手机号进行参数化设置. 当时选用了<Value>137{Random_quhao}{Unique_weiyi}</Value>模式,Random Number.Unque Number参数类型选择如下: Parameter type Random Number Unique Number Number(Block size per) 9999 9999 Sample 0001 0001 Number %04lu %04d Up

python的参数类型

转:http://blog.useasp.net/archive/2014/06/23/the-python-function-or-method-parameter-types.aspx Python中函数的参数有4种形式,分别是: 位置或关键字参数(Positional-or-keyword parameter) 仅位置的参数(Positional-only parameter) 任意数量的位置参数(var-positional parameter) 任意数量的关键字参数(var-keywo