65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 和接受参数

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (15投票s)

2009年7月6日

CC (ASA 2.5)

1分钟阅读

viewsIcon

63707

C# 提供了一些额外的关键字,允许你为方法接受多个参数。本文将介绍使用 'params' 关键字和邪恶的 '__arglist' 关键字。

你是否曾经编写过类似下面的函数——传递一个值的数组?

public void UpdateList(string[] list) {
    //...etc...
}

这种方法并不常见,但你知道你可以进一步简化它吗?

params 关键字

params 关键字是方法参数的一个有趣的修饰符。它允许用户传递单个值,而不是使用数组本身。

public void ProcessList(params string[] args) {
    //...etc...
}

//old way still works
ProcessList(new string[] { "a", "b", "c" });

//new way works as well
ProcessList("a", "b", "c");

你会注意到,你仍然可以像以前一样传递数组,但现在你可以一次添加一个参数。

params 关键字必须是方法中的最后一个参数,除此之外,没有其他限制。你可以像对待任何其他数组一样对待这个参数。

使用“纯粹的邪恶”传递更多参数

params 关键字在处理参数时给你提供了一点额外的灵活性,但你是否听说过 __argslist 关键字?

如果没有,那也没什么大不了的——你真的不应该经常使用它。

public static void CallArgList(__arglist) {
    ArgIterator args = new ArgIterator(__arglist);
    int total = args.GetRemainingCount();
    for (int i = 0; i < total; i++) {
        object value = TypedReference.ToObject(args.GetNextArg());
        Console.WriteLine(
            "Arg #{0}: {1} ({2})",
            i,
            value,
            value.GetType()
            );
    }
}

//then used like...
CallArgList(
    __arglist(
        "Jim",
        1,
        false,
        (new StringBuilder()).Append("howdy")
        ));

现在,这段代码看起来很奇怪,但更奇怪的是,它有效!我们现在能够将值传递到我们的方法中,而没有任何约束。

我真的不建议使用这个关键字。使用对象数组(使用 params)编写类似的方法,在执行速度上没有发现任何实际差异。 考虑到它不是一个常用的特性,其他开发者遇到它时很可能会先搜索 Google 才能继续。

© . All rights reserved.