我想要一个修改一些参数变量列表的函数,但它们都是值类型(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来更改它们。一些参数可以为空,使代码生成更加痛苦。在这种情况下,制作一些重载方法而不是params将没有多大用处。
答案 0 :(得分:8)
好吧,你可以声明一些重载,即
public void FuncParams(ref int a) {...}
public void FuncParams(ref int a, ref int b) {...}
等
否则,您必须从数组中读回(因为params
实际上意味着“隐式数组”):
object[] args = {1,2,3};
funcParams(args);
Console.WriteLine(args[0]); // updated
Console.WriteLine(args[1]); // updated
Console.WriteLine(args[2]); // updated
(当然,如果它只接受int
s,那么最好全程使用int[]
答案 1 :(得分: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++;
}
}
}
}
答案 2 :(得分:2)
不,使用简洁的语法是不可能的。原因是,在内部,运行时将方法视为采用数组参数的简单方法。编译器执行创建数组的内务处理并使用指定的参数填充它。由于参数是值类型,因此它们将被复制到数组中,对它们的任何更改都将不影响原始变量。
实现它的其他方法将会破坏params
存在的目的,这对于可变数量的参数来说是一个很好的语法。