Блоки с использованием фигурных скобок. Это правильный синтаксис C #, и он делает что-нибудь? - PullRequest
3 голосов
/ 22 февраля 2012

Я читаю чужой код и вижу много примеров этого. Я предоставлю фрагмент. Это библиотечная функция, которая оборачивает nHibernate. Это пятая строка после создания сессии, в которой я запутался.

public T GetById<T>(string id) where T : BaseObject
{
     T retObj = null;
     ISession session = EnsureCurrentSession();
     {
          retObj = session.Get<T>(id);
     }

     return retObj;
}

На первый взгляд, я подумал, что это пример использования оператора, но это не так. Насколько я могу видеть, фигурные скобки могут быть не там. Единственной практической целью установки блока было бы создание внутри переменных, и их область действия ограничивалась бы блоком, но здесь этого не происходит.

Или я что-то упустил?

Ответы [ 7 ]

6 голосов
/ 22 февраля 2012

Этот код выглядит как неполное редактирование;код допустим, но странен.

Чтобы проконтролировать ваше утверждение:

Единственной практической целью установки блока было бы создание внутри переменных и ограничение их области действия.к блоку

То есть практическая цель для создания блока, но не цель only .Например:

class C
{
    public int x;
    void M()
    {
        x = 123;
        if (whatever)
        {
            int x = q;
        }
    }
}

Этот код недопустим, поскольку простое имя x используется непоследовательно во всем блоке, который его первым использует. x сначала означает this.x, илокальная переменная позже.Это не разрешено в C #;в C # имя может означать только одну вещь во всем блоке, который первым использует имя.

Вы могли бы "исправить" проблему с помощью ...

class C
{
    public int x;
    void M()
    {
        {
           x = 123;
        }
        if (whatever)
        {
            int x = q;
        }
    }
}

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

3 голосов
/ 22 февраля 2012

Действительно, в этом случае это ничего не делает.На самом деле это может быть остаток блока using, т. Е. Код мог выглядеть в предыдущей версии следующим образом:

using (ISession session = EnsureCurrentSession())
{
   retObj = session.Get<T>(id);
}

Как сейчас, я бы рассмотрел, как реализован EnsureCurrentSession.Возможно, using действительно должен быть там, или, если нет, удалите скобки.

3 голосов
/ 22 февраля 2012

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

1 голос
/ 16 января 2013

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

1 голос
/ 22 февраля 2012

Я думаю, вы ничего не упустили - фигурные скобки в этом случае ничего не делают.

0 голосов
/ 22 февраля 2012

Мое лучшее предположение, что когда-то был if (session != null).Затем была проверка кода, в которой было указано, что тест не нужен, потому что EnsureCurrentSession() никогда не возвращает null, он выдает Exception, если сеанс не является текущим.

0 голосов
/ 22 февраля 2012

Не пропуская ничего.Они лишние, и, честно говоря, плохо оставлять такой код.Но это могло быть изменено / добавлено как привычка, когда код требует локальной области видимости / использования.

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