我正在观看有关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有什么看法?
你会发现它们有用吗?
答案 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)