sens użycia using

0

mam taki kod:

using (StreamWriter file = File.CreateText(filePath))
                {
                    file.Write(fileContent);
                } 

po co użyto using? Czemu nie zastosowano:

StreamWriter file = File.CreateText(filePath)
file.Write(fileContent); 
1

using w tym wypadku jest użyte po to, żeby obiekt file istniał tylko w tym bloku i po wyjściu z niego był usunięty z pamięci (albo przynajmniej zakwalifikowany do usunięcia). Dzięki temu nie trzeba ręcznie wywoływać metody Dispoze żeby pozbyć się tego obiektu od razu kiedy przestanie być potrzebny.

EDIT: Bez using też by działało, ale przy większej aplikacji powodowałoby, że program mógłby szybko pochłaniać RAM bo garbage collector nie usuwa obiektów od razu i gromadziłyby się one w pamięci

0

dziękuję

3

Odpowiedź @mar-ek1 jest na tyle nieprecyzyjna, że pokusiłbym się nawet o stwierdzenie, że po prostu nieprawdziwa.

po wyjściu z niego był usunięty z pamięci (albo przynajmniej zakwalifikowany do usunięcia)

To gigantyczna różnica.

Bez using też by działało, ale przy większej aplikacji powodowałoby, że program mógłby szybko pochłaniać RAM bo garbage collector nie usuwa obiektów od razu i gromadziłyby się one w pamięci

Jak sam zauważyłeś samo użycie using i wywołanie Dispose nie znaczy, że obiekt przestanie w tym momencie istnieć (i nigdy tak z resztą nie będzie, bo GC wcale tych dwóch konstrukcji nie traktuje inaczej niż zwykłego wyjścia ze scope i wywołania jakiejkolwiek innej metody). Cała istota using i Dispose polega na tym, by niezarządzane zasoby zwolnić w sposób deterministyczny oraz, jako bonus, poprosić GC, by nie wywoływał już później destruktora (finalizera) - co sprawi, że faktycznie ten obiekt zostanie zwolniony troszkę szybciej, ale wciąż nie zmienia faktu, że jest to nadal proces niedeterministyczny i stanie się to w "bliżej nieokreślonej przyszłości".
A co by się stało, gdybyśmy nie wywołali sami albo za pomocą using tego Dispose? Przy poprawnej implementacji nic złego, bo powinien zrobić to za nas destruktor (finalizer), ale nie dość, że stanie się to później to nie potrafimy określić tego punktu w czasie konkretnie i dajemy GC więcej pracy.

0
using (StreamWriter file = File.CreateText(filePath))
{
    file.Write(fileContent);
}

Jest to mniej-więcej równoważne temu:

{
    StreamWriter file;
    try
    {
        file = File.CreateText(filePath);
        file.Write(fileContent);
    }
    finally
    {
        if (file!=null) file.Dispose();
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1