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

发布于:2025-02-11 ⋅ 阅读:(69) ⋅ 点赞:(0)

一.方法参数修饰符 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


网站公告

今日签到

点亮在社区的每一天
去签到