2011-11-08 12 views
13

Czy to prawda, że ​​jeśli skorzystam z poniższego, zajmie to mniej zasobów i czyszczenie będzie szybsze?użycie słowa kluczowego zajmuje mniej miejsca?

using (TextReader readLogs = File.OpenText("C:\\FlashAuto\\Temp\\log.txt")) 
{ 
     //my stuff 
} 

w stosunku do:

TextReader readLogs = new StreamReader("C:\\FlashAuto\\Temp\\log.txt"); 
//my stuff 
readLogs.Close(); 
readLogs.Dispose(); 

Odpowiedz

25

Różnica tych przykładów nie jest wydajność, ale bezpieczeństwa wyjątkiem. using tworzy blok w tle w postaci try...finally.

A z użyciem instrukcji postaci:

using (ResourceType resource = expression) embedded-statement 

odpowiada rozszerzalności:

{ 
    ResourceType resource = expression; 
    try {  
    embedded-statement 
    } 
    finally { 
    // Dispose of resource 
    } 
} 

Dla typu referencyjnym Pozbywanie się dzieje się poprzez:

finally { 
    if (resource != null) ((System.IDisposable)resource).Dispose(); 
} 

Od ECMA-344 C# Language Specification 4th Edition


też nie trzeba zadzwonić zarówno Close i Dispose. Te funkcje są równoważne.

+0

Właściwie to robię pewne operacje rejestrowania po co 10 sekundach w wątku interfejsu użytkownika. Za każdym razem, gdy czyta dziennik i wyświetla tekst w wieloliniowym polu tekstowym, pobierana jest ogromna porcja pamięci. Ale jeśli zaktualizuję pole tekstowe bez czytania pliku przy użyciu mojego własnego komunikatu o stanie, nie zmieni to pamięci. – Rohan

+0

@musefan formatowanie było celowe, ponieważ są to cytaty ze specyfikacji. – CodesInChaos

+0

W porządku, prawdopodobnie powinniśmy dodać referencje w następnym wpisie, unikajmy jednak zamieszania dla niewinnych czytelników;) – musefan

7

Pierwsza próbka jest krótki ręki dla:

TextReader readLogs = File.OpenText("C:\\FlashAuto\\Temp\\log.txt"); 
try 
{ 
    // My stuff 
} 
finally 
{ 
    if (readLogs != null) 
    { 
     ((IDisposable)readLogs).Dispose(); 
    } 
} 

Jego nie że jej szybciej, jej że readLogs zostaną oczyszczone, nawet jeśli wyjątek occurrs który nie nastąpi w drugim przykładzie.

Aby uzyskać więcej informacji, patrz using Statement (C# Reference).

Nie ma potrzeby, aby połączyć oba Close i Dispose wewnętrznie metoda Close robi to samo dzieło jako metoda Dispose (jej właśnie przemianowany ponieważ deweloperzy są przyzwyczajeni do metody zwanej Close).


Aktualizacja: Nie ma też różnicy między wywołaniem File.OpenText i new StreamReader - wewnętrznie File.OpenText tylko tworzy i zwraca nową instancję StreamReader.

+0

Właściwie to robię jakieś rejestrowanie rzeczy po każdych 10 sekundach w wątku UI. Za każdym razem, gdy czyta dziennik i wyświetla tekst w wieloliniowym polu tekstowym, pobierana jest ogromna porcja pamięci.Ale jeśli zaktualizuję pole tekstowe bez czytania pliku przy użyciu mojego własnego komunikatu o stanie, nie zmieni to pamięci. – Rohan

+1

@Rohan Wygląda na to, że różnica jest w bitach '// My stuff' - jeśli czytasz cały plik za każdym razem, to prawdopodobnie zużyje on część pamięci. – Justin

+0

'File.OpenText' powinno znajdować się poza blokiem' try ... finally'. Twój kod nie skompilowałby się, ponieważ 'readLogs' nie może być zainicjalizowany w twoim końcu. – CodesInChaos

Powiązane problemy