C#中有三个高级参数,分别是out,ref,params:
 
1、out参数
  • 方法使用return 只能返回一个值(一个数值或一个指针值),out参数可以帮助我们在一个方法中返回多个值不限类型
  • 在使用out参数的时候需要注意
    • 在调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,赋值也会在方法中被覆盖掉。
    • 方法使用了out参数传递变量时,就是要返回值,所以必须在方法内为其赋值
    • 方法的参数使用out关键字修饰时,在调用该方法时,也要在out参数传递的变量前面加上out关键字才行。
static void Main(string[] args)
{
  // 使用out参数返回一个数组的最大值、最小值
  int[] nums = { , , , , , , , , };
  int max;
  int min;
  GetMaxMinSumAvg(nums, out max, out min);
  Console.WriteLine(max);
  Console.WriteLine(min);
  Console.ReadKey();
} public static void GetMaxMinSumAvg(int[] nums, out int max, out int min)
{
  max = ; // out参数传递的变量必须在方法内为其赋值
  min = ;
  if(nums.Length > )
  {
    for (int i =; i < nums.Length; i++)
    {
      if (nums[i] > max)
        max = nums[i];
      if (nums[i] < min)
        min = nums[i];
    }
  }
}
  • TryParse类型转换就使用out参数返回转换结果值:
Boolean int.TryParse(string s, out int result) // 将字符串转换为int类型,out传递的变量result为转换结果(若转换失败返回result为0)方法return Boolean 类型
自定义int.TryParse()方法
public static Boolean stringToInt(string s, out int result) {
  try
  {
    result = Convert.ToInt32(s);
    return true;
  }
  catch {
    result = ;
    return false;
  }
}

2、 ref参数

  • ref 关键字,和out一样,可以使得参数通过引用来传递。换句话说,ref能够让你直接对原来那个数进行操作,而不是将原数复制一份,对那个复制项进行操作。
  • ref参数的作用:
    • 与out不同的是,它可以双向传值,主要适用于场景内部对外部的值进行改变的情况。换句话说,ref参数侧重于将一个已经初始化了的变量以参数的形式带到一个方法中进行改变,改变完成后,再将改变后的值带出来。
    • ref的作用主要是让值类型或string这种特殊类型的引用类型能够像其他引用类型一样在方法中进行了值的改变,在方法结束之后,能够将值保存下来。
  • 在使用ref参数需要注意
    • ref参数传递的变量在传递之前一定要对其进行初始化赋值
    • 方法的参数使用ref关键字修饰时,在调用该方法时,也要在out参数传递的变量前面加上ref关键字才行。
    • 方法使用了ref参数传递变量时,不同于out,没有要求一定在方法中对ref所修饰的变量进行赋值,所以可以不赋值。  
static void Main(string[] args)
{
int count = ; // ref修饰的变量,必须对其赋初值
Add(ref count);
Console.WriteLine(count);
Console.ReadKey();
} public static void Add(ref int i){
i += ; // 不一定要赋值
}
3、 params可变参数
  • params 关键字可以使得在参数个数可变处采用参数的数组型参数,比如 int sum(params int[] values)。

  •  可变参数的作用:使得个数不确定的可变参数以数组的形式传递,适合于方法的参数个数未知的情况时,用于传递大量的数组集合参数。

  • 可变参数在使用时需注意:

    • 不允许将params修饰符与refout修饰符组合起来使用。

    • 当方法的参数列表中有多个参数时,params修饰的参数必须放在最后,不能放在前面,以免程序不好确定参数究竟有多少个而报错。比如:

      int Sum(int initial, params int[] arr)
    • 一个方法当然可以包含可变参数和不变参数,两个可以同时使用。

public static int Sum(int initial, params int[] arr){
int sum = initial;
for(int i = ; i < arr.Length; i++)
sum+=arr[i];
}
return sum;
}

C# 中out,ref,params参数的使用的更多相关文章

  1. params参数的调用

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

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

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

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

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

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

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

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

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

  6. c#中的Out, params,ref 细说并沉淀

    1. Out,params,ref之前先记录平时用的最多的按值传递参数的情况,当然默认情况下参数传入函数的默认行为也是按值传递的. 1: //默认情况下参数会按照值传递 2: static int a ...

  7. C#中的ref与out参数(本文仅作为个人笔记)

    假如一个方法的参数(形参)是引用类型,那么使用那个参数来进行的任何修改都会改变参数引用的数据.但这里的关键在于,虽然引用的数据发生了变化,但参数本生没有改变——它仍然引用的是一个对象.换句话说,虽然可 ...

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

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

  9. pytest--fixture基本使用(主要用来进行测试环境的初始化和清理,fixture中的params参数还可以用来进行参数化)

    fixture fixture修饰器来标记固定的工厂函数,在其他函数,模块,类或整个工程调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作. 方法: fixture(scope=" ...

随机推荐

  1. bootstrap模态框的调用

    1.<a href="JavaScript:void(0);" class="bs-tooltip remark-item" rel="{$bi ...

  2. Django入门指南-第10章:Django Admin 介绍(完结)

    在浏览器中打开该URL:http://127.0.0.1:8000/admin/ 我们可以检查一切是否正常,打开URL http://127.0.0.1:8000 我们首先创建一个管理员帐户: pyt ...

  3. LA 4329 Ping pong (树状数组)

    题意:从左到右给你n个不同的数值,让你找出三个数值满足中间的数值在两边的数值之间的个数. 析:题意还是比较好理解的,关键是怎么求数量,首先我们分解一下只有两种情况,一个是左边<中间<右边, ...

  4. ansible-api 调试

    使用api的时候有时候会遇到一些难以想象到的错误,可以通过以下几种方式来定位. 1.使用 自定义 callback class ResultCallback(CallbackBase): def v2 ...

  5. Windows could not set the offline local information.Error code:0X80000001解决方法

    我的笔记本是联想Y460(白色) 昨天在重装系统的时候遇到如下错误:Windows could not set the offline local information.Error code:0X8 ...

  6. git图解:代码区域总结

    本文背景,在实际项目中使用git已有一年多,发现不少同事虽然会使用常用git指令,但并不理解每个指令对应的作用原理.今天静下心总结下git 的基本理解:代码的存在区域:本文以实际项目出发,理清使用gi ...

  7. JavaScript面向对象编程[转]

    JavaScript面向对象编程 命名空间 命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能. 在JavaScript中,命名空间只是另一个包含方法,属性,对象的对 ...

  8. hdu 4981

    中位数是否大于平均数 水题 #include <cstdio> #include <cstdlib> #include <cmath> #include <c ...

  9. hdu 5001 从任意点出发任意走d步不经过某点概率

    http://acm.hdu.edu.cn/showproblem.php?pid=5001 给定n个点m条边的无向图问从任意点出发任意走d步,从不经过某个点的概率 本想先算路过每个点的概率然后用1减 ...

  10. springMVC 开涛 Controller接口控制器

    通过注解实现控制器类,所以不用看Controller接口了.把之前的笔记保存下. 笔记(图片):http://pan.baidu.com/s/1mgMNDna 第三章看不太懂,3.2 3.3.只了解到 ...