9
votes

Conversion de C # Connaissances à VB.NET Tous les problèmes potentiels?

J'ai une équipe avec des personnes assez à l'aise en C #, mais nous avons eu besoin d'écrire un projet dans VB.NET. À quel point serait-il difficile de penser en C # et sur la mouche convertir en VB? Est-ce que c'est faisable?

Pourriez-vous énumérer les problèmes que nous pouvons rencontrer?

J'ai entendu dire que vb.net n'a pas de fermeture. Est-ce toujours vrai pour .NET 3.5?


4 commentaires

Cela ne vaut pas vraiment la peine de répondre, mais la conservation visuellement organisée visuellement est plus difficile que c # puisque les mots-clés sont plus grands et plus variés, et il n'y a pas de crochets (qui aident avec l'espace vertical). Les méthodes écrites dans VB.NET et C # Mettez la côte à côté seront généralement laissées par la logique C # plus claire.


Pourquoi est-ce une exigence? Cela n'a pas beaucoup de sens. Pouvez-vous nous donner plus de fond pour que nous n'ayons pas gratté nos têtes?


J'avais tenu un projet qui avait une telle exigence non fonctionnelle.


Je ne suis pas d'accord avec YooDer - la plupart des gens trouvent vb.net plus lisible parce qu'il est plus verbeux. Je suis sûr que tout le monde ici sera en désaccord depuis que c # est plus cool.


14 Réponses :


0
votes

Je ne pense pas que ce serait trop difficile. VB.NET et C # sont des langues proches les unes des autres, seule la syntaxe diffère vraiment. Bien sûr, il va prendre un certain temps pour que votre équipe s'habitue à la nouvelle langue, mais je ne pense pas que vous rencontrez de gros problèmes.

OH, et vb.net a des fermetures. Il manque quelques autres fonctionnalités de C # comme le mot-clé de rendement, la relevé multi-instruction Lambdas et les propriétés automatiques, mais rien de très critique.


2 commentaires

VB9 a des fermetures de fonction à une ligne. VB10 a les mêmes fermetures que c #.


@Strilanc, lambdas et fermetures sont des concepts distincts. La mise en œuvre de la fermeture pour VB.NET est inchangée entre 9.0 et 10,0. La mise en œuvre de la Lambda varie considérablement.



14
votes

Si vous approchez VB.NET avec la mentalité de C #, il est préférable de définir les options suivantes dans le projet

  • option stricte sur
  • Option Explicit sur
  • Inférer l'option sur

    Cela supprime essentiellement la sémantique contraignante tardive de VB.NET et la force à être une langue strictement dactylographiée. Cela rendra plus proche de c # sage sémantique (toujours pas exact par aucun moyen).

    VB.NET possède une prise en charge de Lambda Expression (et d'une fermeture) à partir de la version Visual Studio 2008 / .NET Framework 3.5. Pas expression et pas de déclaration. La déclaration Les Lambdas ne sont prises en charge qu'au VS2010 / .NET Framework 4.0. Bien que vous puissiez utiliser le compilateur 4.0 dans les cadres DownTarget 2.0.


0 commentaires

0
votes

Je pense que c # à vb.net ne sera pas trop douloureux, il n'est qu'un cas d'apprentissage d'une nouvelle syntaxe. Dans les versions actuelles, les capacités des deux langues sont relativement étroitement alignées.

L'inverse ronde (VB.NET à C #) pourrait être plus difficile car les gens pourraient être utilisés pour utiliser l'espace de noms «mon» et d'autres choses placées pour faire ressentir des développeurs VB6 à la maison.


0 commentaires

0
votes

Il y a quelques différences subtiles que vous devrez faire attention. Par exemple, vb.net n'a pas de concept de court-circuit d'une déclaration IF (j'ai été corrigé que apparemment cela le fait). Si ce n'est qu'un projet à court terme, vous n'aurez probablement pas de problème, mais différentes langues ont des approches différentes pour résoudre le même problème. Un exemple de ceci est que les programmeurs Python parlent de faire des choses dans la voie «Pythonic». Ils parlent de ce concept dans le livre qui rêvait dans le code où les programmeurs Java essayaient de programmer Java en utilisant la syntaxe Python. Cela conduit à la résolution du problème. Cela se produira-t-il avec c # et vb.net? Il est difficile de dire qu'ils utilisent tous les deux le travail de cadre sous-jacent, de sorte que les différences ne seront pas énormes, mais cela aiderait toujours à apprendre à utiliser VB.Net comme il était destiné.

Edit: Donc, apparemment, il a le concept de court-circuit, mais cela ne le fait pas par défaut lorsque c # fait. Cela prouve simplement le point d'apprendre comment les fonctions de langue peuvent être bénéfiques à long terme.


3 commentaires

Je suis heureux que les courts-circuits soient mis en discussion. Tout le monde de mon équipe s'attendrait à si x n'est pas rien et x.method () ne lancerait pas une exception de pointeur nulle.


La structure des langues ne sont pas très différentes, ce qui est de retour, ils ont un ancêtre commun à Algol. La manière du code d'écriture C # se traduit généralement très bien vers VB.


Je comprends ce que vous dites, mais cette déclaration pourrait être faite pour beaucoup de langues. C ++, C #, Java, la liste passe et activée. Ils sont plus similaires que de comparer à Perl, mais il y a une divergence.



1
votes

Je trouve que cela soit un article pratique pour mettre en évidence les différences. Je suis un programmeur VB.NET, et cela vous aide à comprendre le code C #, alors je suis sûr que cela fonctionnera dans l'autre sens!

http://www.codeproject.com/kb/dotnet/vbnet_c__difence.aspx


2 commentaires

Étonnamment, qui laisse l'addhandler et retirezHandler pour vb.net vs "+ =" et "- =" pour c #. Une autre chose qui était rude lorsque vous allez à vb.net de C # était le mot clé "poignées" qui a suivi une méthode dans VB, souscrit à un événement.


Bon point. C'est aussi délicat de la direction C # avec AutoEventWireUp et aucune utilisation de «poignées». C'est un bon article expliquant les choses. odeCode.com/blogs/scott/archive/2006/02/ 16/914.aspx



1
votes

Tout comme n'importe quelle langue (humain ou ordinateur), vous premier apprendre à "traduire dans ta tête", vous finissez par commencer à «penser» dans l'autre langue.

L'équipe plus rapide peut faire ce saut, mieux c'est. Donc, faites-la de la même manière que les experts vous disent d'apprendre une langue humaine: des exemples du monde réel et une immersion.

Il y a quelques utilitaires de conversion VB.net disponibles en ligne, alors commencez par écrivez l'équipe en C #, convertir en VB.NET et nettoyez-le. (Les utilitaires de conversion varient en qualité et ont des limitations, en particulier avec des fonctionnalités de langue plus récentes.)

Une fois qu'ils ont reçu la suspension de la "grammaire" de base, laissez-les tomber dans VB.NET 100%.

J'utilise tous les deux tous les jours, souvent dans des fenêtres de code différentes en même temps et ne pose aucun problème de changement de contexte ou de faire la "bonne chose" dans chacun.


0 commentaires

2
votes

L'un des plus gros problèmes que j'ai trouvés est la verbosité apparente de VB. Il a tous ces grands mots-clés tels que mustinherit , notinhéritable , MUSTOVERRIDE , etc., où c # a des choses comme scellés , abstrait et virtuel . Vous devez avoir un fin à tout ( end sous , fonction d'extrémité , fin pendant , fin Espace de noms , Classe d'extrémité , etc.) et vous devez marquer explicitement les propriétés en lecture seule avec le mot clé ; Il suffit d'omettre le setter ne volera pas. Se souvenir également andalso et orelse au lieu du plus intuitif (mais non à court-circuit) et et ou ou , et des choses comme est rien et ne rien au lieu de == null ou ! = null . .

Aucun de ceux-ci n'est nécessairement problèmes avec la langue, mais si vous êtes habitué à la simplicité relative de C #, le code VB peut ressembler à beaucoup de choses supplémentaires à vous.


4 commentaires

Oui, VB est définitivement un peu plus verbeux, mais si la frappe est la plus grande partie de votre programmation, vous ne travaillez pas avec des projets presque assez difficiles ... :)


Vb.net est chattier, mais aussi plus descriptif. Si vous commencez à partir de .net, il est agréable de voir " hériter de la base de base implémente iSemeInterface que : base d'interface isomeinterface ; surtout lorsque vous essayez d'obtenir du code à compiler et quelque chose est simplement en panne. Après un certain temps, il devient ennuyeux cependant et les raccourcis de C # deviennent de plus en plus attrayants


@Guffa +1, drôle ... Bien que ce ne soit vraiment pas seulement la dactylographie, c'est la lecture, la compréhension et le refactoring.


@Guffa - beau commentaire. Mais c'est vraiment ennuyeux. J'ai travaillé avec de grands projets en C # et VB.NET. Et le meilleur exemple de cas que j'ai pour la dactylographie ennuyeuse est des paramètres pour les méthodes (AKA SOUS-SOUS-Fonctions :)) Sommaire SOMEMETHOD (String Var1, String Var2, Int Var3) est facile. Fonction publique SOMEMETHOD (BYVAL VAR1 AS String, Byval Var2 AS String, Byval Var3 en tant qu'intéger) en tant que chaîne. Aie. Les idées se produisent plus vite que je ne peux pas le taper :)



3
votes

AS C # et VB.NET utilise le même cadre et compiler un code IL très similaire, vous avez beaucoup gratuitement. Écrire la syntaxe de base à la place n'est pas si difficile.

La syntaxe C # est plus destinée à montrer ce qui se passe, tandis que la syntaxe VB se cache souvent quelques détails. Un programmeur C # est donc familiarisé avec certains concepts qui ne sont peut-être pas du tout évident pour un programmeur VB. D'une certaine manière que l'apprentissage C # est un meilleur moyen d'apprendre comment VB fonctionne que pour apprendre la VB elle-même ...

Je réponds souvent aux questions VB.NET dans différentes forums sur la plupart des forums sur la plupart de mes connaissances C #, et je n'ai toujours rien écrit de plus que de courts programmes de test dans VB.net moi-même.

Il y a bien sûr quelques bizarreries à rechercher dans VB. Comme l'opérateur / l'opérateur, qui convertit toujours les deux opérandes au double ou l'opérande = qui utilise un code de comparaison spécifique VB plutôt que la comparaison spécifiée pour l'opérateur d'égalité dans les classes .NET.


4 commentaires

+1 Je dis toujours que les gens apprennent la plate-forme .NET (en particulier celles neuves à OOP) d'apprendre C # d'abord, puis passez à VB si nécessaire. Rien de mal avec VB, mais pour les raisons pour lesquelles vous mentionnez C # vous donne une image plus claire de ce qui se passe dans le cadre IMO.


@JmGant: Je suis en désaccord, vb.net fournit une barrière inférieure à l'entrée que c # et vous permet de coder dans le monde .Net plus vite - bien que les raisons de rester dans VB.net diminuent rapidement. Je conseille généralement de commencer par VB.NET pour vous mettre à la hauteur, puis faites le saut à C # pour retirer les rideaux du reste du chemin.


@jmGant & Yoooder: Je pense que les deux moyens ont un mérite et chacun s'adapte mieux aux différentes personnes, selon qu'ils veulent s'installer ou s'enfoncer dans les dents. :)


Bonne réponse. Je fais la même chose que Guffa, mais en sens inverse. Je code dans VB mais répondez à des questions C # de temps en temps. Va montrer que le débat vb vs c # est futile car les deux langues sont en fait très proches (et se rapprocheront encore à l'avenir). Vous ne pouvez tout simplement pas dire qu'une langue est mauvaise (ou bien) sans dire que l'autre est aussi ;-)



0
votes

Une option si vous n'avez pas envie d'écrire le code VB.NET consiste à écrire votre projet en C #, compilez-le et utilisez le réflecteur pour voir ce que l'équivalent VB.NET ressemble. Tout cela se compile à MSIL quand même!


6 commentaires

Cela fonctionne parfois. Le code régénéré est le meilleur et si vous parlez d'une classe potentiellement importante, cela peut être douloureux.


@YOODERER, je n'ai jamais vu cela dans tout ce que j'ai travaillé avec. Je trouve que c'est un excellent outil d'apprentissage.


Cela n'a fonctionné que pour moi sur de petits échantillons; Chaque fois que je dois exporter une assemblée importante, je me trouve à corriger un montant équitable. Peut-être que c'est spécifique à la version du cadre que je travaille avec


Oui, je suis sûr que vous devez apporter des modifications, en particulier dans des scénarios plus compliqués. Par exemple, je ne sais pas comment les classes statiques se traduiraient par VB.NET, ou comment les paramètres facultatifs sont traités dans C # Pre 4.0. En tout cas, c'est toujours très pratique!


@Scotte, les classes statiques sont les plus étroitement analogues aux modules de VB. Vous ne pouvez pas instancier les modules et toutes leurs méthodes sont automatiquement statiques (et ne peuvent pas être explicitement déclarées comme telles).


+1 pour compenser le bowvote inutile. Ceci est un moyen parfaitement légitime de voir à quoi ressemblerait un bit de code VB correspondant. De toute évidence, ce n'est pas un moyen de traduire le code de production, mais c'est toujours un outil d'apprentissage utile.



3
votes

une zone que vb.net a tendance à essayer de couvrir fonctionne avec des événements; D'autres ont brièvement touché certaines des différences, mais voici un peu plus sur eux:

vb.net fournit un withEvents code> mot-clé pour les champs qui soulèvent des événements. Si le champ est déclaré withevents code>, vous pouvez ajouter un champ gérer le champ.Event code> à la fin d'une méthode dont la signature est compatible avec l'événement; Cette méthode sera automatiquement déléguée de l'événement sans avoir besoin de addhandler code> et retirerHandler code> ( + = code> et - = code >). P>

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


2 commentaires

Le dernier bit n'a rien à voir avec VB.NET PER-SE. C'est une fonctionnalité de cadre; Il n'y a même aucune syntaxe spécifique VB.


@Adam: La partie spécifique VB.NET est également ajoutée à l'événement au nom de l'événement afin d'accéder au délégué de multidiffusion.



2
votes

Il y avait quelques articles utiles dans le magazine Visual Studio de retour en janv. 2008.


0 commentaires

1
votes

Outre ce que Jared a déjà mentionné, vous n'avez pas eu de problèmes pour ce faire cela. La seule autre source d'irritation est étrange par défaut. PAR EXEMPLE. Saviez-vous que les projets VB.NET, par défaut, cachez-vous le nœud de références dans l'explorateur de solutions? (Vous devez sélectionner ShowallFiles pour le voir).


0 commentaires

2
votes

Un point qui n'a pas été mentionné ici est que les initialisateurs de champs en C # exécutés avant le constructeur de base, tandis que ceux de VB exécutent entre le constructeur de base et la première "relève" réelle "du constructeur de classe dérivée (après la base de la base -Constructeur appel, le cas échéant). Cela permet aux initialiseurs de champs dans une classe dérivée d'utiliser des membres de la classe de base (qui auraient pu être initialisés à l'aide de paramètres transmis au constructeur), mais signifie également que si le constructeur de classe de base d'un objet passe n'importe où avant Il revient, l'objet partiellement construit peut être utilisé avant que tous les initialisateurs de champ soient exécutés. En C #, tous les initialisateurs de terrain seront exécutés avant que le constructeur de base ne démarre d'exécution, mais aucun des initialiseurs de champ ne pourra utiliser l'objet partiellement construit.

PS - Si l'une des personnes Microsoft derrière C # lisez ceci, il y aurait une difficulté particulière d'ajouter un mot-clé sensible au contexte pour les déclarations de champs afin de préciser si elles doivent être traitées avant ou après le constructeur de base, ou éventuellement les avoir Effectué par une méthode spéciale qui pourrait être appelée à partir du constructeur, qui pourrait être enveloppée dans un blocage de l'essai-enfin (de sorte que tout iDisposables ainsi alloué pourrait être nettoyé) et pourrait également être en mesure d'utiliser des paramètres transmis au constructeur? < / p>


0 commentaires

1
votes

Apprécier l'âge de cette question, celui-ci est probablement assez connu maintenant, mais j'ajouterai le plus grand gotcha que j'ai vu en termes d'écriture vb.net comme un utilisateur C #:

rien code> ne signifie pas null code>, cela signifie par défaut (t) code> strong> p>

ceci signifie que ...

Dim a As Integer? = Nothing
If a = Nothing Then Console.WriteLine("a = Nothing")
If a <> Nothing Then Console.WriteLine("a <> Nothing")
If a Is Nothing Then Console.WriteLine("a Is Nothing")
If a IsNot Nothing Then Console.WriteLine("a IsNot Nothing")

'Output:
'a Is Nothing


0 commentaires