Я должен назвать.Dispose () после возврата объекта, который реализует IDisposable?
myDisposableObject Gimme() {
//Code
return disposableResult;
disposableResult.Dispose();
}
Другими словами, объект, я возвращаю копию, или действительно ли это - сам объект? Спасибо :)
Это сам объект . Не вызывайте здесь Dispose, даже если вы измените порядок, чтобы он был вызван.
У вас не может быть .Dispose () в возвращаемом методе. Вызывающий должен реализовать это.
myDisposableObject DisposableResult = new myDisposableObject ();
Здесь DisposableResult
- ссылка на новый созданный объект. Поэтому, когда вы возвращаете эту ссылку вызывающему методу, эта ссылка по-прежнему указывает на созданный объект в куче. Следовательно, вы можете безопасно избавиться от него в вызывающем методе.
.Dispose ()
в любом случае не будет достигнут.
Изменить: На мой взгляд, нет, не следует. Этим вы уничтожите Объект.
одноразовыйResult.Dispose (); никогда не запустится, это недостижимый код, так как он всегда будет возвращать предыдущую строку. Оберните вызов метода в элемент using и избавьтесь от объекта таким образом.
например.
using (DisposeableObject myDisposableObject = gimme())
{
//code.
}
Одна вещь, о которой пока не сказано ни в одном из ответов, заключается в том, что вы должны удалить объект, если Джимме выдает исключение. Например:
MyDisposableObject Gimme()
{
MyDisposableObject disposableResult = null;
try
{
MyDisposableObject disposableResult = ...
// ... Code to prepare disposableResult
return disposableResult;
}
catch(Exception)
{
if (disposableResult != null) disposableResult.Dispose();
throw;
}
}
Если объект, который вы используете, реализует IDisposable
, вы должны создать и использовать в операторе using
- это обеспечит правильную утилизацию:
using(var mydisposableObject = new Gimme())
{
// code
}
Ваш код построен так, что вы возвращаете одноразовый объект, поэтому вызов Dispose
никогда не будет достигнут.
Если вы вернете объект, вы должны не избавляться от него перед возвратом. Это должно быть на усмотрение вызывающего абонента.
Вы могли бы обернуть ваш код в блок try/finally
try{
int a = 0;
return;
}
finally{
//Code here will be called after you return
}
Нет, не следует. Вы возвращаете ссылку на объект, поэтому копия не создается. В .NET объекты никогда не копируются, если вы специально этого не попросите.
Кроме того, вы не можете избавиться от объекта с таким кодом, даже если бы возникла ситуация, в которой вы должны были бы. Код после оператора return
никогда не будет выполнен, и вы получите предупреждение о недоступности кода.
Эта строка: DisposableResult.Dispose ();
не будет выполняться. Возвращенная «вещь» не является копией объекта. Это ссылка на объект, поэтому вызывающий будет манипулировать объектом, созданным в Gimme
, и он (вызывающий) должен не забыть удалить объект.