如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。

params

params 关键字可以指定在参数数目可变处采用参数的方法参数。

  1. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。

示例

字面意思比较难懂,所以看示例很有用。

// keywords_params.cs

using System;

class App
{
    public static void UseParams(params object[] list)
    {
        for (int i = 0; i < list.Length; i++)
        {
            Console.WriteLine(list[i]);
        }
    }

    static void Main()
    {
        // 一般做法是先构造一个对象数组,然后将此数组作为方法的参数
        object[] arr = new object[3] { 100, 'a', "keywords" };
        UseParams(arr);

        // 而使用了params修饰方法参数后,我们可以直接使用一组对象作为参数
        // 当然这组参数需要符合调用的方法对参数的要求
        UseParams(100, 'a', "keywords");

        Console.Read();
    }
}

ref

ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

  1. 若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
  2. 传递到 ref 参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。
  3. 属性不是变量,因此不能作为 ref 参数传递。
  4. 尽管 ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的。如果尝试这么做,将导致不能编译该代码。
  5. 如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载。

示例

按引用传递值类型是有用的,但是 ref 对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。

// keywords_ref.cs

using System;

class App
{
    public static void UseRef(ref int i)
    {
        i += 100;
        Console.WriteLine("i = {0}", i);
    }

    static void Main()
    {
        int i = 10;

        // 查看调用方法之前的值
        Console.WriteLine("Before the method calling: i = {0}", i);

        UseRef(ref i);

        // 查看调用方法之后的值
        Console.WriteLine("After the method calling: i = {0}", i);
        Console.Read();
    }
}

/**//*
控制台输出:
Before the method calling : i = 10
i = 110
After the method calling: i = 110
*/

out

out 关键字会导致参数通过引用来传递。这与 ref 关键字类似。

与 ref 的不同之处:

  1. ref 要求变量必须在传递之前进行初始化。
  2. 尽管作为 out 参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。

示例

与 ref 示例不同的地方只要将 ref 改为 out,然后变量 i 仅需要声明即可。

static void Main()
{
    //int i = 10; 改为
    int i;
    //
}

C# 参考之方法参数关键字:params、ref及out相关推荐

  1. C# 参考之方法参数关键字:params、ref及out (收集)

    如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值.可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值.通过使用方法参数关键字,可以更改这种行为. params ...

  2. C#参考之方法参数关键字:params、ref及out

    params 使用 params 关键字可以指定采用数目可变的参数的方法参数. 可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组. 还可以不发送参数. 如果未发送任何参数,则 pa ...

  3. 方法参数关键字:params、ref及out

    如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值.可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值.通过使用方法参数关键字,可以更改这种行为. params ...

  4. c#方法参数:params

    使用 params 关键字可以指定采用数目可变的参数的方法参数. 参数类型必须是一维数组. 在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关 ...

  5. C# 编程入门第七课方法调用参数问题,方法标准,传递数组,返回数组,方法高级参数(out关键字参数,ref参数,params可变参数),方法重载,方法的递归,一些常用方法

    C# 编程入门第七课 文章目录 C# 编程入门第七课 1. 方法调用参数问题 2. 方法标准 3.传递数组,返回数组 4. 方法高级参数 4.1 out 关键字参数 4.2 ref 参数 4.3 pa ...

  6. c# 方法参数 传值or传引用?(ref,out,可变参数params,可选参数,命名参数)

    目录 一.方法参数的类型----值类型和引用类型 二.一些特殊的方法参数 1.引用参数---ref 2.输出参数---out 注意:ref和out的区别 3.可变参数/参数数组-----params ...

  7. c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)

    一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会对调用 ...

  8. C#学习笔记-方法参数params、ref和in、out

    目录 params 用法 ref 用法 按引用传递参数 引用返回值 引用局部变量 in 用法 特殊注意点 优势 out 用法 版本变迁信息 其他 ref.in和out三者异同 方法重载 C#中ref和 ...

  9. C#基础知识-方法参数Params、In、Ref、Out

    方法参数时可以使用的关键字: params 指定此参数采用可变数量的参数. in 指定此参数由引用传递,但只由调用方法读取. ref 指定此参数由引用传递,可能由调用方法读取或写入. out 指定此参 ...

最新文章

  1. Django中Ajax提交数据的CSRF问题
  2. php 策略模式实现原理,php 策略模式原理与应用深入理解
  3. 微信小程序实现点击不同view标签,移动到一行
  4. ftp 553 Could not create file
  5. sys.dm_exec_query_stats的total_worker_time的单位是微秒还是毫秒
  6. 深入理解ArrayList 和 LinkedList 区别
  7. python叮当猫代码_详细介绍一个利用html+css实现叮当猫的实例代码
  8. 最积阴德的4件事,哪怕做过一件,也会累积大功德!
  9. stata进行空间自相关检验
  10. 查看文件的MD5值得方法 (校验完整性)
  11. bootstrap框架中的分割线
  12. 浙江大学计算机学院复试拟录取名单,浙江大学计算机学院2015年考研复试拟录名单...
  13. 单Tomcat的多实例配置原理及应用
  14. MATLAB如何创建新文件夹-mkdir函数,如何进入指定文件夹-cd函数
  15. 服务器装win7无限重启吗,win7下机子无限重启解决办法
  16. BigDecimal 往左移动两位小数_移动信号灯
  17. 照片处理:PS三步轻松实现背景虚化
  18. 人工智能生态交易平台
  19. IO 扩展(串转并)-74HC595-16*16LED点阵实验
  20. 关于区块链概念的理解

热门文章

  1. java 扩展接口_详解常用的Spring Bean扩展接口
  2. 君君喂大象C语言答案,2017年北师大版二年级语文上册句子专项复习题及答案
  3. java model 封装_Java封装统一的Result Model案例
  4. c++思维导图_必看|用好思维导图,别神话思维导图
  5. c++ 三维数组 初始化_013 JAVA 多维数组及数组的拷贝、冒泡排序、二分法查找...
  6. Linux 把文件内容发送给用户,linux上给其他在线用户发送信息(wall, write, talk, mesg)...
  7. 2022中国素质教育行业报告
  8. 2022年中国在线视频行业研究报告
  9. 2021年国庆节旅游数据报告
  10. 计量科学大数据分级分类