![]() |
1
2
在大多数情况下,它们在功能上似乎是等效的。实际上,您可以将普通方法作为变量传递。 但是有一些细微的差别,比如能够重新定义函数,使其成为其他的东西。如果使用反射,也可能不同,例如,它可能没有在类的方法列表中返回。(反射部分不能100%确定) 下面显示了如何将一个方法作为变量传递,以及第二种方法如何允许重新定义如果它是普通方法就不可能实现的func。
这让我想到…如果所有方法都是这样声明的,那么您可以 first class functions 在C…有趣… |
![]() |
2
7
好的,为了清楚起见,我将把这两个写出来(并稍微修改一下方法使其简短一些)
首先要注意的是
两者之间的区别
什么是代表?委托是一种类型。从 MSDN documentation :
本质上,您可以将委托视为方法的引用/指针,但是委托指向的方法必须与委托期望的签名匹配。例如
重要的是要注意
代表
类型(注意大写D)和
代表
关键字(小写d)。在您的示例中,您使用
匿名方法当我们在第一个示例中分配renderLegate时,我们没有将renderLegate设置为现有的命名方法,而是直接声明了一个新方法。这被称为匿名方法,因为我们能够将代码块(也使用delegate关键字声明)作为委托参数传递: 匿名函数回到原来的语法-您的示例使用lambda语法以一种有趣的方式Delcare匿名委托。lambda表达式是声明短内联方法的好方法,在处理列表时通常会使用这些方法,例如假设我们希望按名称对htmlhelper对象列表进行排序。这样做的方法是传递一个委托,该委托将两个htmlhelper对象与lists sort方法进行比较,然后sort方法使用该委托对列表中的元素进行比较和排序:
为了避免出现大量分散在周围的短方法,可以使用匿名方法在线Delcare排序方法。关于这一点,真正有用的是内联方法可以访问包含范围中声明的变量:
不过,这仍然是相当多的输入,因此lambda sytax诞生了,现在您可以改为这样做:
然而,以这种方式声明“正常”的方法对我来说似乎完全没有意义(而且让我的眼睛流血)。 代表是 难以置信地 非常有用,是.NET事件系统的基石。再多读些书来整理一下: |
![]() |
3
5
a)样式是使用委托的样式。以下是等效的:
b)这样做的好处是,您可以在另一个方法中将render视为一个变量。然而,在这个特定的例子中,它们或多或少有相同的好处(尽管后者更容易理解)。 |
![]() |
4
1
“render”是一个函数对象,它以一个htmlhelper和一个propertyviewmodel对象作为参数,并返回一个字符串。是的,它们是等价的。 在这种情况下,为什么会有人使用lambda而不是静态函数,这超出了我的理解范围,但我不知道上下文。我将像在第二个示例中那样声明一个静态函数。也许他们认为lambda语法是“更酷”的,并且无法自拔。 |
![]() |
5
1
我认为这种语法的最大优点是,您可以在不扩展类的情况下重新定义方法(只需将字段设置为新方法)。 这是个好主意吗?大概不会。但我相信有些地方是有意义的… |
![]() |
6
1
“A)第一种款式的名称是什么?我意识到它使用的是lambdas;=符号让我很困惑。我不能标记它;)“ 它分析如下:
很抱歉。我无法抗拒。 |
![]() |
7
1
在这个特定的例子中,函数是等价的。但是,一般来说,lambda形式有点强大,因为它可以携带方法不能携带的信息。
然后我有一个函数(递增器),我可以反复调用它;注意它如何保持变量不变。
至于 (二) ,正如有人指出的,您可以在任意点更改渲染函数。假设您决定更改渲染的工作方式。假设您想创建渲染的定时版本。你可以这样做;
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 6 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 6 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 6 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 6 月前 |