c#将params从一个例程传递到另一个例程

时间:2011-07-01 19:17:16

标签: c# arrays params

提出这个问题最简单的方法就是通过一个例子向大家展示 - 所以我走了!

private void exampleVoid(string someString, params string[] someArray_string)
{
    // Do some dirty work
    for(int i = 0; i < someArray_string.length; i++)
    {
        Console.WriteLine(someArray_string[i]);
    }

    // Recall the routine
    exampleVoid("some string", someArray_string)
}

当我重新传递例程底部的数组时,数据没有正常通过。数组的长度现在为0.

为什么?

4 个答案:

答案 0 :(得分:2)

我没有使用以下示例看到这种行为:

class Program
{
    static void Main( string[] args )
    {
        Foo( 5, "one", "two", "three" );
        Console.ReadLine();
    }

    static void Foo( int counter, params string[] parms )
    {
        if( counter <= 0 ) return;

        foreach( var str in parms )
        {
            Console.WriteLine( str );
        }

        Foo( --counter, parms );
    }
}

在第一次递归调用后,您如何确定someArray_string为空?你在使用调试器吗?你在哪里调用这个函数,你传递给它的是什么参数?你实际上是在传递字符串作为第二个......最后一个参数,即你是否将多个参数传递给方法?

此外,您最终会崩溃StackOverflowException,因为除了递归调用它之外,您永远不会从函数返回。呼叫永远不会停止,这可能是你认为完全是另一个问题的原因吗?

答案 1 :(得分:1)

如何/何时初始化someArray_string?什么时候向该数组添加任何东西?据我所知,你只需循环遍历一个空数组并将其空元素写入控制台。

答案 2 :(得分:0)

您确定没有从方法中的数组中删除或修改任何数据吗?因为数组将通过引用传递。

我已经尝试了这个例子,它只是按预期工作......所以,我想知道'重处理'究竟是什么......

答案 3 :(得分:0)

我遇到了类似的问题,不得不放弃这种方法。

params关键字允许该方法采用变量参数列表。 当您再次调用该方法时,发送到下一个调用的“someArray_string”仅作为一个参数而不是数组接收。在第二次调用时,someArray_string [0]没有任何值吗?