所以我有以下代码:
namespace ConsoleApplication1
{
public delegate int Transformer(int x);
class Test
{
public static void Transform(int[] values, Transformer t)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = t(values[i]);
}
}
static int Square(int x)
{
return x * x;
}
static int Minus(int x)
{
return x - 1;
}
static void Main()
{
int[] values = { 1, 2, 3 };
Transformer t = Test.Minus;
t += Test.Square;
Test.Transform(values, t);
foreach (int i in values)
{
Console.Write(i + " ");
}
}
}
}
为什么它总是只对数组(在我的例子中是 Square)做最后的操作。我需要更改什么才能同时执行 Minus 和 Square ?
最佳答案
多播委托(delegate)总是返回链中最后一个委托(delegate)的值。由于您不修改 Test.Minus 和 Test.Square 中的值,而是返回新值,因此仅应用后者。解决此问题的最简单方法是让您的转换器通过引用获取值并修改它们。例如:
namespace ConsoleApplication1
{
public delegate void Transformer(ref int x);
class Test
{
public static void Transform(int[] values, Transformer t)
{
for (int i = 0; i < values.Length; i++)
{
t(ref values[i]);
}
}
static void Square(ref int x)
{
x = x * x;
}
static void Minus(ref int x)
{
x = x - 1;
}
static void Main()
{
int[] values = { 1, 2, 3 };
Transformer t = Test.Minus;
t += Test.Square;
Test.Transform(values, t);
foreach (int i in values)
{
Console.Write(i + " ");
}
}
}
}
关于c# - 多播委托(delegate)总是做最后一个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6925748/