2012-03-19 2 views
8

Я смущаюсь обо всех этих разговорах о IDispose и «использовании» заявлений. Интересно, если кто-то может сказать мне, если мне нужно использовать либо «используя» заявление или какое-то реализация 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; 
    } 

} 
+0

Прежде всего, в C# .NET вы никогда не можете быть уверены, что у вас есть любой объект. GC делает это для вас. Вы можете хотя сказать немного вещей в Destructor, но все же он не освободит память по вашей воле. Во-вторых, использование оператора более чисто, чем создание кода и реализация IDisposable или создание одноразовых методов. По мере того, как объем использования инструкции заканчивается, все переменные, определенные и инициализированные внутри, будут убиты. –

+9

@ АнубхавСайни: это ложь. GC не распоряжается для вас, и вы всегда можете быть уверены, что выбрали, если вы вызываете Dispose. –

+0

GC собирает. Утилизация распоряжается. Вызов метода Dispose гарантирует, что вы выбрали. Когда он устраивается, ни один организм не знает. Все еще время выполнения уничтожает объекты. В большинстве случаев используйте инструкцию Using и пытайтесь писать безопасные исключения. @JohnSaunders благодарит. –

ответ

21

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

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

+0

Пока вы здесь, не могли бы вы объяснить часть сходства между 'using()' и методами удаления? Я помню еще один вопрос, когда Липперт сказал что-то о том, что есть очень мало различий, но я не могу вспомнить, что именно. – mowwwalker

+5

@Walkerneo: оператор 'using' эквивалентен блоку' try'/'finally', который находится в' finally'. –

6

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

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

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

+0

Что делать, если я добавил строку кода следующим образом? string [] fileEntries = Directory.GetFiles (dirPath); –

+1

Не нужно снова утилизировать. Вы не создаете объект, который должен быть удален как streamreader в моем примере :) –

7

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

4

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

+2

Эта ссылка является лучшим объяснением использования интерфейса IDisposable! – ganders