Области кода, не разрешенные в телах методов в VB.NET?

StackOverflow https://stackoverflow.com/questions/3151722

  •  01-10-2019
  •  | 
  •  

Вопрос

Примечание:Эта "функция" теперь добавлена в 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 # в порядке.

Это было полезно?

Решение

По состоянию на Ноябрь 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 # это работает.

Другие советы

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

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

Если ваш код:

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

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

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

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

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

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

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


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

Еще один простой альтернативный метод:

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

Ctrl+M, Ctrl+H

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

enter image description here

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

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

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

Вот этот регион начинается в пределах if утверждение, но концы вне его.Ужасно, но компилятор с этим справляется.

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

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

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

#region Foo
class Bar {
#endregion

}

Эквивалентный код не разрешен в VB.

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

Региональные директивы внутри Тел методов

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top