C# 高级方法参数 详解

1.1值参数

对于方法调用的 参数 ,默认会把 值 传递 进方法;

使用方法:在方法声明中,参数前不加任何修饰符(如out或ref等)即为值参数。

调用方法:调用方法时,直接传递实参。

特点:值参数传递的是实参的副本,方法内部对形参的修改不会影响实参的值。这种方式适用于不需要修改原始数据的场景。

例子:

 // 定义一个方法,接受一个值参数
    static void ChangeNumber(int num)
    {
        num = 20; // 在方法内部修改形参num的值为20
        Console.WriteLine("方法内部,num的值为: " + num); // 输出方法内部的num值
    }

1.2引用参数(ref)

引用参数(ref) 用于将变量的引用传递给方法,而不是传递变量的值,在方法内部对参数的修改会直接影响原始变量的值。

使用方法:在方法定义中,使用 ref 关键字修饰参数

调用方法:在方法调用时,也必须使用 ref 关键字传递参数。

例子:

using System;

class Program
{
    static void Main()
    {
        int number = 10; // 定义一个整数变量,初始值为10
        Console.WriteLine("调用方法前的值: " + number); // 输出调用方法前的值

        ModifyValue(ref number); // 调用方法,传递number的引用
        Console.WriteLine("调用方法后的值: " + number); // 输出调用方法后的值
    }

    static void ModifyValue(ref int value) // 定义方法,使用ref关键字修饰参数
    {
        value = 20; // 在方法内部修改参数的值
    }
}

1.3输出参数(out)

使用 out 会 定义一个 局部变量,用于从方法中返回多个值,也会 传引用 到方法中,。

与值参数和引用参数(ref)不同,输出参数的主要特点是:

  1. 无需初始化:传递给输出参数的实参在方法调用前不需要初始化。这意味着你可以直接传递未赋值的变量。
  2. 必须赋值:在方法内部,输出参数必须在方法返回之前被赋值,否则编译器会报错。
  3. 引用传递:输出参数通过引用传递,方法内部对输出参数的修改会直接影响实参的值。

    和 ref相比,两者写法不一样。 ref需要提前定义,而 out 则 不能提前定义。

    例子:

    using System;
    
    class Program
    {
        static void CalculateValues(int[] numbers, out int max, out int min, out int sum, out double avg)
        {
            max = numbers.Max();  // 计算最大值
            min = numbers.Min();  // 计算最小值
            sum = numbers.Sum();  // 计算总和
            avg = numbers.Average();  // 计算平均值
        }
    
        static void Main()
        {
            int[] numbers = { 1, 2, 3, 4, 5 };
            int max, min, sum;
            double avg;
    
            CalculateValues(numbers, out max, out min, out sum, out avg);
    
            Console.WriteLine($"Max: {max}");
            Console.WriteLine($"Min: {min}");
            Console.WriteLine($"Sum: {sum}");
            Console.WriteLine($"Average: {avg}");
        }
    }

    1.4只读传引用(in)

    用于确保在方法内部对参数的操作是只读的,不会修改原始变量的值。

    引用传递:与 ref 类似,in 也是通过引用传递参数,但 in 确保了参数是只读的,而 ref 允许修改

    例子:

    public struct Point
    {
        public int X;
        public int Y;
    }
    
    public void PrintPoint(in Point point)
    {
        Console.WriteLine($"X: {point.X}, Y: {point.Y}");
        // point.X = 10; // 这行会报错,因为 point 是只读的
    }
    
    public static void Main()
    {
        Point p = new Point { X = 5, Y = 10 };
        PrintPoint(in p); // 传递只读引用
    }

    1.5返回引用

    返回引用是一种允许方法返回变量引用的特性,主要用于优化性能,尤其是在处理大型数据结构时。通过返回引用,可以直接修改原始变量的值,而不需要创建副本。

    例子:

    返回引用的方法需要在方法签名中声明ref关键字,并在调用时使用ref关键字接收返回的引用。

    public ref int FindMax(ref int first, ref int second, ref int third)
    {
        ref int max = ref (first > second ? ref first : ref second);
        return ref (max > third ? ref max : ref third);
    }

    与引用参数的区别

       引用参数(ref):用于将变量的引用传递给方法,方法内部对参数的修改会直接影响原始变量。

       返回引用(ref return):用于从方法中返回变量的引用,调用方可以通过返回的引用直接修改原始变量。

    1.6参数数组(params

    参数数组 使用 params关键字 ,可以定义一个方法,使其能够接受任意数量的同类型参数,这些参数在方法内部被视为一个数组 。

    在 调用时,也不是必须传递数组,传递一组数据也是可以的。甚至 不传参数 也是可以的。【暂不支持list,只支持数组。】

    参数数组 因为 他的可选性。要求 只能放在 参数的 最后一个,也 最多 只能有一个 参数 数组。

    例子:

    public int Sum(params int[] numbers)
    {
        int total = 0;
        foreach (int num in numbers)
        {
            total += num;
        }
        return total;
    }

    调用方法:

    调用带有 params 参数的方法时,可以直接传入多个参数,或者传入一个数组。

    int result1 = Sum(1, 2, 3); // 直接传入多个参数
    int result2 = Sum(new int[] {4, 5, 6}); // 传入数组

    你可能感兴趣的:(c#,开发语言)