Есть ли способ сказать компилятору куда-нибудь поместить блок кода? - PullRequest
0 голосов
/ 03 октября 2011

У меня длинный метод, и для ясности чтения хотелось бы поместить часть кода в отдельный метод. Однако этого нельзя сделать, потому что этот код использует переменные в методе. Поэтому я хотел бы поместить этот код в другое место и указать компилятору вставить этот код в «это» место при компиляции. Есть ли способ сделать это? Я использую Visual Studio.

Ответы [ 5 ]

5 голосов
/ 03 октября 2011

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

В качестве временной меры вы можете использовать области кода для организации своего кода.:

void BigMethod()
{
    #region Frobbing code
        FrobTheBlob();
        // blah blah blah
        // blah blah blah
    #endregion
    ...

И теперь в Visual Studio редактор позволит вам свернуть эту область в одну строку с надписью «Frobbing code».

5 голосов
/ 03 октября 2011

Похоже, вы описываете Извлечь метод , и вы можете сделать это очень легко, просто выделите код, который вы хотите переместить, и:

Щелкните правой кнопкой мыши -> Refactor -> Извлечь метод -> Введите имя метода

Visual Studio позаботится об остальном для вас. Прочитайте документы здесь .

4 голосов
/ 03 октября 2011

Если у вас есть один длинный метод, который вы не можете разделить, потому что вам нужен доступ к одним и тем же локальным объектам, то, что у вас действительно , есть еще один объект, который вы формально не превратили в класс. Рефакторинг вашего кода, извлечение метода и общего состояния в собственный класс, а затем начните рефакторинг метода в более мелкие, более управляемые части.

class SomeClass
{
    // whatever shared state of the class     
    // whatever methods of the class

    public void MethodThatsDoingTooMuch()
    {
         // long method
         // hard to split the method because of locals
    }
}

до

class SomeClass
{
    // whatever shared state of the class     
    // whatever methods of the class     

    public void MethodThatIsntDoingTooMuch()
    {
        bigSomethingDoer.Do();
    }
}

class BigSomethingDoer
{
    // shared locals are fields instead

    public void Do() 
    {
        // refactor long method into smaller methods
        // shared locals are promoted to class fields
        // this smaller class only does this one thing
        // --> its state does not pollute another class
    }
}
1 голос
/ 03 октября 2011

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

некоторые инструменты рефакторинга имеют такие функции, как extract-method , где вы выбираете некоторый код, и он перемещается в другой метод для вас. Я думаю, что и ReSharper, и DevExpress CodeRush имеют эту функцию, но я не уверен на 100%, и у меня не установлено ни одного из них, чтобы попробовать это прямо сейчас.

0 голосов
/ 03 октября 2011

Вы можете использовать анонимные методы / лямбды для создания функций, которые могут обращаться к локальным переменным содержащего метода.

Но такие длинные методы обычно не нужны.Попробуйте разделить разные части метода, чтобы им не нужно было использовать общие локальные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...