为什么事件处理程序永远不会被调用,如果它被添加到一个不可数的循环中?
例如:
IEnumerable<MyType> list = someCollection.Select(i => new MyType(i));
foreach (var item in list)
item.PropertyChanged += item_PropertyChanged; <-- this never gets called
Run Code Online (Sandbox Code Playgroud)
Bu如果分配列表就像
list = someCollection.Select(i => new MyType(i)).ToArray();
Run Code Online (Sandbox Code Playgroud)
事件处理程序确实被调用..
为什么?(我想它与LINQ查询是懒惰的事实有关,但循环结果的事实是不够的?)
您的Select调用正在创建 的新实例MyType,这意味着......
list输入When时,每次枚举时IEnumerable<MyType>都会处理新对象的新序列。您要添加事件处理程序的对象与您随后测试的对象不同。list
当list键入为MyType[](通过使用调用)时,每次枚举时ToArray都会处理相同的对象集合list。您要添加事件处理程序的对象与您随后测试的对象相同。
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |