TOC

This article has been localized into Chinese by the community.

基础知识:

方法参数

在上一章中,我们看了一下函数。 我们简要地讨论了参数,虽然参数可以非常简单的直接使用,但有一些技巧可以使它们更强大。

我们先看看out和ref修饰符。 C#和其他语言在两个参数之间有所不同:“按值”和“按引用”。 C#中的默认值是“按值”,这基本上意味着当您将变量传递给函数调用时,实际上是在发送对象的副本,而不是对它的引用。 这也意味着您可以从函数内部更改参数,而不会影响作为参数传递的原始对象。

使用ref和out关键字,我们可以更改此行为,传递的是对象引用而不是其值。

ref修饰符

请看下面的例子:

static void Main(string[] args)
{
    int number = 20;
    AddFive(number);
    Console.WriteLine(number);
    Console.ReadKey();
}

static void AddFive(int number)
{
    number = number + 5;
}

我们创建一个整数,为它分配数字20,然后我们使用AddFive()方法,该方法应该为数字加5。 但是呢? 不。我们为函数内部的数字赋值,永远不会执行函数,因为我们已经传递了数值的副本而不是对它的引用。 这就是C#的工作原理,在很多情况下,它是首选的结果。 但是,在这种情况下,我们实际上希望修改函数内部的数字。 输入ref关键字:

static void Main(string[] args)
{
    int number = 20;
    AddFive(ref number);
    Console.WriteLine(number);
    Console.ReadKey();
}

static void AddFive(ref int number)
{
    number = number + 5;
}

如您所见,我们所做的就是将ref关键字添加到函数声明以及调用函数中。 如果你现在运行程序,一旦我们从函数调用返回,你会看到number的值现在已经改变了。

out修饰符

out修饰符的工作方式与ref修饰符非常相似。 它们都确保参数是通过引用而不是通过值传递的,但是它们确实有两个重要区别:传递给ref修饰符的值必须在调用方法之前初始化 - 对于out修饰符不是这样,您可以使用未初始化的值。 另一方面,在函数内部您不能使用out参数,而不为其赋值。 由于您可以将未初始化的值作为out参数传递,因此您无法在函数内部实际使用out参数 - 您只能为其分配新值。

是否使用out或ref取决于具体情况,一旦您开始使用它们就会意识到。 两者通常用于解决只能通过C#从函数返回一个值的问题。

使用out修饰符就像使用ref修饰符一样,如上所示。 只需将ref关键字更改为out关键字即可。 在上面的示例中,还要记住删除方法中赋给number的值,并在调用函数中声明它。

params修饰符

到目前为止,我们所有的功能都接受了固定数量的参数。 但是,在某些情况下,您可能需要一个采用任意数量参数的函数。 这当然可以通过接受数组或列表作为参数来完成,如下所示:

static void GreetPersons(string[] names) { }

然而,调用它会有点笨拙。 即使最短的形式,它看起来像这样:

GreetPersons(new string[] { "John", "Jane", "Tarzan" });

这是可以接受的,但使用params关键字可以更智能地做到:

static void GreetPersons(params string[] names) { }

调用它将如下所示:

GreetPersons("John", "Jane", "Tarzan");

使用params方法的另一个好处是,您也可以将零个参数传递给它。 带参数的函数甚至可以有其他参数,只要带有params关键字的参数是最后一个参数。 除此之外,每个函数只能使用一个使用params关键字的参数。 这是最后一个更完整的例子:

static void Main(string[] args)
{
    GreetPersons(0);
    GreetPersons(25, "John", "Jane", "Tarzan");
    Console.ReadKey();
}

static void GreetPersons(int someUnusedParameter, params string[] names)
{
    foreach(string name in names)
Console.WriteLine("Hello, " + name);
}
This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!