Когда утилизировать?

Я запутался во всех этих разговорах об IDispose и «использовании» утверждений. Интересно, может ли кто-нибудь сказать мне, нужно ли мне использовать либо оператор «using», либо какую-то реализацию IDispose в следующем тестовом примере...

public class Main()
{
    MyFile myFile = new MyFile("c:\subdir\subdir2\testFile.txt");
    Console.Writeline("File Name: " + myFile.FileName() + "File Size: " + myFile.FileSize());
}

public class MyFile
{
    private FileInfo _fInfo;

    public MyFile(string fullFilePath)
    {
        _fInfo = new FileInfo(fullFilePath);
    }

    public string FileName()
    {
        return _fInfo.Name;
    }

    public long FileSize()
    {
        return _fInfo.Length;
    }

}

person Ann Sanderson    schedule 19.03.2012    source источник
comment
Во-первых, в C#.NET вы никогда не можете быть уверены, что удалили какой-либо объект. ГК сделает это за вас. Вы можете сказать несколько вещей в Destructor, но он не будет освобождать память по вашему желанию. Во-вторых, использование оператора является более чистым способом, чем создание кода и реализация IDisposable или создание методов Disposable. Когда область использования инструкции достигает конца, все переменные, определенные и инициализированные внутри, уничтожаются.   -  person    schedule 20.03.2012
comment
@AnubhavSaini: это неверно. GC не утилизирует за вас, и вы всегда можете быть уверены, что утилизировали, если вызовете Dispose.   -  person John Saunders    schedule 20.03.2012
comment
ГК собирает. Утилизация утилизирует. Вызов метода Dispose гарантирует, что вы избавились. Когда он будет утилизирован, никто не знает. Еще время выполнения уничтожает объекты. В большинстве случаев используйте оператор Using и пытайтесь писать безопасные для исключений функции удаления. @JohnSaunders спасибо.   -  person    schedule 20.03.2012
comment
Вы все еще ошибаетесь. Объекты удаляются немедленно при вызове Dispose. Вы путаете GC с удалением.   -  person John Saunders    schedule 20.03.2012
comment
возможный дубликат Правильное использование интерфейса IDisposable   -  person John Saunders    schedule 20.03.2012


Ответы (4)


Нет, в вашем примере не используются какие-либо ресурсы, требующие удаления (он не касается ничего, что реализует IDisposable, или не имеет прямых дескрипторов неуправляемых ресурсов), поэтому вам не нужно реализовывать IDisposable.

Теперь, если вы изменили свой класс, чтобы открыть файл и сохранить поле FileStream, ссылающееся на дескриптор открытого файла, тогда имеет смысл реализовать IDisposable для закрытия потока.

person Jon Skeet    schedule 19.03.2012
comment
Пока вы здесь, не могли бы вы объяснить часть сходства между using() и методами dispose? Я помню другой вопрос, где Липперт сказал что-то об очень небольшой разнице, но я не могу вспомнить, что именно. - person mowwwalker; 20.03.2012
comment
@Walkerneo: оператор using эквивалентен блоку try/finally, который размещается в finally. - person Jon Skeet; 20.03.2012

Нет, в предоставленном коде я не вижу никаких используемых ресурсов, которые нужно утилизировать. Так что ответ нет, не используйте его в этом коде.

person Tigran    schedule 19.03.2012

В вашем примере нечего удалять, поэтому вам не нужно этого делать.
Если вы хотите читать/записывать в файл, вы можете использовать для этого Streamreader/Streamwriter, и таким образом вам нужно будет удалить эти объекты после используя их.

using(StreamReader sreader=new StreamReader())
{
//your code
}

Таким образом, в этом случае использование оператора поможет вам не думать о ручном удалении/закрытии вашего объекта/

person Chuck Norris    schedule 19.03.2012
comment
Что, если я добавлю строку кода, подобную следующей? string[] fileEntries = Directory.GetFiles(dirPath); - person Ann Sanderson; 20.03.2012
comment
Не нужно снова утилизировать. Вы не создаете объект, который необходимо удалить, например, streamreader в моем примере :) - person Chuck Norris; 20.03.2012

В вашем коде нет необходимости в каких-либо Dispose/using - полное руководство по IDisposable см. здесь.

person Yahia    schedule 19.03.2012
comment
Эта ссылка — лучшее объяснение использования интерфейса IDisposable! - person ganders; 18.05.2012