2010-06-30 4 views
31

Note: Cette "fonctionnalité" a maintenant été ajoutée à Visual Studio 2015, mais la question durera un certain temps puisque tous les développeurs et développeurs n'ont pas accès à l'IDE le plus récent dès sa sortie.Les régions de code ne sont pas autorisées dans les corps de méthode dans VB.NET?

QUESTION ORIGINAL:

Normalement, je ne serais pas « besoin » ou même d'envisager une caractéristique ridicule comme les régions de code au sein des instances de la méthode, mais: Je suis refactorisation du code VB.NET où exécuter des méthodes couramment cinq cents lignes de code ou plus et les références sont si étroitement couplées que le code défie le refactoring simple tel que l'extraction de méthode.

Et c'est pourquoi j'ai pensé que j'essaierais des régions dans un corps de méthode. Je voulais juste organiser le code pour le court terme. Mais l'IDE ne me laisse pas (a entraîné une erreur de compilation.) Je suis juste curieux de savoir pourquoi? On dirait que les régions de code ne devraient pas avoir d'impact sur le compilateur, l'intellisense, etc. Suis-je en train de manquer quelque chose? (Toujours en utilisant VS 2005 btw.)

Intéressant: Cela semble être spécifique à la langue. C'est OK en C# (je ne l'ai pas vérifié au début) mais pas en VB.NET.

public module MyModule 
    Sub RunSnippet() 
     dim a as A = new A (Int32.MaxValue) 

     #region 
     Console.WriteLine ("") 
     #end region 
     .... 

qui obtient une erreur de compilation mais la version C# est correcte.

+1

Cela devrait fonctionner. Pouvez-vous nous donner plus de détails? –

+1

Cela fonctionne en C#, mais pas VB.NET ... –

+0

Cela fonctionne depuis VB.NET 14.0 (Visual Studio 2015). Quelqu'un a déjà ajouté la réponse ci-dessous. – miroxlav

Répondre

9

Au Novembre 2015: Dans Visual Studio 2015 il est maintenant pris en charge, faire tout ce que vous aimez.

Exemple de code:

With frmMain 
#region "A sample region in odd place" 
    .show() 
    .text = "Sample" 
#end region 
End With 

Note: Dans versions antérieures de Visual Studio, il semble que cela ne fonctionne pas en VB.NET, mais en C#, il travaille.

+2

+1 et resélectionné comme meilleure réponse. Merci @Cary Bondoc: J'ai ajouté une note à propos de votre réponse à la question initiale. –

+0

@PaulSasik merci beaucoup pour avoir considéré ma réponse, la technologie change si vite! :) –

+1

Pour moi, '# region' et' end region' sont toujours déplacés au début de la ligne (pas de retrait comme C# ou comme le code dans votre exemple). Est-ce que quelqu'un peut le confirmer? Y at-il un travail autour? parce que c'est vraiment énervant! –

18

Je pense que les régions de code ne serait probablement pas pris en charge dans les organes de la méthode car ils, comme vous le dites, serait un (peu) « caractéristique ridicule » - Cependant, en C#, ce fait travail, au moins en VS 2008 et VS 2010 - juste pas dans VB.NET. Cela étant dit, je l'éviterais. Placer des régions dans un corps de méthode conduirait simplement les gens à faire des méthodes plus grandes (puisque c'est la seule fois où cela en valait la peine), ce qui devrait être évité, pas encouragé.

Si votre code:

défie refactoring simple tel que l'extraction de la méthode

Je me concentrerais plutôt sur faire refactoring « complexe » (ou tout ce qu'il faut) pour essayer de briser ces méthodes. Il n'y a aucun moyen que vos méthodes longues de «quatre ou cinq cents lignes» soient maintenables dans leur état actuel. Personnellement, je les laisserais causer de la «douleur» - faites en sorte qu'il soit évident qu'ils ont besoin de travailler, juste avant et au centre, jusqu'à ce que vous puissiez les casser et refactoriser des portions.

+0

Mais ils * sont * pris en charge dans les corps de méthode ... –

+3

@Jon: Cependant, ils ne sont pas supportés dans VB.NET. Juste en C#. J'ai reformulé ... sonne mieux? –

+3

Oui, dans un monde idéal, nous n'aurions pas de grandes méthodes difficiles à refactoriser. Mais dans le monde réel, nous avons plus de 1000 corps de méthode, et pas de budget pour passer le refactoring. Par conséquent, ce serait vraiment génial si je pouvais insérer #regions dans mon code vb.net. Peut-être que je vais devoir écrire un plugin ... – mellamokb

10

Je ne sais pas sur VB, mais en C# cela a été autorisé depuis 1.0 autant que je sache. En effet, vous pouvez même mettre des régions de code dans des endroits impairs qui traversent des étendues. Par exemple:

class Test 
{ 
    static void Main() 
    { 
     if (DateTime.Now.Hour > 12) 
     { 
#region Foo 
      Console.WriteLine("Afternoon");    
     } 
#endregion 
    } 
} 

Ici la région commence dans l'instruction if, mais se termine l'extérieur. Horrible, mais le compilateur va bien avec. Que voulez-vous dire quand vous avez dit que l'EDI ne vous "laissait pas" mettre du code dans les régions?Avez-vous eu une erreur de compilation?

+0

J'utilisais des régions dans une solution VS2005 mid-method sans problème. Je ne peux pas me porter garant pour VS2003 –

+1

Vous obtenez des erreurs dans VB.NET: "Les erreurs 4 '#Region' et '#End Region' ne sont pas valides dans les corps de méthode/multiline lambdas." –

4

Ce fut tout simplement un choix de l'équipe VB fait lors de l'ajout des régions disposent dans la version 7 du langage Visual Basic. Il était considéré comme une fonctionnalité utile pour l'organisation au niveau de la déclaration et non à l'intérieur d'une méthode et n'était donc autorisée qu'à ce niveau.

L'équipe C# ressenti différemment sur cette fonctionnalité et permet dans de nombreux autres endroits. J'ai toujours trouvé surprenant que les directives C# #region puissent apparaître dans différents contextes de déclaration.

#region Foo 
class Bar { 
#endregion 

} 

Le code équivalent n'est pas autorisé dans VB.

+0

J'ai supprimé ma réponse car elle n'était plus pertinente. Merci pour l'illumination sur celui-ci. – Robaticus

16

Il est explicite au chapitre 3.3 du Visual Basic 9.0 Spécification du langage:

directives Région lignes de groupe de code source, mais avoir d'autre effet sur la compilation. Le groupe entier peut être réduit et masqué, ou développé et visualisé, dans l'environnement de développement intégré (IDE). Ces directives sont particulières en ce sens qu'ils ne peuvent ni commencer, ni mettre fin à l'intérieur d'un corps de méthode

Ou autrement dit: vous ne pouvez pas le faire parce que la spécification dit. En ce qui concerne les raisons pour lesquelles cela a été spécifié, je pense que cela a quelque chose à voir avec l'ancienne fonction IDE de VB depuis toujours: Outils + Options, Éditeur de texte, Basique, Spécifique à la VB , Afficher les séparateurs de ligne de procédure. C'est juste une supposition, probablement pas très bonne.


Mise à jour: maintenant pris en charge par Roslyn, inclus d'abord avec VS2015.

+1

ma conjecture serait parce que #Region commence par un caractère # # ..et VB vous permet de spécifier une date par '# 10/13/2009 #'. –

1

Visual Studio 2003 les avait pour VB.NET, mais fonction a été supprimée dans Visual Studio 2005 et versions ultérieures. Vraiment gênant lors de la refactorisation de grandes procédures, mais vous pouvez diviser la fenêtre de code.

Honnêtement, je souhaite C# limiterait l'utilisation de la région parce qu'ils sont trop utilisés. J'ai une macro qui les dépouille de tous les fichiers de code lors de l'héritage des projets C#.

Une autre fonctionnalité supprimée était la liste des méthodes remplaçables dans la barre de navigation . Je vérifie pour voir si elles réinsérés dans cette fonction pour chaque nouvelle version de Visual Studio depuis 2005.

15

Une autre méthode alternative simple:

Ce que vous pouvez faire est de sélectionner essentiellement le code que vous souhaitez ajouter #Region #End Region et fondamentalement cliquez sur:

Ctrl +M, Ctrl +H

Cela enveloppe fondamentalement le code. Et puis, pour le rendre encore plus propre et facile à trouver, vous pouvez commenter le code.Le résultat final ressemblerait à quelque chose comme ceci:

enter image description here

3

Pour ceux qui cherchent la réponse la plus récente à cette question, il est maintenant possible en VB.NET (à partir de version 14 sur).

directives Région intérieur Bodies Méthode

Vous pouvez mettre # # Région ... Région Fin délimiteurs ne importe où dans un fichier, fonctions à l'intérieur, et couvrant même à travers les corps de la fonction.

L'exemple de l'OP est maintenant parfaitement la syntaxe juridique:

Sub RunSnippet() 
    Dim a as A = New A (Int32.MaxValue) 

    #Region "Test" 
    Console.WriteLine ("") 
    #End Region 
End Sub 
Questions connexes