Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Richtiges Löschen globaler Variablen in VB.NET

Frage Entwicklung Visual Studio

Mitglied: MarcoBorn

MarcoBorn (Level 1) - Jetzt verbinden

11.01.2018 um 13:48 Uhr, 160 Aufrufe, 10 Kommentare

Hallo Forum,
ich habe ein Verständnisproblem, wie man Variablen richtig wieder löscht. Folgendes Beispiel.

Ich habe ein Programm, das aus 2 Klassen besteht, einer Hauptklasse und einer Unterklasse. In der Hauptklasse definiere ich eine globale Variable, die auf das Interface der Unterklasse verweist, so dass ich die Funktionen der Unterklasse dort nutzen kann. Wie kann ich aber bei Programmende diese Variablen wieder richtig löschen, damit der Speicher wieder freigegeben wird?

Kann mir bitte jemand ein kurzes Beispiel hierfür zeigen?


Vielen Dank,
M. Born
Mitglied: colinardo
11.01.2018, aktualisiert um 14:48 Uhr
Servus M.Born.
Da gibt's verschiedene Möglichkeiten, die gängigste ist die Nutzung des Using-Statements
01.
Using obj as new Subclass  
02.
    ' hier ist die Variable "obj" gültig 
03.
End Using 
04.
' ab hier existiert sie nicht mehr
Im Allgemeinen wird der Speicher einer Variablen aber automatisch wieder freigegeben wenn sei Out of Scope Ist und sie nicht mehr benötigt wird. Die Garbage Collection sorgt regelmäßig dafür.
Manuell können Objekte über ihre Dispose() Methode freigegeben werden sofern das Interface dafür implementiert ist, für das Using ist ebenfalls IDisposable zu implementieren.
Detailliertere Info dazu
https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/l ...

Grüße Uwe
Bitte warten ..
Mitglied: emeriks
11.01.2018 um 14:02 Uhr
Hi,
ja, entweder mit "Using". Das setzt "Disposable Support" in den Klassen voraus. ("Implements IDisposable")

Aber:
Wenn Du da keine API mit Declare aufrufst, dann wird beim Programmende (Prozessende) eines VB.Net-Programms eh aller Speicher geleert.

E.
Bitte warten ..
Mitglied: MarcoBorn
11.01.2018 um 14:12 Uhr
Hallo Uwe,
vielen Dank für die schnelle Antwort.

Das mit dem Using hatte ich an einigen Stellen auch schon eingesetzt. Bei einer globalen Variable erhalte ich aber den Hinweis, dass die Verwendung außerhalb einer Variable nicht zulässig ist.
Verwende ich Using innerhalb von Methoden erhalte ich in einigen Fällen die Meldung, dass die Subklasse System.IDisposable implementieren muss.

In dem Programming-Guide aus Deinem Link wird wieder auf die Dispose-Funktionen verwiesen. Mir ist nur nicht ganz klar, wo die genau hingehören, in die Haupt- oder Subklasse und wie ich dann dem GC mitteile, dass die Subklasse nicht mehr benötigt wird. Gibt es irgendwo im Netz ein Tutorial, wo an einem einfachen Beispiel der Einsatz von Dispose und Finalize etc. dargestellt wird?

Viele Grüße,
M. Born
Bitte warten ..
Mitglied: emeriks
11.01.2018, aktualisiert um 14:35 Uhr
Jene Klasse, deren Instanz Du mit "Using" eingrenzt, muss die Schnittstelle "IDisposable" implementieren.

01.
Class Test1 
02.
End Class
füge einfach hinzu "Implements IDisposable" <Enter>
Nach dem Enter fügt er Dir am Ende der Klasse einen Block mit notwendigen Member hinzu.
01.
Public Class Test1 
02.
  Implements IDisposable 
03.
 
04.
#Region "IDisposable Support" 
05.
  Private disposedValue As Boolean ' So ermitteln Sie überflüssige Aufrufe 
06.
 
07.
  ' IDisposable 
08.
  Protected Overridable Sub Dispose(disposing As Boolean) 
09.
    If Not Me.disposedValue Then 
10.
      If disposing Then 
11.
        ' TODO: Verwalteten Zustand löschen (verwaltete Objekte). 
12.
      End If 
13.
 
14.
      ' TODO: Nicht verwaltete Ressourcen (nicht verwaltete Objekte) freigeben und Finalize() unten überschreiben. 
15.
      ' TODO: Große Felder auf NULL festlegen. 
16.
    End If 
17.
    Me.disposedValue = True 
18.
  End Sub 
19.
 
20.
  ' TODO: Finalize() nur überschreiben, wenn Dispose(ByVal disposing As Boolean) oben über Code zum Freigeben von nicht verwalteten Ressourcen verfügt. 
21.
  'Protected Overrides Sub Finalize() 
22.
  '    ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(ByVal disposing As Boolean) Bereinigungscode ein. 
23.
  '    Dispose(False) 
24.
  '    MyBase.Finalize() 
25.
  'End Sub 
26.
 
27.
  ' Dieser Code wird von Visual Basic hinzugefügt, um das Dispose-Muster richtig zu implementieren. 
28.
  Public Sub Dispose() Implements IDisposable.Dispose 
29.
    ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(disposing As Boolean) Bereinigungscode ein. 
30.
    Dispose(True) 
31.
    GC.SuppressFinalize(Me) 
32.
  End Sub 
33.
#End Region 
34.
 
35.
End Class 
36.
 
Bitte warten ..
Mitglied: emeriks
11.01.2018, aktualisiert um 14:34 Uhr
Wenn Du jetzt

01.
Using X as Test1 
02.
  .... 
03.
End Using
anwendest, dann wir beim Verlassen des Using-Blocks für X (Instanz von Test1) automatisch die Methode "Dispose" ausgeführt.

Wenn Du jetzt in Klasse "Test1" z.B. eine List(of String) hast, dann kannst Du in der Methode "Dispose" diese Liste explizit leeren lassen.
(Zeile 4 - 10)
(Zeile 21)

01.
Public Class Test1 
02.
  Implements IDisposable 
03.
 
04.
  Private MyList as new List(of String) 
05.
 
06.
  Public Sub New() 
07.
     For I as Integer = 1 to 1000 
08.
        MyList.Add(I) 
09.
     End 
10.
  End Sub 
11.
 
12.
#Region "IDisposable Support" 
13.
  Private disposedValue As Boolean ' So ermitteln Sie überflüssige Aufrufe 
14.
 
15.
  ' IDisposable 
16.
  Protected Overridable Sub Dispose(disposing As Boolean) 
17.
    If Not Me.disposedValue Then 
18.
      If disposing Then 
19.
        ' TODO: Verwalteten Zustand löschen (verwaltete Objekte). 
20.
 
21.
        MyList.Clear 
22.
 
23.
      End If 
24.
 
25.
      ' TODO: Nicht verwaltete Ressourcen (nicht verwaltete Objekte) freigeben und Finalize() unten überschreiben. 
26.
      ' TODO: Große Felder auf NULL festlegen. 
27.
    End If 
28.
    Me.disposedValue = True 
29.
  End Sub 
30.
 
31.
  ' TODO: Finalize() nur überschreiben, wenn Dispose(ByVal disposing As Boolean) oben über Code zum Freigeben von nicht verwalteten Ressourcen verfügt. 
32.
  'Protected Overrides Sub Finalize() 
33.
  '    ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(ByVal disposing As Boolean) Bereinigungscode ein. 
34.
  '    Dispose(False) 
35.
  '    MyBase.Finalize() 
36.
  'End Sub 
37.
 
38.
  ' Dieser Code wird von Visual Basic hinzugefügt, um das Dispose-Muster richtig zu implementieren. 
39.
  Public Sub Dispose() Implements IDisposable.Dispose 
40.
    ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(disposing As Boolean) Bereinigungscode ein. 
41.
    Dispose(True) 
42.
    GC.SuppressFinalize(Me) 
43.
  End Sub 
44.
#End Region 
45.
End Class 
46.
 
Bitte warten ..
Mitglied: MarcoBorn
11.01.2018 um 14:48 Uhr
Hallo,
Dir auch vielen Dank für die Hilfe. Ich habe Deine Vorgehensweise versucht, in meinem Programm umzusetzen. Hier der Code aus meiner Haupt-Klasse:
01.
Private Sub mPrüfung() 
02.
  Using mStatusfenster As IStatusfenster = New ClsStatusfensterklasse 
03.
    mStatusfenster.Show() 
04.
  End Using 
05.
End Sub
In der Sub-Klasse habe ich jetzt folgenden Code:
01.
Friend Interface IStatusfenster 
02.
  'weitere Funktionen 
03.
  Sub Dispose() 
04.
End Interface 
05.
 
06.
Friend Class ClsMboStatusfensterklasse 
07.
  Implements IStatusfenster, IDisposable 
08.
 
09.
#Region "IDisposable Support" 
10.
'Die 3 automatisch erstellten Funktionen für Dispose und Finalize 
11.
#End Region
Ich erhalte jetzt aber weiterhin die Fehlermeldung "Ein Using-Operand vom Typ "IStatusfenster" muss System.IDisposable implementieren." Nutze ich stattdessen Dim, funktioniert der Code. Woran kann das liegen?

Viele Grüße,
M. Born
Bitte warten ..
Mitglied: emeriks
11.01.2018, aktualisiert um 15:03 Uhr
Wozu das "IStatusfenster" ?

01.
Using mStatusfenster As New ClsMboStatusfensterklasse  
02.
.... 
03.
 
04.
Friend Class ClsMboStatusfensterklasse  
05.
  Implements IDisposable  
06.
.....
Bitte warten ..
Mitglied: MarcoBorn
11.01.2018 um 15:14 Uhr
Das liegt daran, dass ich in der Statusfensterklasse private Methoden habe, die ich über das Interface bereitstelle. Lösche ich es aus der Implements-Anweisung raus, bekomme ich die Meldung "Die Schnittstelle IStatusfenster wird nicht von dieser Klasse implementiert."
Bitte warten ..
Mitglied: emeriks
LÖSUNG 11.01.2018, aktualisiert um 15:38 Uhr
Ich kann nicht ganz folgen, kenne Dein Klassen-Design nicht.

Im "IStatusfenster" muss der Member "Dispose" raus. Soviel ist klar.
Und die "ClsMboStatusfensterklasse" kann ja "IStatusfenster" implementieren.
(Überhaupt: "ClsMboStatusfensterklasse" vs. "....= New ClsStatusfensterklasse" --- Schreibfehler?)

Beim "Using" darfst Du aber nicht auf die Schnettstelle "IStatusfenster" einschränken, weil diese nicht "IDisposable" implementiert.
Wenn doch notwendig dann so
01.
  Using mStatusfenster As New ClsMboStatusfensterklasse  
02.
     dim xStatusfenster as IStatusfenster = DirectCast(mStatusfenster,IStatusfenster) 
03.
 
04.
    .... mit xStatusfenster weiterarbeiten 
05.
   xStatusfenster.Methode_XYZ_von_IStatusfenster() 
06.
    
07.
    ... oder .... 
08.
 
09.
   With DirectCast(mStatusfenster,IStatusfenster) 
10.
      .Methode_XYZ_von_IStatusfenster()  
11.
   End With 
12.
  End  Using
Bitte warten ..
Mitglied: MarcoBorn
11.01.2018 um 16:11 Uhr
Das Dispose habe ich jetzt aus dem IStatusfenster entfernt.

Nachdem ich auch den Umweg über DirectCast nutze, funktioniert auch die Using-Anweisung. Ich werde jetzt alle Klassen meines Programms so umstellen.

Vielen Dank,
M. Born
Bitte warten ..
Ähnliche Inhalte
Visual Studio
Variablen in VB.NET
gelöst Frage von MarcoBornVisual Studio4 Kommentare

Hallo Forum, in VB.NET gibt es ja die Möglichkeit, Variablen global oder lokal zu definieren. Zusätzlich können Variablen auch ...

Visual Studio
Variabler Ordnername VB.Net
gelöst Frage von Tealk144Visual Studio12 Kommentare

Servus, also ich habe einen Ordner an dem immer ein Datum angehängt ist, diesen Variablen namen müsste ich irgendwie ...

Entwicklung
Label Software mit globaler Variable
Frage von amayerEntwicklung2 Kommentare

Hallo, ich bin auf der Suche nach einer Software, mit der ich Labels gestalten kann. Ansich nichts besonderes, Bild, ...

VB for Applications
VB.NET - Variable aus Textbox in Progressbar ausgeben
gelöst Frage von TermimanVB for Applications2 Kommentare

Hallo liebe Programmier, mich plagt seit gestern ein kleines Problem : Ich habe mir eine kleine Prozedur geschrieben mit ...

Neue Wissensbeiträge
Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 1 StundeTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 1 StundeSicherheit4 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 2 StundenSicherheit3 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Sicherheit

Meltdown und Spectre: Die machen uns alle was vor

Information von Frank vor 2 StundenSicherheit10 Kommentare

Aktuell sieht es in den Medien so aus, als hätten die Hersteller wie Intel, Microsoft und Co den aktuellen ...

Heiß diskutierte Inhalte
Batch & Shell
Anmeldevorgang für Informatikraum (Schule) unter Windows
gelöst Frage von IngenieursBatch & Shell29 Kommentare

Hey zusammen, ich werde in naher Zukunft den Informatik Raum meiner jetzigen Schule von dem aktuellen Betreiber übernehmen (Vertrag ...

Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von 92943Windows 1027 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Netzwerkgrundlagen
Welches Modem für VDSL 50000 der T-Com
Frage von Windows10GegnerNetzwerkgrundlagen19 Kommentare

Hallo, ein Kollege von mir will sich VDSL50000 von der T-Com holen, um daran einen Server zu betreiben. Ich ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...