Подтвердить что ты не робот

Области кода не допускаются в телах методов в VB.NET?

Примечание. Эта "функция" теперь добавлена ​​в Visual Studio 2015, но вопрос будет длиться некоторое время, поскольку не каждый разработчик или каждый магазин-разработчик получает доступ к самой последней и самой лучшей среде IDE, как только он выходит.

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Пример кода:

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

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

Ответ 2

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

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

Если ваш код:

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

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

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

Ответ 3

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

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

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

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


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

Ответ 4

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

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

Ctrl + M, Ctrl + H

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

enter image description here

Ответ 5

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

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

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

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

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

Ответ 6

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

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

#region Foo
class Bar {
#endregion

}

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

Ответ 7

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

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

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

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

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

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

Ответ 8

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

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

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