繁体   English   中英

了解代表和代表语法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM