4

我想要一个函数来修改一些变量的参数列表,但它们都是值类型(int,string)。有一种方法可以使 params 关键字与 ref 关键字或类似的关键字一起使用吗?

public void funcParams(params object[] list)
{
   /* Make something here to change 'a', 'b' and 'c' */
}

public void testParams()
{
    int a = 1, b = 2, c = 3;

    funcParams(a, b, c);
}

问题是,我试图让我的生活更轻松,制作一种修改对象字段的方法。我正在使用 Cecil 进行一些动态代码生成,并且试图避免编写过多的 IL 生成代码。

为了简化,我想通过引用传递字段列表,我需要更改为更改它们的函数,而不是通过生成相应的 IL 来更改它们。一些参数可以为空,使代码生成更加痛苦。在这种情况下,制作一些重载方法而不是参数不会有太大用处。

4

3 回答 3

8

好吧,你可以声明一些重载,即

public void FuncParams(ref int a) {...}
public void FuncParams(ref int a, ref int b) {...}

ETC

否则,您将不得不从数组中读回(params实际上意味着“隐式数组”):

object[] args = {1,2,3};
funcParams(args);
Console.WriteLine(args[0]); // updated
Console.WriteLine(args[1]); // updated
Console.WriteLine(args[2]); // updated

(当然,如果它只接受ints,最好使用int[]通篇)

于 2009-01-12T10:40:48.560 回答
5

是的。有可能的。

但是,生成的代码是“不安全的”,这使得它无法验证。

根据您的要求,这可能是也可能不是问题。

无论如何,这里是代码:

using System;

namespace unsafeTest
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            unsafe 
            {       
                int x = 0;
                int y = 0;
                int z = 0;
                bar(&x, &y, &z);
                Console.WriteLine(x);
                Console.WriteLine(y);
                Console.WriteLine(z);
            }
        }

        unsafe static void bar(params int *[] pInts)
        {
            int i = 0;
            foreach (var pInt in pInts)
            {
                *pInt = i++;
            }
        }
    }
}
于 2009-01-12T11:17:45.273 回答
2

不,使用简洁的语法是不可能的。原因是,在内部,运行时将该方法视为采用数组参数的简单方法。编译器负责创建一个数组并用指定的参数填充它。由于参数是值类型,它们将被复制到数组中,对它们的任何更改都不会影响原始变量。实现它的其他方法将破坏存在的目的,params这是可变数量参数的一个很好的语法。

于 2009-01-12T10:40:20.263 回答