11

我刚刚在 MSDN Channel 9 上观看了一个视频,可以在这里找到,关于 Visual Basic 10 中的一些新功能。现在我喜欢大多数新功能,其中一些期待已久(自动属性和集合初始化器) ,引起我注意的是 C# 中的多行 lambda。

在视频中,他使用了一个这样的例子:

Dim scores = {10,20,30,40,50}
Dim thread as new Threading.Thread(Sub()
                                   For Each o in scores
                                     console.writeline(o)
                                     Next
                                   End Sub)

现在我喜欢 VB 的冗长,但我只是有点担心编写 sub...end sub inline 可能会有点混乱,当你只需要使用某些东西时,我可以看到在编写 C# 时内联的一些优点像 c => {....} 你可以删掉很多代码。

您在 VB 中对多行 lambda 的了解是什么?

你会发现它们有用吗?在哪里?

4

7 回答 7

14

就个人而言,我认为 VB 的委托和 lambda 语法完全是假的。我的意思是,来吧,AddressOf!这在 VB6 中很好。在像 VB.NET 这样的语言中,函数应该被视为一等公民(尽管它们确实不是,当然)并且从方法组到委托的转换或多或少是透明的,这绝对是不好的。

现在引入内联函数非常冗长。我实际上相信 C# 方法x => f(x)在 VB 中会表现得很好,因为它准确地显示了它的作用。在目前的状态下,我更喜欢 C# 来进行任何函数式编程工作,这很遗憾,因为我通常更喜欢 VB。

现在,我真的很高兴 VB 终于获得了多行 lambda 和语句 lambda,因为它们有时仍然有用(以 为例Parallel.For)。但是语法很混乱。顺便说一句,迭代器也是如此(如果它们应该进入 VB10)。

于 2008-10-30T07:48:39.473 回答
4

根据偏好,我是一名 C# 开发人员,但现在几乎只使用 VB 9 大约一年了。VB 9 让我心碎的第一件事是有限的 lambda。VB 9 中的 Lambda 在以下方面受到限制:

  • 只有一种说法。
  • 它们必须返回一个值。

所以集合上的 ForEach 方法不适用于 lambda,只有最简单的操作才能工作。所以大多数时候你必须将你的逻辑转移到其他方法并使用 AddressOf。很多时候,这以戏剧性和令人心碎的方式破坏了代码的可读性。

我觉得很多人不会接受,除非他们在完全支持它们的另一种语言(C#、JavaScript 等)中流利地使用匿名方法,而不是他们在 VB 9 中的残缺支持。

他们在 VB 10 中修复了 lambda,我感到非常欣慰。

于 2008-11-04T16:51:03.850 回答
2

我可以想到两个我喜欢它的原因!等这个太久了。

第一的:

 Private Sub SomeMethod()
     Dim SomeVariable as String = "Some text."

     AddHandler SomeButton.Click, Sub()
                                      SomeVariable += " Some more text"
                                      MessageBox.Show(SomeVariable)
                                  End Sub

第二:

 Private Sub SomeMethodRunningInAnotherThread()
     Me.Dispatcher.Invoke(Normal, Sub()
                                      'Do some other stuff '
                                      SomeTextBox.Text = "Test"
                                  End Sub)
 End Sub
于 2008-10-30T06:54:28.380 回答
2

同样在这里,我喜欢vb。大多数时候你是在思考而不是真正写代码,所以在我看来冗长的论点是失败的,因为你通常盯着代码或编辑它,想象一下当你阅读它的代码时,你节省了理解代码的时间vb中的冗长?与 c# 相比,更容易,更少的错误和错误。

此外,c# 仍然没有 with 子句,而 vb 甚至在 .net 时代之前就有了。

With obj.class.methods

   .property = 1

   .attribute = 2

End with

想象一下这需要设置 10 个东西?在 c# 中,您必须创建对 obj.class.methods 的引用并将其用于速记表达,这是浪费内存且效率低下,因此在这方面 vb 确实使用较少的内存,并且与使用较少的内存不同,您不会因使用较少的内存而受到惩罚C# 。

并且“using”关键字参数失败,因为 using 不适用于大多数对象或未实现 idisposable 的对象,这绝对令人讨厌。

然后,想想你必须在 c# 中而不是 vb 中进行的所有显式转换。C#errs 会争辩说这是鼓励更好的编码,但这是无稽之谈,因为任何优秀的开发人员都不需要每天显式转换 500 次来理解如果他不这样做,就会发生隐式转换(就像它在vb)。

大多数 c#errs 都使用它,因为他们来自 ac 背景,这很好,但我发现很多人都是从它开始的,因为它包含字母 c,他们认为它更酷,因为它缺乏 vb 所具有的语言创新,使其成为对开发人员来说更难,这让他们感觉更聪明、更酷,而且比其他人都高 - 哈哈,他们不明白以 0 成本隐藏复杂性是最终目标,这就是 vb 可以为你做的。请注意零成本部分,因为如果它的成本高于零,那将不是一件好事。

于 2010-10-23T17:53:30.387 回答
0

VB 中完整的匿名方法支持意味着您可以开始对事物采取更具功能性的风格。如果 Sub() End Sub 需要在不同的行上运行……那很痛苦。我希望他们允许单行匿名方法,只要只有一个声明。

于 2008-10-30T05:05:44.917 回答
0

一旦我们获得 ParallelFX 库,您将需要多线。

例如,假设您想让这个循环并行:

For i = 0 to 100
  '12 lines of code'
Next

并行版本将是:

Parallel.For( 0, 100, sub(i)
  '12 lines of code'
  End Sub )

它通过将循环的胆量变成一个全新的子来工作。新的 sub 由 N 个线程调用,N 通常是可用内核的数量。

于 2008-10-30T06:14:02.127 回答
0

没有简单的方法来管理这个:

将 C# 语句体 lambda 转换为 VB

没有多行 lambda。

所以,是的,我急于完全释放它。

-亚当

于 2009-10-14T20:21:23.227 回答