Použití dispose   zodpovězená otázka

ASP.NET WebForms, ADO.NET, Databáze

Dobrý den, může mi prosím někdo poradit, jestli musím vždycky po použití objektu zničit jej pomocí dispose nebo jestli tyto objekzty zaniknou se stránkou nebo nějak jinak. například když si vytvářím OLEDBDataAdapter, dataSet nebo OLEDBCommand, případně novou instanci vlastní třídy ap. Díky moc za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Měl byste, doporučuji používat konstrukci Using, která Dispose volá sama.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

A dají se použité objekty zrušit hromadně nebo musím každý objekt zrušit zvlášť?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Případně jakým zopůsobem se using používá

nahlásit spamnahlásit spam 0 odpovědětodpovědět

jednoduchym zpusobem:

Using stream As FileStream = System.IO.File.OpenRead(file)

   blablabla ...

End Using

dalsi metoda:

Dim stream As New FileStream(file, FileMode.Open, FileAccess.Read)

blablabla...

stream.Close()
stream = Nothing

Proc by jste mel ukoncovat pripojeni ? Tak si skuste vypsat na stranku obsah nejakeho .txt souboru a neukoncujte pripojeni. Pote si stranku znova reloadnete a uvidite k jakemu zaveru dojdete =)

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ta druhá metoda nevolá na streamu Dispose, což je hlavní význam klauzule Using. Správný přepis horního bloku je tento:

Dim stream As New FileStream(file, FileMode.Open, FileAccess.Read)

blablabla...

stream.Close()
stream.Dispose()

Při práci se soubory byste měl odchytávat IO výjimky a samozřejmě zavírat soubory.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano jiste. Diky za upozorneni, mensi preklep.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Možná budu vypadat jako úplný blbec, ale jsem v podstatě úplný začátečník samouk co se týče OOP. Dřív jsem dělal v PHP a to taky jako samouk. Uvedu příklad toho, co bych potřeboval vysvětlit co se týče toho rušení objektů:

Sub zmenastavu(ByVal stav As Integer)
        Dim objConnUserdb As New OleDbConnection("provider=....................;Unicode=True")
        Dim objCmdInsertPrikaz As New OleDb.OleDbCommand("UPDATE tab SET " & _
        "schvalovatel_name = '" & Session("UzivatelskeJmeno") & "', " & _
        "schvalovatel_stav = '" & stav & "', " & _
        "schvalovatel_datum = '" & Date.Today & "' WHERE ID = '" & Session("OtevritPrikaz") & "'", objConnUserdb)
        objConnUserdb.Open()
        objCmdInsertPrikaz.ExecuteNonQuery()
        objConnUserdb.Close()
        objConnUserdb.Dispose()
    End Sub

Jde mi o to, jestli mám pomocí dispose zrušit i objCmdInsertPrikaz a i další podobné objekty vytvořené pomocí new v celé aplikaci nebo jestli jsou tyto objekty zrušeny automaticky, aby nezabíraly žádné systémové prostředky

Díky moc

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ony se zruší automaticky, až je Garbage Collector bude sbírat, ale z hlediska kultury programování je daleko lepší rušit je hned pomocí volání Dispose, aby se zbytečně neplýtvalo. Dispose neuvolní objekt z paměti, ale uvolní systémové droje, které mohou být potřeba někde jinde.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

OK, teď už jsem se dozvěděl co jsem potřeboval. Děkuji velice za odpověd.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zjednodušeně řečeno používejte Using místo Dim u všech objektů, které implementují rozhraní IDisposable (to se dá zjistit v Object Browseru nebo .NET Reflectoru).

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

A co u oběktů, které deklaruji na globální úrovni? Třeba BITMAP, se kterou pracuji ve více procedurách, tam asi using nejde použít a musím použít dispose, že?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, přesně tak.

A píše se "objekty" a ne "oběkty", to vypadá fakt strašně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ups... díky za opravu. A když deklaruju onjekt na globální úrovni, stačí dát pouze

Bitmap mojeBitmapa;

a pak v kódu, až s bitmapou skutečně začnu pracovat, tak dám

mojeBitmapa = new Bitmap();

Je to tak správně?

Co se vlastně za běhu děje? Co se stane po spuštění? Alokuje se už nějaká paměť a nebo se paměť alokuje až když se provede NEW?

Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Onjekt? Objekt!

Pokud nadeklarujete global. proměnnou tak se paměť alokuje na a díky new už do té paměti jenom přiřazuje.

Pokud napíšete

 Bitmap mojeB; 

tak se vytvoří místo v paměti. Když potom třeba do Button1_Click dáte

 mojeB = new Bitmap 

tak se to místo naplní novou bitmapou.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

A jak to tedy udělat, abych třeba objekt Bitmap nebo Graphic mohl využívat ve více procedurách, ale abych nemusel alokovat paměť hned po startu aplikace?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevím, jestli něco takového jde.

A k čemu to chcete?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback