我的项目中有以下代码段。我是lambda表达式的新手。我对它有一些想法 开始使用它。但我不明白下面的代码是如何工作的。特别地,
NotifyIntrenal( notification, callback, changedTypes => ..
现在,changedTypes
是方法NotifyIntrenal
的参数之一。我们使用一种不合理的方法得出它的价值。
如果我看到代码,因为我没有为changedTypes分配任何值,所以根据我的理解,代码if (changedTypes == null)
应该
永远是true
。但是当我调试时情况并非如此。
有人可以解释一下这是如何运作的吗?
private void Notify( Notification notification )
{
var nameDto = GetNameDto();
foreach (var subscription in _subscriptionsDictionary)
{
var callback = subscription.Key;
var subscribedTypes = subscription.Value;
NotifyIntrenal( notification, callback, changedTypes =>
{
if (changedTypes == null)
return subscribedTypes;
if (!changedTypes.Any())
return subscribedTypes;
return changedTypes.Intersect(subscribedTypes);
}, nameDto);
}
}
谢谢&此致
答案 0 :(得分:3)
changedTypes
不是NotifyInternal
的参数。它是匿名方法的参数
这个整个方法是NotifyInternal
的参数。
此时不执行lambda中的代码。它只会在NotifyInternal
中的某些行调用时执行。因此,NotifyInternal
中的代码行必须执行匿名方法:
void NotifyInternal(Notification notification, Callback callback, Func<IEnumerable<Type>, IEnumerable<Type>> function, string nameDto)
{
// ... some code
// execute the lambda
var result = function(mychangedtypesvariable);
// ... more code
}
只有这样才能使用pass参数(在该示例中为mychangedtypesvariable
)执行lambda中的代码。因此,如果这将为null,则无法从您看到的代码段中做出决定。
答案 1 :(得分:0)
changedTypes
只是匿名方法的一个参数,而不是NotifyIntrenal
。然而,后者调用匿名方法并适当填充参数(如果需要)。在您的情况下,匿名方法需要IEnumerable<MyType>
并返回IEnumerable<MyType>
。
NotifyIntrenal(string arg1, string arg2, Func<IEnumerable<MyType>, IEnumerable<MyType>> func) {
// do something
var list = new List<MyType> { ...}
// execute the delegate with the list
IEnumerable<MyType> result = func(list);
}
实际上changedTypes
是由 NotifyIntrenal
提供的,而不是提供给它。如何在方法中创建该参数取决于您。