[英]Understanding Delegates and Delegate Syntax
我有这行代码,它可以工作,但我不明白:
Genres.Find(delegate (Genre genre) { return genre.Id == id; });
流派是流派列表(音乐)
这里到底发生了什么?
C#提供了两种定义委托的方式,而无需为其编写命名方法-C#2.0中引入的旧匿名方法语法和C#3.0中引入的较短的lambda语法。
您的代码是编写此代码的旧方法:
Genres.Find(genre => genre.Id == id);
本文介绍了C#中匿名函数的演变。
您的Find
方法采用谓词委托。 根据您的代码所针对的.NET版本,它可能是(也可能不是) System.Predicate<T>
委托,但是其功能是等效的。 括号中的匿名方法提供了谓词的实现,使您可以将任意条件传递给Find(...)
方法。
直观的查看方式:
Genres.Find( --- The CompareGenres function is being called from here --- );
bool CompareGenres(Genre genre)
{
return genre.Id == id;
}
Find接受谓词<T>,在这种情况下,T是参数的类型:您正在传递由Find方法提供的Genre实例。
“谓词是方法的委托,如果传递给它的对象与委托中定义的条件匹配,则该方法返回true。”
所以您只是以委托的形式传递方法作为参数
它说,找到流派(从Genres
列表中),其ID等于变量id
的值。
关键字delegate
表示,这是一种内联函数,它决定每个项目的检查是否正确。 开头(Genre genre)
说:“假设我在循环中调用每个元素genre
,我可以使用其命名的变量Id
来检查每个项目的Id
”。 这是: genre.Id == id
。
现代方法是使用lambda,例如:
var x = Genres.Find(g => g.Id == id);
在这种情况下, g
是您可以检查的循环变量。
也许我在这里没有使用正确的术语。 但是形成一个抽象的观点:这里的Find方法接受一个委托作为参数。 它允许您实现“查找”算法(此处比较ID)。 这是灵活的代码,您还可以比较“流派”的任何其他对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.