c # Утилизация datacontext - PullRequest
       66

c # Утилизация datacontext

2 голосов
/ 15 апреля 2011

3 примера с одинаковыми функциями:

Метод 1

Использование фигурных скобок

public static int TicketsRequiringSupportResponse()
{
    int ReturnValue = 0;
    using (var dc = new CrystalCommon.MainContext())
    {
        ReturnValue = (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
    }
    return ReturnValue;
}

Метод 2

Использование без фигурных скобок

public static int TicketsRequiringSupportResponse()
{
    int ReturnValue = 0;
    using (var dc = new CrystalCommon.MainContext())
        ReturnValue = (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
    return ReturnValue;
}

Метод 3

Без скобок и возврат в блоке использования

public static int TicketsRequiringSupportResponse()
{
    using (var dc = new CrystalCommon.MainContext())
        return (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}

Правильно ли утилизированы все эти элементы?Метод 3 самый удобный и имеет наименьший код, но я боюсь, что он не будет правильно располагаться, потому что оператор return сломается.

Ответы [ 4 ]

5 голосов
/ 15 апреля 2011

Да, они все делают одно и то же.Скобки только добавляют явную область видимости;по умолчанию using применяется только к следующему оператору.Возврат из using все равно удалит (это по сути попытка / наконец-то за кулисами). Я предпочитаю №3, но с добавлением скобок для ясности.

3 голосов
/ 15 апреля 2011

На самом деле, я бы сказал, что Метод 1 - это самое подходящее ИМО - я знаю, что фигурные скобки являются дополнительными, но они помогают уточнить / упорядочить код. А объявление вашей переменной и возвращение за пределы блока using облегчает отладку в реальном времени.

1 голос
/ 15 апреля 2011

@ Таллджо хорошо объясняет, все они эквивалентны;все, что я добавлю, - это четвертый пример, который на самом деле просто демонстрирует детали Talljoe, но с небольшим изменением форматирования:

public static int TicketsRequiringSupportResponse()
{
    using (var dataContext = new CrystalCommon.MainContext())
    {
        return dataContext .tblHelpCentreQuestions.Where(
            question => question.awaitingSupportResponse == true).Count();
    }
}

Обратите внимание, мы добавляем скобки для определения области видимости для using и дополнительно удаляем лишние скобкииз оператора return, затем просто удалите строку и отступ, чтобы обеспечить лучший поток для чтения, в отличие от длинной строки (однако, long является дискуссионным.) Я также пытался дать DataContext и лямбда-аргумент несколько описательные имена.

1 голос
/ 15 апреля 2011

Все они делают одно и то же и правильно располагают контекст.Первое и второе абсолютно одинаковы.Первый и второй оба переводят в следующий код:

int ReturnValue = 0;
Context dc = null;
try
{
    dc = new CrystalCommon.MainContext();
    ReturnValue = (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}
finally
{
    if(dc != null)
        dc.Dispose();
}
return ReturnValue;

Третий переводит в этот код:

Context dc = null;
try
{
    dc = new CrystalCommon.MainContext();
    return (dc.tblHelpCentreQuestions.Where(c => c.awaitingSupportResponse == true).Count());
}
finally
{
    if(dc != null)
        dc.Dispose();
}

Поскольку блок finally выполняется, когда область действия блока tryслева, оба кода действительно эквивалентны.

...