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 参数,而另一个方法不采用这两个参数,则可以进行重载,如下例所示:

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 关键字。例如:

 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的更多相关文章

  1. 参数类型params

    params参数练习 namespace Test { class Program { static void Main(string[] args) { //params 构造函数声明数组,可变数组 ...

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

    C#的参数类型:params.out和ref PS:由于水平有限,难免会有错误和遗漏,欢迎各位看官批评和指正,谢谢~ 首先回顾一下C#声明一个方法的语法和各项元素,[]代表可选 [访问修饰符] 返回值 ...

  3. 【Unity|C#】基础篇(4)——函数参数类型(值参/ref/out/params)

    [学习资料] <C#图解教程>(第5章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...

  4. out参数,ref参数,params参数数组

    params参数数组 params关键字可以为方法指定数目可变的参数.params关键字修饰的参数,可以传入任意数目的同类型参数,甚至可以不传入参数. 不过params修饰的参数必须是方法的最后一个参 ...

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

    一.Convert类常用的类型转换方法Convert.ToInt32() 转换为整型(int)Convert.ToChar() 转换为字符型(char)Convert.ToString() 转换为字符 ...

  6. C#--方法的参数类型

    在C#中,方法的参数类型有四种: 值类型 引用类型 输出类型 数组型参数 值参数: 所谓值参数,就是利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并将此拷贝传递给该方法,这样做的结果就是被调用 ...

  7. C# 方法中的参数类型

    二.方法中的参数类型 1. 值参数 值参数是指不带修饰符只带数据类型的形参. 值参数在使用值向方法传递参数时,编译程序会把实参的值做一份拷贝,并且将此拷贝传递给该方法,被调用的方法不会修改内存中实参的 ...

  8. 如何将C++中的SOCKADDR_IN*参数类型转换成C#中的参数类型

    将C++中的参数类型SOCKADDR_IN*映射为C#中的IntPtr参数类型的示例代码如下: IntPtr ptrSockaddr = new IntPtr(); //ip地址 sockaddr_i ...

  9. struts2(二) 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

随机推荐

  1. 最快下载速度100Mbps!4G LTE技术全解析

    1导读,关于4G的几个关键概念 [PConline资讯]100Mbps下载速度是什么概念?比3G网速快50倍又是什么概念?比3G通信方式更灵活.通信频谱更宽绰.通信质量更高效.通信费用更便宜是怎样一个 ...

  2. Apache Hadoop 3.0新版本介绍及未来发展方向

    过去十年,Apache Hadoop从无到有,从理论概念演变到如今支撑起若干全球最大的生产集群.接下来的十年,Hadoop将继续壮大,并发展支撑新一轮的更大规模.高效和稳定的集群. 我们此次将向大家全 ...

  3. PmExceptionController

    package main.java.com.zte.controller.system; import java.util.ArrayList; import java.util.List; impo ...

  4. 设置/修改centos上的swap交换分区的方法

    设置centos上的swap交换分区的方法 作为linux世界里最稳定的服务器版本,rhas5一直有很大的应用面,之前一直关注的是freebsd,因为应用的需要,特别在配合mysql和oracle上r ...

  5. ssh之为什么要放弃ssh?

    本文经转载, 源出处不详.https://www.cnblogs.com/hackxiyu/p/6849085.html 最近听一些朋友说,招聘面试的很多人简历都差不多,大部分人的简历上面都写了熟悉s ...

  6. js学习笔记27----键盘事件

    键盘事件主要有2个: onkeydown : 键盘按下时触发,如果按下不抬起,那么会连续触发.   onkeyup : 键盘弹起时触发   不是所有元素都能接收键盘事件,只有能够响应用户输入的元素,换 ...

  7. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  8. JMeter UI 启动时报错

    Problem After running jmeter.bat command under Windows 7 with cmd  the following error is produced:W ...

  9. python添加tab键自动补全功能

    默认python是没有tab键补全功能的: >>> import tab Traceback (most recent call last): File "<stdi ...

  10. Android手机在不同分辨率情况下字体自适应大小

    两种解决方法: 一. 1.首先根据不同分辨率获取不同字体大小. 在RES里创建values-480x320/strings.xml 里面设置<dimen name="Text_size ...