Должен я звонить Расположить () в функции после Возврата?

Я должен назвать.Dispose () после возврата объекта, который реализует IDisposable?

myDisposableObject Gimme() {
  //Code
  return disposableResult;
  disposableResult.Dispose();
}

Другими словами, объект, я возвращаю копию, или действительно ли это - сам объект? Спасибо :)

9
задан Camilo Martin 14 May 2010 в 09:19
поделиться

11 ответов

Это сам объект . Не вызывайте здесь Dispose, даже если вы измените порядок, чтобы он был вызван.

8
ответ дан 4 December 2019 в 06:22
поделиться

У вас не может быть .Dispose () в возвращаемом методе. Вызывающий должен реализовать это.

0
ответ дан 4 December 2019 в 06:22
поделиться

myDisposableObject DisposableResult = new myDisposableObject ();

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

0
ответ дан 4 December 2019 в 06:22
поделиться

.Dispose () в любом случае не будет достигнут.

Изменить: На мой взгляд, нет, не следует. Этим вы уничтожите Объект.

3
ответ дан 4 December 2019 в 06:22
поделиться

одноразовыйResult.Dispose (); никогда не запустится, это недостижимый код, так как он всегда будет возвращать предыдущую строку. Оберните вызов метода в элемент using и избавьтесь от объекта таким образом.
например.

using (DisposeableObject myDisposableObject = gimme())
{
    //code.
}
4
ответ дан 4 December 2019 в 06:22
поделиться

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

MyDisposableObject Gimme() 
{
    MyDisposableObject disposableResult = null;
    try
    {
        MyDisposableObject disposableResult = ...

        // ... Code to prepare disposableResult

        return disposableResult;
    }
    catch(Exception)
    {
        if (disposableResult != null) disposableResult.Dispose();
        throw;
    }
}
7
ответ дан 4 December 2019 в 06:22
поделиться

Если объект, который вы используете, реализует IDisposable , вы должны создать и использовать в операторе using - это обеспечит правильную утилизацию:

using(var mydisposableObject = new Gimme())
{
   // code
}

Ваш код построен так, что вы возвращаете одноразовый объект, поэтому вызов Dispose никогда не будет достигнут.

3
ответ дан 4 December 2019 в 06:22
поделиться

Если вы вернете объект, вы должны не избавляться от него перед возвратом. Это должно быть на усмотрение вызывающего абонента.

2
ответ дан 4 December 2019 в 06:22
поделиться

Вы могли бы обернуть ваш код в блок try/finally

    try{
            int a = 0;
            return;
    }
    finally{
            //Code here will be called after you return
    }
1
ответ дан 4 December 2019 в 06:22
поделиться

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

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

9
ответ дан 4 December 2019 в 06:22
поделиться

Эта строка: DisposableResult.Dispose (); не будет выполняться. Возвращенная «вещь» не является копией объекта. Это ссылка на объект, поэтому вызывающий будет манипулировать объектом, созданным в Gimme , и он (вызывающий) должен не забыть удалить объект.

1
ответ дан 4 December 2019 в 06:22
поделиться