Примечание: Эта "опция" была теперь добавлена к Visual Studio 2015, но вопрос будет содержать некоторое время, с тех пор не каждый разработчик или каждый dev магазин получают доступ к последнему и самому большому IDE, как только это выходит.
ИСХОДНЫЙ ВОПРОС:
Обычно я не "нуждался" бы или даже рассмотрел бы смешную функцию, такую как регионы кода в телах метода, но: я осуществляю рефакторинг код VB.NET, куда методы обычно выполняют пятьсот строк кода или больше и ссылки так сильно связываются, что код игнорирует простой рефакторинг, такой как извлечение метода.
И вот почему я думал, что попробую регионы в теле метода. Я просто хотел организовать код в течение короткого срока. Но IDE не позволяет мне (привел к ошибке компилятора.) мне просто любопытно относительно почему? Кажется, что регионы кода не должны влиять на компилятор, intellisense и т.д. я пропускаю что-то? (Все еще использование VS 2005 btw.)
Интересный: Это, кажется, конкретный язык. Это в порядке в C# (я не проверял что первоначально), но не в VB.NET.
public module MyModule
Sub RunSnippet()
dim a as A = new A (Int32.MaxValue )
#region
Console.WriteLine ("")
#end region
....
это получает ошибку компилятора, но версия C# в порядке.
Я думаю, что области кода, вероятно, не будут поддерживаться в телах методов, поскольку они, как вы выразились, были бы (в некоторой степени) «нелепой особенностью». Однако в C # это работает , по крайней мере, в VS 2008 и VS 2010 - только не в VB.NET.
Сказав это, я бы этого избегал. Помещение областей в тело метода просто приведет к тому, что люди будут создавать более крупные методы (поскольку это единственный раз, когда это было бы целесообразно), чего следует избегать, а не поощрять.
Если ваш код:
не поддается простому рефакторингу, например, извлечению методов
, я бы вместо этого сосредоточился на выполнении «сложного» рефакторинга (или того, что для этого потребуется), чтобы попытаться разбить эти методы. Ваши методы длиной в четыре или пятьсот строк никак не поддерживаются в их текущем состоянии.
Лично я бы оставил их причинять «боль» - дать понять, что они нуждаются в доработке, справа впереди и по центру, пока вы не сможете разбить их и реорганизовать части.
Это явно указано в главе 3.3 спецификации языка Visual Basic 9.0:
Директивы региона группируют строки исходного кода, но не имеют другого влияния на компиляция. Всю группу можно свернуть и скрыть или развернуть и просмотреть в интегрированной среде разработки (IDE). Эти директивы особенные в том, что они не могут ни запускаться, ни завершаться в теле метода
Или, другими словами: вы не можете этого сделать, потому что так сказано в спецификации.
Что касается того, почему это было указано таким образом, я считаю, что это как-то связано со старой функцией IDE, которую VB имел столько, сколько я себя помню: Инструменты + Параметры, Текстовый редактор, Базовый, Специфичный для VB, Показать разделители строк процедуры. Это всего лишь предположение, вероятно, не очень удачное.
Обновление: теперь поддерживается Roslyn, сначала включено в VS2015.
Я не знаю о 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 # по-разному относилась к этой функции и разрешила ее во многих других местах. Меня всегда удивляло, что директивы C # #region
могут встречаться в разных контекстах объявления.
#region Foo
class Bar {
#endregion
}
Эквивалентный код не разрешен в VB.
В Visual Studio 2003 они были для VB.NET, но эта функция была удалена в Visual Studio 2005 и более поздних версиях. Действительно раздражает при рефакторинге больших процедур, но вы можете разделить окно кода.
Честно говоря, мне бы хотелось, чтобы C # ограничивал использование регионов, потому что они используются слишком часто. У меня есть макрос, который удаляет их из всех файлов кода при наследовании проектов C #.
Другой удаленной функцией был список переопределяемых методов на панели навигации . Я проверяю, добавляли ли они эту функцию повторно для каждой новой версии Visual Studio с 2005 года.