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

 

首先回顾一下C#声明一个方法的语法和各项元素,[]代表可选
[访问修饰符] 返回值 方法名([参数类型] 数据类型 参数名)
{方法体}

这篇文章主要是为了讲解 参数表里面的可选项[参数类型],这个参数类型的设置会影响到我们对参数施加操作后的结果或影响我们对方法的调用方式。

C#之中参数类型分为4种:
无:默认的,普通参数
params:不定长参数
out:输出变量
ref:引用传递

普通参数,当参数是值类型时传值,当参数为引用类型时传址,这个由于各类C#的书都一定会讲,此处略过。

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]之中,如果我们再加几个参数上去,那将按下标继续存入数组中

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参数一样

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内存空间中的数据,不可以更改指向。
 

时间: 2024-06-12 21:54:31

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

JQuery中Ajax()的data参数类型实例分析_jquery

本文实例分析了JQuery中Ajax()的data参数类型.分享给大家供大家参考,具体如下: 前面简单分析介绍了<ajax中data传参的两种方式>,对于ajax参数传递方式有了初步的了解,这里就来进一步分析一下ajax中data参数的类型. 假如现在有这样一个表单,是添加元素用的. <form id='addForm' action='UserAdd.action' type='post'> <label for='uname'>用户名</label>:&

java根据方法名称取得反射方法的参数类型示例_java

复制代码 代码如下: /** * 根据方法名称取得反射方法的参数类型(没有考虑同名重载方法使用时注意) * @param obj         类实例   * @param methodName  方法名 * @return * @throws ClassNotFoundException */public static Class[]  getMethodParamTypes(Object classInstance,  String methodName) throws ClassNotF

Python中实现参数类型检查的简单方法

  这篇文章主要介绍了Python中实现参数类型检查的简单方法,本文讲解使用装饰器实现参数类型检查并给出代码实例,需要的朋友可以参考下 Python是一门弱类型语言,很多从C/C++转过来的朋友起初不是很适应.比如,在声明一个函数时,不能指定参数的类型.用C做类比,那就是所有参数都是void*类型!void类型强制转换在C++中被广泛地认为是个坏习惯,不到万不得已是不会使用的. Python自然没有类型强制转换一说了,因为它是动态语言.首先,所有对象都从Object继承而来,其次,它有强大的内省

c++-qt中函数参数类型不同也能实现其功能?

问题描述 qt中函数参数类型不同也能实现其功能? 图中data为QByteArray类型,而函数原型为const char类型,broadcast为枚举类型,而函数原型为hostaddress类型.为什么不同也能够实现其功能呢? 解决方案 这里发生了隐式类型转换 QString raw_string = ""haasd123ha""; QByteArray byte_instrument = raw_string.toLocal8Bit(); const char

access-出现 ADODB.Recordset 错误 &amp;amp;#39;800a0bb9&amp;amp;#39;参数类型不正确

问题描述 出现 ADODB.Recordset 错误 '800a0bb9'参数类型不正确 index <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <% set rs=server.createobject("adodb.recordset") sql="select user,qq,email,content,data from main order by id desc&quo

instrumentation-关于返回参数类型 Motionevent

问题描述 关于返回参数类型 Motionevent public boolean TouchEvent(MotionEvent event); //这个是自己写的接口的方法 然后在try { Instrumentation instrumentation=new Instrumentation(); instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMi

struts2拦截器的问题获得的我拦截每个类下面每个方法的“参数类型”和“实参”

问题描述 struts2拦截器的问题获得的我拦截每个类下面每个方法的"参数类型"和"实参" 定义好struts2的全局拦截器之后 怎么在代码里面获得的我拦截每个类下面每个方法的"参数类型"和"实参"

new FileInputStream(file)参数类型报错

问题描述 new FileInputStream(file)参数类型报错 大侠们,我new一个FileInputStream的时候,传了一个File类型,但是myeclipse一直让我把参数类型改成String,我看FileInputStream类里有传File的构造方法啊,请问这是为什么??还是说不管他0.0 private void copy(File src,File dst){ InputStream in = null; OutputStream out = null; try { i

Python基本语法_函数属性 &amp;amp; 参数类型 &amp;amp; 偏函数的应用

目录 目录 前言 软件环境 Python Module的程序入口 函数的属性 Python函数的创建 函数的参数 必备参数 缺省参数 命名参数 不定长参数 匿名参数 偏函数的应用 前言 Python除了有丰富的标准库之外,还可以自己定义满足自身需求的类和函数.本篇主要介绍如何创建Python自定义函数. 软件环境 系统 UbuntuKylin 14.04 软件 Python 2.7.4 IPython 4.0.0 Python Module的程序入口 因为一个Python的程序文件同时也是一个模