возвратите переменную, используемую для использования в использовании C#

Я возвращаю переменную, которую я создаю в операторе использования в операторе использования (звучит забавным):

public DataTable foo ()
{
    using (DataTable properties = new DataTable())
    {
       // do something
       return properties;
    }
}

Это расположит переменную свойств??

После выполнения этого все еще получаю это Предупреждение:

Предупреждение 34 CA2000: Microsoft. Надежность: В методе 'test.test', назовите Систему. IDisposable. Расположите на объектных 'свойствах', прежде чем все ссылки на него будут вне объема.

Какие-либо идеи?

Спасибо

10
задан di3go 12 May 2010 в 20:53
поделиться

7 ответов

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

Вам нужно будет создать его экземпляр следующим образом:

public DataTable Foo() 
{ 
    DataTable properties = new DataTable();
    return properties; 
} 

и вызвать для него Dispose () позже.

10
ответ дан 3 December 2019 в 14:33
поделиться

Да, он утилизирует его - а затем вернет. Это почти всегда плохо.

Фактически, для DataTable , Dispose почти никогда ничего не делает (за исключением случаев, когда он где-то удален, IIRC), но в целом это плохая идея. Обычно вы должны рассматривать утилизированные объекты как непригодные для использования.

9
ответ дан 3 December 2019 в 14:33
поделиться

Да. Почему вы используете ключевое слово using в том, что не хотите удалять в конце блока кода?

Цель ключевого слова using - удалить объект .

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

3
ответ дан 3 December 2019 в 14:33
поделиться

Ваш код, использующий ключевое слово using, расширяется до:

{
    DataTable properties = new DataTable();
    try
    {
        //do something
        return properties;
    }
    finally
    {
        if(properties != null)
        {
            ((IDisposable)properties).Dispose();
        }
    }
}

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

1
ответ дан 3 December 2019 в 14:33
поделиться

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

Это будет работать просто отлично.

public DataTable foo ()
{
    DataTable properties = new DataTable();
    // do something
    return properties;
}
3
ответ дан 3 December 2019 в 14:33
поделиться

Остальные ответы верны: как только вы выйдете из блока using, ваш объект будет удален. Блок using отлично подходит для обеспечения своевременного удаления объекта, поэтому, если вы не хотите полагаться на то, что потребители вашей функции не забывают об удалении объекта позже, вы можете попробовать что-то вроде этого:

public void UsingDataContext (Action<DataContext> action)
{
    using (DataContext ctx = new DataContext())
    {
       action(ctx)
    }
}

Таким образом вы можете сказать что-то вроде:

var user = GetNewUserInfo();
UsingDataContext(c => c.UserSet.Add(user));
0
ответ дан 3 December 2019 в 14:33
поделиться

Предположительно, это шаблон для фабричного метода, который создает одноразовый объект. Но я все еще видел, что Code Analysis жалуется и на это:

        Wrapper tempWrapper = null;
        Wrapper wrapper = null;

        try
        {
            tempWrapper = new Wrapper(callback);
            Initialize(tempWrapper);

            wrapper = tempWrapper;
            tempWrapper = null;
        }
        finally
        {
            if (tempWrapper != null)
                tempWrapper.Dispose();
        }

        return wrapper;

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

Статья MSDN: CA2000: Утилизация объектов до потери области видимости

7
ответ дан 3 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: