Вернуть объект, созданный с помощью USING - PullRequest
5 голосов
/ 19 ноября 2010

Я создаю объект (объект ниже) при использовании и возвращаю этот объект как часть функции return. Будет ли это причиной какой-либо проблемы, такой как объект, будет устранен, прежде чем я попытаюсь использовать возвращенное значение в другой функции?

using (MyObject obj = new MyObject())
{
   .
   .
   .
   return obj;
}

Ответы [ 9 ]

17 голосов
/ 19 ноября 2010

Приведет ли это к какой-либо проблеме, например объект будет удален, прежде чем я попытаюсь использовать возвращаемое значение в другой функции?

Да.

Можете ли вы объяснить, что вы пытаетесь сделать здесь?Этот код не имеет никакого смысла.Весь смысл «использования» состоит в том, что вы используете объект здесь только , а затем автоматически избавляетесь от его ограниченных неуправляемых ресурсов, делая его непригодным для использования.Возможно, есть лучший способ сделать то, что вы хотите.

6 голосов
/ 19 ноября 2010

Объект будет Dispose() -d, когда он выйдет из области видимости, либо по return, либо по какому-либо другому пути кода.Единственная цель using - предоставить отказоустойчивый механизм для IDisposable объектов локальной области действия , чтобы очистить все, что происходит во вложенном блоке кода.

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

2 голосов
/ 19 ноября 2010

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

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

1 голос
/ 19 ноября 2010

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

0 голосов
/ 19 ноября 2010

Если вам нужно вернуть одноразовый объект, вам нужно убедиться, что ВСЕ пути кода либо возвращают объект, либо удаляют его. Обратите внимание, что исключение, выбрасываемое из функции, является допустимым путем кода. Чтобы охватить этот случай, вы, вероятно, захотите обернуть сегмент кода между созданием и возвратом в try-catch или try-finally, чтобы гарантировать, что объект будет правильно расположен, если оператор return не был успешно достигнут.

0 голосов
/ 19 ноября 2010

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

0 голосов
/ 19 ноября 2010

Технически говоря, это зависит от того, что MyObject делает в методе Dispose реализованного интерфейса IDisposable.

Теоретически это может быть прекрасно, поскольку вы просто заключаете вещи в ненужный блок try / catch / finally.

public void DoStuff()
{
     MyObject myObject = GetMyObject();
     Console.WriteLine("Name: " + myObject.Name);
}

private MyObject GetMyObject()
{
    using (MyObject obj = new MyObject())
    {
        obj.Name = "Aaron";
        return obj;
    }
}

public class MyObject : IDisposable
{
    public String Name { get; set; }

    #region IDisposable Members

    public void Dispose()
    {
        //depends what you do in here...
    }

    #endregion
}

Имя: Аарон

0 голосов
/ 19 ноября 2010

Вероятно, это будет работать для объекта без метода Dispose, но тогда не будет необходимости использовать 'using'.

Даже если это работает для вашего конкретного объекта, это неправильно. Это не то, что конструкция "using" для

0 голосов
/ 19 ноября 2010

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

...