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

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

32
задан Paul Sasik 24 November 2015 в 03:30
поделиться

5 ответов

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

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

Если ваш код:

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

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

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

19
ответ дан 27 November 2019 в 20:12
поделиться

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

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

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

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


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

16
ответ дан 27 November 2019 в 20:12
поделиться

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

В самом деле, вы даже можете помещать области кода в нечетные места, что пересекается с областями видимости. Например:

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

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

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

10
ответ дан 27 November 2019 в 20:12
поделиться

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

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

#region Foo
class Bar {
#endregion

}

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

4
ответ дан 27 November 2019 в 20:12
поделиться

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

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

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

1
ответ дан 27 November 2019 в 20:12
поделиться