(C#基础) 方法的参数修饰符

(C#)方法的参数修饰符

参数修饰符
(无)      如果一个参数没有修饰符标记,则认为它将按值传递(pass by value),这意味着被调用的方法收到一份原始数据的副本。
out     输出参数由被调用的方法赋值,因此它按引用传递(pass by reference),如果被调用的方法没有给输出参数赋值,就会出现编译器错误。
ref    调用者赋初值,可以由被调用的方法可选的重新赋值(数据也是按引用传递),如果被调用的方法未能给ref参数赋值,也不会有编译器错误。

params  允许将一组可变数量的参数作为单独的逻辑参数进行传递。方法只能有一个params参数,并且必须是方法的最后一个参数。

默认的参数传递行为 - 副本传入,按值传递

如果没有为参数标记参数相关的修饰符,数据的副本就会被传入函数。

namespace ConsoleApplication1
{
    class Program
    {
        // 静态方法可以被直接调用(无需对象实例化)
        static int Add(int x, int y)
        {
            int sum = x + y;
            // 调用者传入的是x,y的副本,所以下面的改变不会影响调用者中的x,y值。
            x = 2013;
            y = 213;
            return sum;
        }

        static void Main(string[] args)
        {
            int x = 8, y = 18;
            Console.WriteLine("Sum of {0} and {1} is: {2}", x, y, Add(x, y));  //Output:  8, 18, 26
            Console.WriteLine("After call, x is {0}, y is {1}", x, y);         //Output: 8, 18 
            Console.ReadLine();   
        }
    }
}

out 修饰符 -输出参数,按引用传值

带有输出参数(out)的方法在退出方法之前,给参数附一个恰当的值。(否则会产生编译器错误)

namespace ConsoleApplication1
{
    class Program
    {
        // 输出参数sum由如下被调用的方法赋值, 本方法无需返回值。
        static void Add(int x, int y, out int sum)
        {
             sum = x + y;
        }

        static void Main(string[] args)
        {
            int x = 8, y = 18;
            // 无需给输出参数赋初始值。
            int sum;
            Add(x, y, out sum); 
            Console.WriteLine("Sum of {0} and {1} is: {2}", x, y, sum);  //Output:  8, 18, 26
            Console.ReadLine();   
        }
    }
}

out修饰符有个很好的用途:通过它,调用者只使用一次方法就可以获取多个返回值。

namespace ConsoleApplication1
{
    class Program
    {
        // 设置多个输出参数
        static void SimpleMath(int x, int y, out int sum, out int subtract) 
        {
            sum = x + y;
            subtract = x - y; 
        }

        static void Main(string[] args)
        {
            int myX = 8, myY = 18;
            // 无需给输出参数赋初始值。
            int mySum, mySubtract;
            SimpleMath(myX, myY, out mySum, out mySubtract);
            Console.WriteLine("Sum of {0} and {1} is: {2}, Subtract is {3}", myX, myY,  mySum, mySubtract);  //Output:  8, 18, 26, -10
            Console.ReadLine();   
        }
    }
}

ref 修饰符 - 引用参数,按引用传值

通过使用引用参数,方法可以对在调用者作用域中声明的不同数据进行操作(改变值),例如排序和交换。

引用参数(ref修饰)和输出参数(out修饰)的区别在于:

- 输出参数不需要它们在被传递给方法之前初始化,方法在退出之前必须为输出参数赋值。

- 引用参数必须在它们被传递给方法之前初始化,因为是传递一个对已存变量的引用。

namespace ConsoleApplication1
{
    class Program
    {
        // 设置引用参数
        static void Swap(ref int x, ref int y) 
        {
            int temp = x;
            x = y;
            y = temp; 
        }

        static void Main(string[] args)
        {
            // 必须给引用参数赋初始值。
            int myX = 8, myY = 18;
            Console.WriteLine("Before: myX is {0}, myY is {1}", myX, myY);  //Output:  8, 18
            Swap(ref myX, ref myY);
            Console.WriteLine("After: myX is {0}, myY is {1}", myX, myY);  //Output:  18, 8
            Console.ReadLine();   
        }
    }
}
原文地址:https://www.cnblogs.com/fdyang/p/2911063.html