C# 理解委托和委托语法

C# 理解委托和委托语法,c#,delegates,C#,Delegates,我有这行代码,它可以工作,但我不理解: 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方

我有这行代码,它可以工作,但我不理解:

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版本,它可能是代理,也可能不是代理,但其功能是等效的。括号中的匿名方法提供了谓词的实现,允许您将任意条件传递给
Find(…)
方法。

C#提供了两种定义委托的方法,而无需为委托编写命名方法—C#2.0中引入的旧语法和C#3.0中引入的较短lambda语法

您的代码采用了旧的编写方式:

Genres.Find(genre => genre.Id == id);
这描述了C#中匿名函数的演变


您的
Find
方法接受谓词委托。根据代码所针对的.NET版本,它可能是代理,也可能不是代理,但其功能是等效的。括号中的匿名方法提供了谓词的实现,允许您将任意条件传递给
Find(…)
方法。

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

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

以直观的方式查看:

Genres.Find(   --- The CompareGenres function is being called from here ---    );

 bool CompareGenres(Genre genre)
 {
   return genre.Id == id; 
 }
Find接受一个谓词,T是参数的类型,在本例中:您正在传递Find方法提供的类型实例

“谓词是对方法的委托,如果传递给它的对象与委托中定义的条件匹配,则该方法返回true。”


因此,您只是以委托的形式将方法作为参数传递,这是一种直观的方式:

Genres.Find(   --- The CompareGenres function is being called from here ---    );

 bool CompareGenres(Genre genre)
 {
   return genre.Id == id; 
 }
Find接受一个谓词,T是参数的类型,在本例中:您正在传递Find方法提供的类型实例

“谓词是对方法的委托,如果传递给它的对象与委托中定义的条件匹配,则该方法返回true。”

因此,您只是以委托的形式传递一个方法作为参数,它说,找到类型(从列表
Genres
),它的Id等于变量
Id
中的值

关键字
delegate
表示,这是一种内联函数,用于决定每个项目的检查是否为真。开头的
(Genre-Genre)
表示“如果我调用循环中的每个元素
Genre
,我可以使用其命名变量
Id
检查每个项目的Id”。这是:
genre.Id==Id

现代方法是使用lambdas,如:

var x = Genres.Find(g => g.Id == id);
在本例中,
g
是您可以检查的循环变量。

它说,从列表
Genres
中找到Id等于变量
Id
中值的类型

关键字
delegate
表示,这是一种内联函数,用于决定每个项目的检查是否为真。开头的
(Genre-Genre)
表示“如果我调用循环中的每个元素
Genre
,我可以使用其命名变量
Id
检查每个项目的Id”。这是:
genre.Id==Id

现代方法是使用lambdas,如:

var x = Genres.Find(g => g.Id == id);

在本例中,
g
是您可以检查的循环变量。

问题是什么?它是如何工作的!你知道lamda的表达方式吗?旁注:解释你已经理解的将有助于你提供解释你感兴趣的答案,不是你可能知道也可能不知道的随机片段。代表们的最佳参考是Jon Skeet的C#depth。它确实很有帮助。但在开始阅读之前,你应该了解一些delagets,问题是什么?它是如何工作的!你知道lamda的表达方式吗?旁注:解释你已经理解的将有助于你提供解释你感兴趣的答案,不是你可能知道也可能不知道的随机片段。代表们的最佳参考是Jon Skeet的C#depth。它可能非常有用。但在开始阅读之前,你应该了解一些delagets