Области кода не допускаются в теле методов в VB.NET? - PullRequest
32 голосов
/ 30 июня 2010

Примечание : эта «функция» теперь добавлена ​​в Visual Studio 2015, но вопрос будет затягиваться, поскольку не каждый разработчик или каждый магазин разработчиков получают доступ к самой последней и лучшей IDE, как только она

ОРИГИНАЛЬНЫЙ ВОПРОС:

Обычно я бы не "нуждался" или даже не рассматривал бы нелепую особенность, такую ​​как области кода в теле метода, но:рефакторинг кода VB.NET, где методы обычно запускают пятьсот или более строк кода и ссылки настолько тесно связаны, что код не поддается простому рефакторингу, такому как извлечение метода.

И именно поэтому я подумал, что попробую регионы внутри тела метода.Я просто хотел организовать код на короткий срок.Но IDE не позволяет мне (что привело к ошибке компилятора.) Мне просто интересно, почему?Похоже, области кода не должны влиять на компилятор, intellisense и т. Д. Я что-то упустил?(Все еще использую VS 2005 между прочим.)

Интересно: Кажется, это зависит от языка.Это нормально в C # (я не проверял это первоначально), но не в VB.NET.

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

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

, который получает ошибку компилятора, но версия C # в порядке.

Ответы [ 8 ]

19 голосов
/ 30 июня 2010

Я думаю, что области кода, вероятно, не будут поддерживаться в теле метода, так как они, как вы выразились, были бы (несколько) нелепой особенностью. Однако в C # это работает , по крайней мере, в VS 2008 и VS 2010 - только не в VB.NET.

При этом я бы этого избегал. Помещение областей в тело метода просто приведет к тому, что люди будут создавать более крупные методы (поскольку это единственный раз, когда это будет целесообразно), чего следует избегать, а не поощрять.

Если ваш код:

не поддается простому рефакторингу, такому как метод извлечения

Вместо этого я бы сосредоточился на проведении «сложного» рефакторинга (или чего бы то ни было), чтобы попытаться сломать эти методы. Ваши методы длиной в четыре или пятьсот строк вообще не могут быть сохранены в их текущем состоянии.

Лично я бы оставил их вызывающими "боль" - пояснил, что им нужна работа, справа спереди и по центру, пока вы не разбите их и не произведете рефакторинг порций.

16 голосов
/ 30 июня 2010

Это явно указано в главе 3.3 спецификации языка Visual Basic 9.0:

Директивы регионов группируют строки исходного кода, но не оказывают никакого другого влияния на компиляцию.Вся группа может быть свернута и скрыта или расширена и просмотрена в интегрированной среде разработки (IDE). Эти директивы особенные в том, что они не могут ни начинаться, ни заканчиваться в теле метода

Или другими словами: вы не можете сделать это, потому что спецификация говорит об этом.

Относительно того, почему он был указан таким образом, я считаю, что он имеет какое-то отношение к старой функции IDE, которой VB обладает, насколько я себя помню,: Инструменты + Параметры, Текстовый редактор, Базовый,VB Specific, Показать разделители процедурных строк.Это всего лишь предположение, вероятно, не очень хорошее.


Обновление: теперь поддерживается Roslyn, сначала включено в VS2015.

15 голосов
/ 18 декабря 2014

Другой простой альтернативный метод:

Что вы можете сделать, это в основном выбрать код, который вы хотите добавить #Region #End Region, и щелкнуть:

Ctrl + M , Ctrl + H

По сути, это обертка кода.А затем, чтобы сделать его еще проще и удобнее, вы можете прокомментировать код.Конечный результат будет выглядеть примерно так:

enter image description here

11 голосов
/ 24 ноября 2015

По состоянию на Ноябрь 2015 года: В Visual Studio 2015 теперь поддерживается, просто делайте что хотите.

Пример кода:

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

Примечание: В более ранних версиях Visual Studio кажется, что он не работает в VB.NET, но в C # он работает.

10 голосов
/ 30 июня 2010

Я не знаю о VB, но в C # это разрешено начиная с 1.0, насколько я знаю.

Действительно, вы даже можете разместить области кода в нечетных местах, которые пересекают области видимости. Например:

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

Здесь регион начинается внутри оператора if, но заканчивается вне его. Ужасно, но с компилятором все в порядке.

Что вы имеете в виду, когда говорите, что среда IDE не позволяет вам размещать код в регионах? Вы получили ошибку компилятора?

4 голосов
/ 30 июня 2010

Это был просто выбор, который команда VB сделала при добавлении функции регионов в версию 7 языка Visual Basic.Это было замечено как особенность, которая была полезна для организации на уровне объявления, а не внутри метода и, следовательно, была разрешена только на этом уровне.

Команда C # по-разному относится к этой функции и разрешает ее во многих других местах.Меня всегда удивляло, что директивы C # #region могут встречаться в разных контекстах объявления.

#region Foo
class Bar {
#endregion

}

Эквивалентный код не допускается в VB.

3 голосов
/ 08 августа 2015

Для тех, кто ищет самый последний ответ на этот вопрос, теперь это возможно в VB.NET (начиная с версия 14 вкл.)

Директивы регионов внутри органов методов

Вы можете поместить # Region… # End Delimiters Region в любом месте файла, внутри функций и даже через тела функций.

Пример из OP теперь имеет совершенно правильный синтаксис:

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

    #Region "Test"
    Console.WriteLine ("")
    #End Region
End Sub
1 голос
/ 03 июля 2010

В Visual Studio 2003 они были для VB.NET, но функция была удалена в Visual Studio 2005 и более поздних версиях.Действительно раздражает при рефакторинге больших процедур, но вы можете разделить окно кода.

Честно говоря, я бы хотел, чтобы C # ограничивал использование регионов, потому что они чрезмерно используются.У меня есть макрос, который удаляет их из всех файлов кода при наследовании проектов C #.

Еще одной удаленной функцией был список переопределяемых методов в Панель навигации .Я проверяю, добавляли ли они эту функцию повторно для каждой новой версии Visual Studio с 2005 года.

...