【问题标题】:Naming an anonymous method for storing and removing inside a collection命名用于在集合内存储和删除的匿名方法
【发布时间】:2014-07-04 16:15:33
【问题描述】:

是否有可能在其中命名匿名方法?我需要这样做以将方法存储在字典 (myDict<Type, List<Action<object>>>) 中,然后需要稍后将其删除。为了删除我需要一个参考,例如一个名称,因为每个键都可以指向一个列表。有没有更好的方法来存储和删除集合中的匿名方法?

【问题讨论】:

  • 您如何确定要删除的操作?
  • 我猜答案是否定的!因为我没有对这个匿名函数的任何引用......
  • 我的意思是你必须有某种标准来确定,或者你正在随机删除它们?

标签: c# anonymous-function anonymous-methods


【解决方案1】:

我不认为你可以做你想做的事。即使两个不同的匿名委托是由相同的 c# 代码定义的,也不能保证它们是相等的。来自 c# 规范:

每个委托类型都隐式提供以下预定义的比较运算符:

布尔运算符 ==(System.Delegate x, System.Delegate y);

布尔运算符 !=(System.Delegate x, System.Delegate y);

两个委托实例被认为是相等的,如下所示:

• 如果任何一个委托实例为空,当且仅当两者都为空时,它们才相等。

• 如果委托具有不同的运行时类型,则它们永远不会相等。

• 如果两个委托实例都有一个调用列表(第 15.1 节),当且仅当它们的调用列表长度相同并且一个调用列表中的每个条目都等于(如下定义)时,这些实例才相等在对方的调用列表中按顺序对应的条目。

以下规则管理调用列表条目的相等性:

• 如果两个调用列表条目都引用相同的静态方法,则条目相等。

• 如果两个调用列表条目都引用同一目标对象上的同一非静态方法(由引用相等运算符定义),则条目相等。

• 允许(但不要求)相等的由语义相同的匿名函数表达式与相同(可能为空)捕获的外部变量实例集的求值产生的调用列表条目。

您可能需要为方法命名,如here 所示。

此外,请考虑使用事件实例字典,而不是自定义构建的操作列表字典。微软在这里给出了一个例子:How to: Use a Dictionary to Store Event Instances (C# Programming Guide)

【讨论】:

    【解决方案2】:

    这将是一种方式(但不在方法内部):

    Action<object> first = delegate (object f){ Console.WriteLine(f + "first");};
    Action<object> second = delegate(object s) { Console.WriteLine(s + "second"); };
    Action<object> third = delegate(object t) { Console.WriteLine(t + "third"); };
    
    Dictionary<Type, List<Action<object>>> myDict = new Dictionary<Type, List<Action<object>>>();
    
    myDict.Add(typeof(Bar), new List<Action<object>>());
    myDict[typeof(Bar)].AddRange(new[] { first, second, third });
    
    myDict[typeof(Bar)].Remove(first);
    

    因为您没有指定 lambda,所以我放置了匿名方法。

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2013-05-16
      • 2013-02-22
      • 1970-01-01
      相关资源
      最近更新 更多