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.