当前位置: 首页 > article >正文

C#方法参数修饰符ref/out/in/params

一.方法参数修饰符 ref

  • 用于参数声明,以按引用而不是按值传递参数
  • 实参必须初始化,然后才能传递。
  • 方法定义和调用均必须显式使用 ref 关键字。
  • ref 表示该方法可以读取或写入参数的值。
void Method(ref int refArgument)
{
    refArgument = refArgument + 44;
}

int number = 1;
Method(ref number);
Console.WriteLine(number);
// Output: 45

二.方法参数修饰符 out

  • 用于参数声明,以按引用而不是按值传递参数
  • 方法调用之前无需初始化参数。 方法内必须向参数赋值。
  • 方法定义和调用均必须显式使用 out 关键字
  • out 表示该方法设置参数的值
int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod);     // value is now 44

void OutArgExample(out int number)
{
    number = 44;
}

三.方法参数修饰符 in

  • 用于参数声明,以按引用而不是按值传递参数
  • 实参必须初始化。 方法内无法向参数赋值。
  • 方法得调用可以选择性包含 in 修饰符
  •  表示该方法可以读取但无法写入新值

使用 in 参数定义的方法可能会获得性能优化。 某些 struct 类型参数可能很大,在紧凑的循环或关键代码路径中调用方法时,复制这些结构的成本很高。 方法声明 in 参数以指定参数可能按引用安全传递,因为所调用的方法不修改该参数的状态。 按引用传递这些参数可以避免(可能产生的)高昂的复制成本。

void Method(in int value)
{
    Console.WriteLine(string.Format("in Method value is {0}", value));
}


int n1 = 1;
Method(in n1);
int n2 = 1;
Method(n2);

四.方法参数修饰符params

  • 用来表示被修饰参数的数量可变
  • params修饰在参数的前面且参数类型得是一维数组类型
  • params用法本质是语法糖,编译完成之后还是一个数组
  • 在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字
  • 使用 params 参数调用方法时,可以传入:

  1. 数组元素类型的参数的逗号分隔列表。
  2. 指定类型的参数的集合。
  3. 无参数。 如果未发送任何参数,则 params 列表的长度为零。
        static int Sum1(int[] array)             //数组参数
        {
            int sum = 0;
            for (int i = 0; i < array.Length; i++)
            {
                sum += array[i];
            }
            return sum;
        }
        static int Sum2(params int[] array)    //可变参数
        {
            int sum = 0;
            for (int i = 0; i < array.Length; i++)
            {
                sum += array[i];
            }
            return sum;
        }

        static void Main()
        {
            int sum1 = Sum1(new int[] { 1, 2 });
            Console.WriteLine(sum1);
            int sum2 = Sum2(1, 2, 3);
            Console.WriteLine(sum2);
            int sum3 = Sum2(new int[] { 1, 2, 3, 4 });
            Console.WriteLine(sum3);
            Console.ReadKey();
        }
        //output:
        //3
        //6
        //10


http://www.kler.cn/a/446008.html

相关文章:

  • MVVM、MVC、MVP 的区别
  • React:闭包陷阱产生和解决
  • 将4G太阳能无线监控的视频接入电子监控大屏,要考虑哪些方面?
  • 中化信息与枫清科技深化合作:共探“AI+”产业新生态
  • uniapp自定义树型结构数据弹窗,给默认选中的节点,禁用所有子节点
  • FingerprintJS的使用
  • 智能体实战(需求分析助手)一、需求概述及迭代规划
  • Docker安装与架构
  • 28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强
  • Facebook的去中心化探索:社交平台的新型发展趋势
  • GIT命令使用手册(详细实用版)
  • wxpyton+wxFormBuilder加法运算示例
  • docker 存储管理
  • 【LeetCode每日一题】——434.字符串中的单词数
  • Python的3D可视化库【vedo】2-5 (plotter模块) 坐标转换、场景导出、添加控件
  • redis-cli 连接Redis
  • 我的“双胞同体”发布模式的描述与展望
  • GESP CCF python六级编程等级考试认证真题 2024年12月
  • 关于ftp.ncbi.nlm.nih.gov数据下载路由调整的记录
  • MyBatis入门的详细应用实例
  • Docker dockerfile镜像编码 centos7
  • 从客户跟进到库存管理:看板工具赋能新能源汽车销售
  • 【深入理解Maven】
  • 商用密码标准实现
  • 【Elasticsearch】使用游标遍历所有数据
  • Pytorch实现轻量去雾网络