方法参数

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

  C#中, 对于方法的参数,可以有三种前缀

  • out
  • ref
  • params

  

out:

  我们知道,在编写方法的时候, 方法可以有返回值,也可以没有返回值(void),这两种情况可以满足我们大部分的普通编程需求,但有时, 我们需要返回多个参数, 这时候,我们就要用到out了。

  在使用out参数时, 定义方法和调用方法时都需要加上out关键字,并且作为输出参数的变量,在作为输出参数调用发放前,不能够进行初始化。

  下面是一个实例,这个例子并不贴切,不过能够说明out的作用:

class Program_1
{
    static void Main(string[] args)
    {
        double a = 1.2;
        double b = 2.1;
        double add;
        double sub;
        Calc(a, b, out add, out sub);
    }
    static void Calc(double x, double y, out double addRes, out double subRes)
    {
        addRes = x + y;
        subRes = x - y;
    }
}

ref:

  out参数为我们返回多个值提供了途径, 但是作为输出参数的变量却不能进行初始化,那如果我们需要传入的那个参数有初始值,并能做为输出参数进行返回时, 我们应该怎么做呢?

  一种方法就是,将那个变量a作为参数传入,并再定义一个同类型的变量b作为输出参数,在方法中,将修改后的变量a赋值给输出参数b, 这样就能够解决上面的问题了,但是如果有很多这样有初始值,并需要返回更改后值的变量,那么就要定义很多变量。

  对于上面的这种情况, 我们就能够使用ref关键字了,ref参数允许方法参数有初始值,并且在调用的方法中改变其值后,能够进行返回。 这里需要注意的是,out参数需要变量未初始化,而ref参数是需要变量必须初始化,不然会报错。

  下面是关于ref的一个例子:

class Program_1
{
    static void Main(string[] args)
    {
        string name = "ty";
        FullInfo(ref name);
    }
    static void FullInfo(ref string name)
    {
        name = "Configuration_" + name;
    }
}

params:

  我们在定义方法的时候, 参数类型可以为数组类型。 有时候, 我们将方法的参数设置为数组, 并不是因为我们需要传入一组相关的数据,也可能是因为我们不知道可能的参数的个数, 而将那些数据全部保存到一个数组。

  对于上面的那种情况, 那我们在调用方法的时候就需要新建一个数组将那些数据保存在一起,然后传入方法中。这样, 我们就需要多定义一个数组,而且,我们一般都是将同类型相关联的数据保存到一个数组中, 而这种为了将这些可变的参数传到方法中,而新建一个数组,并将它们保存到一起, 感觉不太好。

  在这时候, 我们就可以使用params关键字了, 描述能力有限, 我还是直接上代码吧:

using System;
public class MyClass 
{

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

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

    static void Main() 
    {
        UseParams(1, 2, 3);
        UseParams2(1, 'a', "test"); 

        // An array of objects can also be passed, as long as
        // the array type matches the method being called.
        int[] myarray = new int[3] {10,11,12};
        UseParams(myarray);
    }
}

从上面的代码可以看出,方法中, 参数列表只有一个带有params关键字的object[]数组, 而调用方法的时候却并没有传入数组, 而是传入了多个object值(隐式装箱)。

对于params,还有一点需要注意,带有params关键字的数组必须是方法参数的最后一个参数,也就是说, 一个方法只允许有一个params参数。

原文地址:https://www.cnblogs.com/hourglasser/p/3405470.html