当前位置:  开发笔记 > 编程语言 > 正文

代表组成(功能陷阱)

如何解决《代表组成(功能陷阱)》经验,为你挑选了1个好方法。



1> Jon Skeet..:

问题只是捕获变量而不是值.这是一个大致相同但稍微简单的解决方案:

public AddMyColumn(DelegateGrid.ValueGetter getter) {
  if (lastGetter != null) {
    DelegateGrid.ValueGetter newLastGetter = lastGetter;
    base.AddColumn(new DelegateColumn(delegate(MyObj obj) { 
     return getter(obj)-newLastGetter(obj); 
    }));
  }
  // ...
}

基本上没有必要创建一个新的委托实例 - 委托是不可变的,所以你可以只使用赋值复制值.

就捕获的值而言,这实际上并不是特定于委托的问题 - 这通常是匿名方法和lambda表达式的常见问题.典型的例子是;

List actions = new List();
for (int i=0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}
foreach (Action action in actions)
{
    action();
}

这打印"10"10次.要打印0-9,您需要再次更改捕获变量的范围:

List actions = new List();
for (int i=0; i < 10; i++)
{
    int copy = i;
    actions.Add(() => Console.WriteLine(copy));
}
foreach (Action action in actions)
{
    action();
}

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有