我有一个团队,人是在C#中很舒服,但我们得到了写在VB.net项目的要求。 它会很难想到在C#和动态转换到VB? 是不是可行?
你可以列出我们能够遇到问题?
听说VB.net没有关闭。 是尚真对.NET 3.5?
我有一个团队,人是在C#中很舒服,但我们得到了写在VB.net项目的要求。 它会很难想到在C#和动态转换到VB? 是不是可行?
你可以列出我们能够遇到问题?
听说VB.net没有关闭。 是尚真对.NET 3.5?
如果您正在使用C#的心态接近VB.Net,最好设置以下选项中的项目
这基本上消除VB.Net的后期绑定语义,并迫使它是一个严格的类型语言。 这将使它更接近C#语义明智的(还没有确切的任何手段)。
VB.Net有Lambda表达式(并因此关闭)开始支持与Visual Studio 2008 / .NET Framework 3.5的版本。 不表达,而不是语句。 lambda表达式不支持,直到VS2010 / .NET框架4.0。 虽然你可以使用4.0编译器downtarget 2.0框架。
C#和VB.NET使用相同的框架,并编译成非常相似的IL代码,你有很多是免费的。 编写基本的语法,而不是并不难。
C#的语法更加旨在展现发生了什么事情,而VB语法往往隐藏了一些细节,所以C#程序员已经熟悉了一些概念,可能并不明显,一个VB程序员。 在某些方面,学习C#是学习VB是如何工作的,而不是学习VB本身就是一个更好的办法?
我经常回答大多是基于我的C#的知识不同的论坛VB.NET的问题,我还没有写任何东西比在VB.NET自己短的测试程序更多。
当然也有一些怪癖在VB看出来的。 像/操作者例如总是转换两个操作数的两倍,或使用VB特定比较代码,而不是在.NET类平等操作者指定的比较=操作数。
该VB.NET往往试图掩盖正在与事件的一个领域; 其他人简要介绍了一些分歧,但这里多了几分它们:
VB.NET提供了一个WithEvents
对引发事件的字段关键字。 如果字段声明WithEvents
那么你可以添加一个Handles field.Event
到其签名与该事件对应的方法结束; 该方法将自动成为事件的代表,而无需手动AddHandler
和RemoveHandler
( +=
和-=
)。
Private WithEvents SomeField
Public Sub SomeField_SomeEvent(sender as Object, e as EventArgs) Handles SomeField.SomeEvent
Console.Writeline("SomeEvent occured")
End Sub
事件的声明和引发事件被简化了一下。 VB.NET不要求您检查事件是否为空之前,通知听众:
Public event SomeEvent as EventHandler(of SomeEventArg)
Public Sub SomeMethod()
RaiseEvent SomeEvent(Me, new EventArgs)
End Sub
在VB.NET的事件之一“隐藏”功能访问底层MulticastDelegate
,像做GetInvocationList()
注:该事件被命名SomeEvent
并访问multicastdelegate调用一个名为无形领域的代码SomeEventEvent
:
Public event SomeEvent as EventHandler(of SomeEventArg)
Public Sub SomeMethod()
// Note that SomeEvent's MulticastDelegate is accessed by appending
// another "Event" to the end, this sample is redundant but accurate.
// If the event was named ListChanged then it would be ListChangedEvent
dim invocationList = SomeEventEvent.GetInvocationList()
End Sub
其中一个我发现的最大问题是VB的明显冗长。 它具有所有这些大的关键字,例如MustInherit
, NotInheritable
, MustOverride
等,其中C#只是有东西像sealed
, abstract
和virtual
。 你必须有一个End
的一切( End Sub
, End Function
, End While
, End Namespace
, End Class
等),你必须明确地标记与只读属性ReadOnly
关键字; 简单地忽略二传手不会飞。 还记得AndAlso
和OrElse
,而不是更直观的(但非短路), And
和Or
,事情就是这样Is Nothing
和IsNot Nothing
,而不是== null
或!= null
。
这些都不是必然的语言问题 ,但如果你习惯了C#相对简单,VB代码可能看起来像一大堆额外的东西给你。
有在Visual Studio杂志早在2008年1月一些有用的文章。
您可能也有兴趣在这个问题:“ 这是在C#中(反之亦然),禁止什么是允许在VB ”
它在这里没有提到的一点是在基础构造函数之前C#运行该字段初始化,而那些在基础构造和派生类的构造函数的第一个“真正”的语句之间VB运行(基构造函数调用后,如果有的话)。 这使得有可能对字段初始化在派生类利用基类成员(其可能已使用传递给构造参数初始化),但也意味着,如果一个对象的基础类构建通过本身之前的任何地方它返回,可能会使用的部分构造的对象的所有字段初始运行之前。 在C#,基部构造开始执行之前的所有字段初始的将运行,但没有一个字段初始的将能够使用局部构造的对象。
PS - 如果有的话背后C#的微软人的阅读,会有添加字段声明上下文敏感的关键字任何特别的困难,以指定是否在之前或基类的构造后进行处理,或可能让他们通过一些执行特殊的方法,可以从构造被调用,这可能在一个try-finally块(所以任何IDisposables从而分配可以清理)被包裹,并且还可能能够利用传递给构造函数的参数?
我觉得这是在强调差异的得心应手的文章。 我是一个程序员vb.net,这可以帮助我弄清楚C#代码,所以我敢肯定它会工作的其他方式!
http://www.codeproject.com/KB/dotnet/vbnet_c__difference.aspx
就像任何语言(人或计算机),你首先要学会“在你的头上翻译”,那么你最终开始“思考”的另一种语言。
越快你的团队可以作出这样的飞跃,就更好了。 所以,做同样的方式,专家告诉你学习人类语言:真实世界的例子和浸泡。
有几个C#可用的在线VB.NET转换工具,因此通过在C#中的团队写开始,转换为VB.NET和清理。 (该转换工具的质量变化,并且有一定的局限性,尤其是使用较新的语言特性。)
一旦他们获得基本的窍门“语法”拖放到VB.NET 100%。
我在每天同一时间同时使用,经常在不同的代码窗口,并没有任何问题的上下文切换或在做每一个“正确的事”。
除了什么贾里德已经提到的,你应该在做这个没有问题。 刺激性的唯一其他来源是怪异的默认值。 EG你知道VB.NET项目,默认情况下隐藏在Solution Explorer中引用的节点? (您必须选择ShowAllFiles看到它)。
我认为C#到VB.NET不会太痛苦,只是学习一种新的语法的情况。 在目前的版本中这两种语言的能力是相当紧密结合。
反过来想,因为人们可能会被用来利用“我的”命名空间和其他的东西摆在那里,使VB6开发宾至如归的感觉(VB.NET到C#)可能会更难。
有一些你必须注意的细微差别。 例如VB.Net没有短路的概念if语句(我已得到纠正,显然它)。 如果它只是一个短期的项目,你可能不会有问题,但不同的语言确实有不同的方法来解决同样的问题。 这方面的一个例子是Python程序员谈论的“Python化”的方式做事。 他们谈论这个概念在这本书中梦断代码,其中Java程序员试图使用Python语法编写的Java。 它导致服用很长的路绕到解决问题。 会出现这种情况与C#和VB.Net? 这是很难说的,它们都使用的基本框架的工作,所以差异不会很大,但它仍然会帮助尝试和学习如何使用VB.NET它的目的的方式。
编辑:那么明显,但它确实有短路的概念,但它默认情况下并不其中C#不这样做。 这只是进一步证明了学习语言的功能如何能在长期而言是有益的地步。
我不认为这是太辛苦了。 VB.NET和C#是接近对方的语言,只有真正的语法不同。 当然,这将需要一段时间,您的团队来适应新的语言,但我不认为你会碰到很大的问题。
哦,VB.NET确实有关闭。 它遗漏从C#类的产量关键字,多lambda表达式和汽车性能的其他一些功能,但没有非常关键。
如果你不喜欢写vb.net代码的一个选择是编写你的项目在C#中,编译它,并使用反射来看看vb.net相当于是什么样子。 这一切都编译成MSIL反正!