理解委托和委托语法

本文关键字:语法 | 更新日期: 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接受谓词, T是参数的类型,在本例中:您传递的是由Find方法提供的Genre实例。

" Predicate是一个方法的委托,如果传递给它的对象符合委托中定义的条件,则返回true。"

所以你只是以委托的形式传递一个方法作为参数

也许我在这里没有使用正确的术语。但是从抽象的角度来看:这里的Find方法接受委托作为参数。它允许您实现"查找"算法(这里比较id)。这是一个灵活的代码,你也可以比较任何其他"类型"的对象。