理解委托和委托语法
本文关键字:语法 | 更新日期: 2023-09-27 18:12:07
我有这行代码,它工作,但我不明白它:
Genres.Find(delegate (Genre genre) { return genre.Id == id; });
genre是一个类型(音乐)列表
这里到底发生了什么?
c#提供了两种无需为其编写命名方法来定义委托的方法——c# 2.0中引入的旧的匿名方法语法,以及c# 3.0中引入的更短的lambda语法。
你的代码是这样写的:
Genres.Find(genre => genre.Id == id);
这篇文章描述了c#中匿名函数的演变。
你的Find
方法接受一个谓词委托。根据代码所针对的。net版本,它可能是也可能不是System.Predicate<T>
委托,但其功能是等效的。括号中的匿名方法提供了谓词的实现,允许您将任意条件传递给Find(...)
方法。
它说,找到类型(从列表Genres
),它的Id等于变量id
的值。
关键字delegate
表示,这是一种内联函数,它决定对每个项的检查是否为真。开头的(Genre genre)
表示"假设我将在循环中调用每个元素genre
,我可以用其命名变量Id
检查每个项目的Id"。这是:genre.Id == id
.
一种现代的方法是使用lambdas:
var x = Genres.Find(g => g.Id == id);
在本例中,g
是您可以检查的循环变量。
直观的查看方式:
Genres.Find( --- The CompareGenres function is being called from here --- );
bool CompareGenres(Genre genre)
{
return genre.Id == id;
}
Find接受谓词
" Predicate是一个方法的委托,如果传递给它的对象符合委托中定义的条件,则返回true。"
所以你只是以委托的形式传递一个方法作为参数
也许我在这里没有使用正确的术语。但是从抽象的角度来看:这里的Find方法接受委托作为参数。它允许您实现"查找"算法(这里比较id)。这是一个灵活的代码,你也可以比较任何其他"类型"的对象。