C#的参数类型:params、out和ref
parmas类型的参数
using System;
public class MyClass
{
public static void UseParams(params int[] list)
{
for (int i = ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}
public static void UseParams2(params object[] list)
{
for (int i = ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}
static void Main()
{
UseParams(, , );
UseParams2(, 'a', "test");
int[] myarray = new int[] {,,};
UseParams(myarray);
}
}
上面的代码运行后将会输出
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 关键字。例如:
class RefExample
{
static void Method(ref int i)
{
i = ;
}
static void Main()
{
int val = ;
Method(ref val);
// val is now 44
}
}
传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化。
如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两个参数,则可以进行重载,如下例所示:
{
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 关键字。例如:
class OutExample
{
static void Method(out int i)
{
i = ;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
尽管作为 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
C#的参数类型:params、out和ref的更多相关文章
- 参数类型params
params参数练习 namespace Test { class Program { static void Main(string[] args) { //params 构造函数声明数组,可变数组 ...
- 问题:C# params类型参数;结果:C#的参数类型:params、out和ref
C#的参数类型:params.out和ref PS:由于水平有限,难免会有错误和遗漏,欢迎各位看官批评和指正,谢谢~ 首先回顾一下C#声明一个方法的语法和各项元素,[]代表可选 [访问修饰符] 返回值 ...
- 【Unity|C#】基础篇(4)——函数参数类型(值参/ref/out/params)
[学习资料] <C#图解教程>(第5章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...
- out参数,ref参数,params参数数组
params参数数组 params关键字可以为方法指定数目可变的参数.params关键字修饰的参数,可以传入任意数目的同类型参数,甚至可以不传入参数. 不过params修饰的参数必须是方法的最后一个参 ...
- 固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型
一.Convert类常用的类型转换方法Convert.ToInt32() 转换为整型(int)Convert.ToChar() 转换为字符型(char)Convert.ToString() 转换为字符 ...
- C#--方法的参数类型
在C#中,方法的参数类型有四种: 值类型 引用类型 输出类型 数组型参数 值参数: 所谓值参数,就是利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并将此拷贝传递给该方法,这样做的结果就是被调用 ...
- C# 方法中的参数类型
二.方法中的参数类型 1. 值参数 值参数是指不带修饰符只带数据类型的形参. 值参数在使用值向方法传递参数时,编译程序会把实参的值做一份拷贝,并且将此拷贝传递给该方法,被调用的方法不会修改内存中实参的 ...
- 如何将C++中的SOCKADDR_IN*参数类型转换成C#中的参数类型
将C++中的参数类型SOCKADDR_IN*映射为C#中的IntPtr参数类型的示例代码如下: IntPtr ptrSockaddr = new IntPtr(); //ip地址 sockaddr_i ...
- struts2(二) 表单参数自动封装和参数类型自动转换
前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...
随机推荐
- vim+xdebug调试PHP
一.安装xdebug 1.编译安装xdebug,也可以使用pecl install xdebug wget http://xdebug.org/files/xdebug-2.3.2.tgz tar - ...
- Linux查看GPU信息和使用情况
Linux查看显卡信息: lspci | grep -i vga 使用nvidia GPU可以: lspci | grep -i nvidia [root@gpu-server-002 ~]# lsp ...
- inet_ntoa 的一个小问题
一个简单点的阻塞式tcp服务器如下所示: #include <stdio.h> #include <string.h> #include <sys/socket.h> ...
- zookeeper与kafka安装部署及java环境搭建(发布订阅模式)
1. ZooKeeper安装部署 本文在一台机器上模拟3个zk server的集群安装. 1.1. 创建目录.解压 cd /usr/ #创建项目目录 mkdir zookeeper cd zookee ...
- 解决Java“syntax error on token enum”问题
本来我的问题是jsp中变量名命名和保留关键字重复了,如下图.无意中又找到下面的问题和解决方案作为笔记. 解决方法:修改变量名. ==================================== ...
- hdu4135容斥原理 组合遍历
容斥原理实现的关键在于:组合遍历,即如何遍历2^n种组合. 容斥原理的三种写法: DFS 队列数组 位数组 #include<stdio.h> #include<iostream&g ...
- 安卓学习笔记:使用PopupWindow创建简单菜单
PopupWindow是一个弹出式窗口,它可以展示任意View.他会浮在当前窗口的上方展示. 下面看代码: public class MyActivity extends Activity { pri ...
- 转 虫师的selenium借助AutoIt识别上传(下载)详解
selenium借助AutoIt识别上传(下载)详解 2014-12-27 11:26 by 虫师, 755 阅读, 1 评论, 收藏, 编辑 AutoIt目前最新是v3版本,这是一个使用类似BAS ...
- redis 学习札记4-sortset
redis 学习笔记4--sortset redis学习笔记3--sortSet 终于到最后一个数据结构了,加油!! 整体结构图: http://dl.iteye.com/upload/picture ...
- sqlserver中将varchar类型转换为int型再进行排序的方法
sql中把varchar类型转换为int型然后进行排序,如果我们数据库的ID设置为varchar型的 在查询的时候order by id的话 如果我们数据库的ID设置为varchar型的 在查询的时候 ...