你怎么看待VB 10中的多行lambdas

时间:2008-10-30 04:57:38

标签: vb.net lambda

我正在观看有关MSDN第9频道的视频,可以找到here,关于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有什么看法?

你会发现它们有用吗?

7 个答案:

答案 0 :(得分:14)

就个人而言,我认为VB的代表和lambdas的语法完全是假的。我的意思是,来吧,AddressOf!这在VB6中很好。在VB.NET等语言中, 从方法组到代理的转换或多或少是透明的。

现在内联函数的引入非常冗长。我实际上相信C#方法 - x => f(x)在VB中表现得非常好,因为它显示了它的确切功能。在目前的状态下,我更喜欢C#进行任何函数编程工作,这很可惜,因为我一般都喜欢VB。

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

答案 1 :(得分:4)

我喜欢C#开发人员,但现在几乎只使用VB 9大约一年了。关于VB 9的第一件事就是有限的lambdas。 VB 9中的Lambdas在以下方面受到限制:

  • 只有一个陈述。
  • 他们必须返回一个值。

因此集合上的ForEach方法不适用于lambdas,只有最简单的操作才有效。所以大多数时候你必须将你的逻辑移动到其他方法并使用AddressOf。很多时候,这会以戏剧性和令人心碎的方式切割代码的可读性。

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

我非常欣慰他们正在修复VB 10中的lambda。

答案 2 :(得分: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

答案 3 :(得分: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”关键字参数失败,因为使用不适用于大多数没有实现idisposable的对象或对象,这是非常烦人的。

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

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

答案 4 :(得分:0)

VB中的完全匿名方法支持意味着您可以开始使用更实用的样式。如果Sub()End Sub需要单独行...那会很痛。我希望他们允许使用单行匿名方法,只要有一个声明。

答案 5 :(得分:0)

获得ParallelFX库后,您将需要多行。

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

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

并行版本将是:

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

它的工作原理是将循环的内容变成一个全新的子。新的子程序由N个线程调用,N通常是可用内核的数量。

答案 6 :(得分:0)

没有简单的方法可以解决这个问题:

Convert C# statement body lambda to VB

没有多行lambda。

叹息

所以是的,我很担心这会被完全释放。

- 亚当