需要说明:与代表插入方法

时间:2014-04-14 13:09:10

标签: c# delegates

我是C#的新人,我已经研究了一个月了。有些代码让我很头疼。你能解释一下这是如何工作的,Util类中的void方法如何改变Test类中的int数组? (http://msdn.microsoft.com/en-us/library/orm-9780596527570-03-04.aspx

我不明白第values[i] = t(values[1])行怎么可以更改mainvalues[]如果没有引用或退出就无效?如果可能,那么请为C#初学者解释一下。

谢谢你的时间!

public delegate int Transformer (int x);

public class Util
{
  public static void Transform (int[] values,Transformer t)
  {
   for (int i = 0; i < values.Length; i++)
   values[i] = t(values[i]);
  }
}

class Test
{
  static void Main(  )
  {
    int[] mainvalues = new int[] {1, 2, 3};
    Util.Transform(mainvalues, Square);      // dynamically hook in Square
    foreach (int i in mainvalues)
      Console.Write (i + "  ");           // 1   4   9
  }

  static int Square (int x) { return x * x; }
}

2 个答案:

答案 0 :(得分:1)

因为数组是引用类型。即使你不使用ref关键字,它也会作为引用传递。你正在更改方法内部的数组值。你将每个值传递给{{1然后获取结果然后用新结果替换每个数字。

Squarevalues[i],它按值传递,int返回一个新值(不会更改您拥有的值)。重要的是您要分配它回来了。这就是它改变原始价值的原因。

答案 1 :(得分:0)

要完全理解它,你必须看看代码是如何工作的,如果你使用 visual studio 你可以去调试选择 Step In To 并通过一遍又一遍地单击单步执行来遍历代码,直到代码终止。这就是我自己理解的方式。