Области кода, не разрешенные в телах методов в VB.NET?
-
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
Это в основном завершает код.А затем, чтобы сделать его еще более аккуратным и удобным для поиска, вы можете прокомментировать код.Конечный результат будет выглядеть примерно так:
Я не знаю насчет 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 года.