Это Уничтожено? В большинстве случаев да.
Код, который вы нам показали, не имеет смысла. В есть , чтобы быть чем-то еще между вызовом функции и вызовом Dispose, чтобы даже считали записав это так. И все они могут генерировать исключения, случайно пропуская утилизацию.
У меня есть одно правило для IDisposeables:
Никогда не разделяйте создание и удаление IDisposeable на несколько частей кода. Создать. Использование. Dispose. Все в одном куске кода, в идеале с использованием блока использования. Все остальное просто вызывает проблемы.
Редкое исключение - когда вы оборачиваетесь чем-то одноразовым. В этом случае вы реализуете iDisposeable с единственной целью - передать вызов Dispose на содержащийся экземпляр. Это кстати. причина примерно 95% всех реализаций IDispose - вы можете обернуть что-то, что может потребовать Dispose.
с использованием - это просто сокращение для: try, наконец, NullCheck, Dispose. И, наконец, работает в каждом возможном случае: он работает после возврата. Это работает на исключение. Он работает на GOTO, продолжается, и другие выпрыгивают из этого блока. Он не запускается в операционной системе, убивающей процесс, но в любом случае это своего рода обязанность ОС / финализаторов.
Конечно, лучшим способом было бы не возвращать что-то одноразовое из функции. Какие бы данные они не имели, просто сопоставьте их с чем-то, что не использует Disposeables. IIRC при работе с SQLDataReader (который требует открытого соединения), это именно то, что происходит. Вы сопоставляете возвращаемое значение запроса с любой другой коллекцией, для которой не требуется открытое соединение.
Если вы не можете этого сделать, я бы изменил ваш код следующим образом:
void Main()
{
using(var A= myMethod()){
//Anything you want to do with that variable
}
//using takes care of the Dispose call
}
Теперь все может случиться, и я знаю, что использование заботится об утилизации.