一、out参数实例

【实例】求一个数组中的最大值、最小值、总和、平均值

  class Program
{
static void Main(string[] args)
{
//写一个方法 求一个数组中的最大值、最小值、总和、平均值
int[] nums = { 1, 2, 3, 4, 5, 6 ,7};
int max;
int sum;
int min;
int avg;
bool b;
string s;
double d;
GetValue(nums, out max, out min, out sum, out avg,out b,out s,out d);
Console.WriteLine("数组中的最大值:{0},最小值:{1},总和:{2},平均值:{3}",max ,min,sum,avg);
Console.WriteLine("输出out参数的方法不同类型的值:{0},{1},{2}",b,s,d);
Console.ReadKey();
}
/// <summary>
/// 求一个整数的数组的最大值,最小值,总和,平均值
/// </summary>
/// <param name="nums">要求值的数组</param>
/// <param name="max">返回的最大值</param>
/// <param name="min">返回的最小值</param>
/// <param name="sum">返回的总和</param>
/// <param name="avg">返回的平均值</param>
public static void GetValue(int[] nums, out int max, out int min, out int sum, out int avg, out bool b,out string s,out double d)
{
//out参数要求在方法的内部必须为其赋值
max = nums[0];
min = nums[0];
sum = 0;
for (int i = 0; i < nums.Length; i++)
{
if (nums[i]>max)
{
max = nums[i];
}
if (nums[i]<min)
{
min = nums[i];
}
sum += nums[i];
}
avg = sum / nums.Length; b = true;
s = "123";
d = 3.13;
}
}

执行代码输出结果,如图所示:

总结:

如果一个方法中,返回多个相同类型的值时候,我们可以考虑返回一个数组。但是返回多个不同类型的值时候,返回数组就不行,那么这个时候,我们可以考虑用out参数。

out参数就侧重于一个方法可以返回多个不同类型的值。

二、ref参数的实例

【实例】使用方法来交换两个int类型的变量

 class Program
{
static void Main(string[] args)
{
//使用方法来交换两个int类型的变量
int n1 = 10;
int n2 = 20;
Test(ref n1, ref n2);
Console.WriteLine("两个值互相交换后n1为{0},n2为:{1}",n1,n2);
Console.ReadKey();
}
public static void Test(ref int n1,ref int n2)
{
int temp = n1;
n1 = n2;
n2 = temp;
}
}

执行代码输出结果,如图所示:

总结:

ref参数能够将一个变量带入一个方法中进行改变,改变完成后,再将改变后的值带出方法。

 ref参数要求在方法外必须要赋值,而方法内可以不赋值。

三、params可变参数

【实例】求任意长度数组的和 整数类型的

 class Program
{
static void Main(string[] args)
{
//求任意长度数组的和 整数类型的
int[] nums = { 1, 2, 3, 4, 5, 6 };
int sum = GetSum(8,9);
Console.WriteLine(sum);
Console.ReadKey();
}
public static int GetSum(params int[] nums)
{
int sum = 0;
for (int i = 0; i < nums.Length; i++)
{
sum += nums[i];
}
return sum;
}
} 

执行代码输出结果,如图所示:

如图所示:

 总结:

将实参数列表中跟可变参数数组类型一致的元素都当做数组的元素去处理

params可变参数必须是形参列表中的最后一个元素,并且在方法声明中只允许一个params关键字。

四、out 与ref的区别

区别:

1.使用ref参数时,传入的参数必须被初始化,对out而言,必须在方法中对其完成初始化。

2.使用ref参数和out参数时,在方法的参数和执行方法时,都要加ref或者out关键字。

3.out参数适合用在需要return多个返回值的地方,而ref参数则用在需要被调用的方法修改调用者的引用的时候。

如图所示:

out参数

ref参数

ref关键字是需要先初始化传入的参数,才能够使用。

C# 方法的out、ref、params参数的更多相关文章

  1. 【又长见识了】函数传参,params参数,ref和out参数详解

    一.原来函数这样传参 先看一个函数和函数调用. static void Main(string[] args) { ; Test(num);//局部变量在使用之前赋值 //Test(10); //直接 ...

  2. params参数的调用

    namespace params参数的用法 { class Program { public static void Test(string name,params int[] score) { ; ...

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

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

  4. c#中的ref、out、params参数

    out参数 与c++的引用的对比 out参数可以用来传递方法返回值,与c++中的引用有点像,但是还有有些不同: - 调用方法的时候必须写out参数 - 调用方法之前必须先分配空间 - 调用方法之前不用 ...

  5. C#学习笔记13:静态方法、方法重载和ref、out参数

    静态方法 调用:如果你写的方法和Main()方法在同一个类中,直接写方法名. 如果不在一个类中,需要类名.方法名(); 非静态方法: 调用:创建一个类的对象  对象名.方法名(); Person pe ...

  6. C# 中out,ref,params参数的使用

    C#中有三个高级参数,分别是out,ref,params:   1.out参数 方法使用return 只能返回一个值(一个数值或一个指针值),out参数可以帮助我们在一个方法中返回多个值,不限类型. ...

  7. C#高级参数out,ref,params

    在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? out 当需要返回一系列返回值时可用out高级 ...

  8. 含有ref out 参数 的方法反射 Emit 与 普通

    反射中很多朋友应该屡屡被带有ref out参数的方法折腾 当使用正常反射一个方法时候: 代码如下调用一个后期绑定方法MakeByRefType 就行了 MemberInfo test = typeof ...

  9. axios中get请求的params参数中带数组的处理方法

    axios中get请求的params参数中带数组时导致向后台传参失败报错:from origin 'http://localhost:8080' has been blocked by CORS po ...

  10. C#中in,out,ref,params的作用和区别

    ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键 ...

随机推荐

  1. Web前端基础(4):CSS(一)

    1. CSS介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度描述页面结构. CSS:层叠样式表.从审美的角度负责页面样式. JS:JavaScript .从交互的角度描述页面行为 ...

  2. 裸奔的支付X聊天,你还敢用吗?

    - 语音消息 使用HTTP明文传输,没有任何加密措施,使用域名为up-mayi.django.t.taobao.com,从报文中可以看出,语音消息是以文件形式在网络中传输的,下图为一次语音的发送传输过 ...

  3. 真机调试(A valid provisioning profile for this executable was not found.)

    这个问题是因为provisioning的问题,因为真机没有加入到账号下面的原因 解决步骤 1.吧identifier复制然后再平开开发中心 2.点击+号添加设备保存 3.在develope中选中保存即 ...

  4. Linux—网络防火墙详解

    一.防火墙基本知识 二.firewall防火墙 # 安装firewalld [root@localhost ~]# apt-get install firewalld [root@localhost ...

  5. JDK、JVM、JRE关系

    开始第一个Java程序 *保证计算机当中已经安装了文本编辑器EditPlus *安装JDK[JDK一般需要从oracle的官网下载],我们这里先用的JDK7 *在安装JDK的时候有jre JDK开发需 ...

  6. vue项目关闭eslint校验

    [前言] eslint是一个JavaScript的校验插件,通常用来校验语法或代码的书写风格.这篇文章主要介绍了vue项目关闭eslint校验,需要的朋友可以参考下 [主体] 简介eslint esl ...

  7. strcpy&memcpy&memmove

    strcpy extern char *strcpy(char *dest,char *source); { assert((dest!=NULL)&&(source!=NULL)); ...

  8. Mybatis工作原理(九)

    mybatis工作流程: (1) SqlSessionFactoryBuilder 从 XML 配置文件或通过Java的方式构建出 SqlSessionFactory 的实例. (2) SqlSess ...

  9. opencv读取USB相机select timeout问题

    现象: 树莓派4b或3b+   插着两个USB免驱相机 摄像头朝着灯就会报 time out 摄像头不朝着灯就不报 问题: 功率不够 朝着灯可能触发了USB相机的曝光补偿导致功率变大 解决: 使用带额 ...

  10. <Tree> 298 250 366 199(高频) 98(高频)

    298. Binary Tree Longest Consecutive Sequence 先序遍历,根左右.如果该节点的 value == 父节点value + 1, 则长度+1; 否则重置为1. ...