【问题标题】:Need Explaination: plug in method with delegates需要说明:用委托插入方法
【发布时间】:2016-06-22 18:30:17
【问题描述】:

我是 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; }
}

【问题讨论】:

  • 我认为您对函数返回的内容以及作为参数的内容有点困惑......

标签: c# delegates


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    要完全理解它,你必须看看代码是如何工作的,如果你使用的是 visual studio,你可以去 Debug 选择 Step In To 并通过反复单击 Step In To 来浏览代码,直到您的代码终止。我自己就是这么理解的。

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多