System.IDisposable.Dispose Fehler?

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Stefan.

    System.IDisposable.Dispose Fehler?

    Ich hab das Problem das mir VB sagt objRead und objWrite nicht entlang allen Ausnahmepfaden verworfen werden. und ich Soll System.IDisposable.Dispose für ObjRead und ObjWrite aufrufen, bevor alle verweise darauf außerhalb des gültigen Bereichs liegen.

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Public Class Form1
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. Dim objRead As New StreamReader("Path.txt")
    6. Dim lin As String = objRead.ReadLine()
    7. Dim folderDlg As New FolderBrowserDialog
    8. folderDlg.ShowNewFolderButton = True
    9. If (folderDlg.ShowDialog() = DialogResult.OK) Then
    10. Dim root As Environment.SpecialFolder = folderDlg.RootFolder
    11. If File.Exists("Path.txt") = False Then
    12. MsgBox("Bitte geben Sie einen Speicherort für Ihr Projekt an.", vbInformation, "Pfadangabe")
    13. Dim objWriter As New StreamWriter("Path.txt", False)
    14. objWriter.WriteLine(folderDlg.SelectedPath)
    15. objWriter.Close()
    16. Else
    17. For Each folder As String In IO.Directory.GetDirectories(lin)
    18. ComboBox1.Items.Add(New IO.DirectoryInfo(folder).Name)
    19. Next
    20. End If
    21. End If
    22. 'Alles schliesen
    23. objRead.Close()
    24. End Sub


    Warum ist das so? Und was kann ich dagegen tun? ?(

    Stefan schrieb:

    Und was kann ich dagegen tun?
    Nimm Using.
    Using

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Using objRead As New StreamReader("Path.txt")
    3. Dim lin As String = objRead.ReadLine()
    4. Dim folderDlg As New FolderBrowserDialog
    5. folderDlg.ShowNewFolderButton = True
    6. If (folderDlg.ShowDialog() = DialogResult.OK) Then
    7. Dim root As Environment.SpecialFolder = folderDlg.RootFolder
    8. If File.Exists("Path.txt") = False Then
    9. MsgBox("Bitte geben Sie einen Speicherort für Ihr Projekt an.", vbInformation, "Pfadangabe")
    10. Dim objWriter As New StreamWriter("Path.txt", False)
    11. objWriter.WriteLine(folderDlg.SelectedPath)
    12. Else
    13. For Each folder As String In IO.Directory.GetDirectories(lin)
    14. ComboBox1.Items.Add(New IO.DirectoryInfo(folder).Name)
    15. Next
    16. End If
    17. End If
    18. 'Alles schliesen
    19. End Using
    20. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die Hilfe.
    Hab mal eine Algemeine Frage:
    Darf ich hier in einem Forum, mein Gesamtes Project stück für stück durchgen? Um Eventuele Fehler zu vermeiden? Ich habe nicht sehr viel erfahrung mit Posten von Beiträgen. Da ich selten irgendewas im Internet schreibe. ?(
    Hat glaub keiner was dagegen. Über anner Leuts Code herziehen ist unsere Lieblingsbeschäftigung :D

    Kannst auch überlegen, es komplett in den SourceCode-Austausch zu stellen.
    Musst nur ein dickes Fell haben, weil manch Besserwisser vergreift sich auch mal im Ton, und da nicht in Flamewars abzugleiten ist manchmal auch eine Aufgabe ;)

    Stefan schrieb:

    stück für stück durchgen
    Ich rate da immer, ein komplexes Projekt in eine Reihe disjunkter Teilprojekte zu zerlegen und diese einzeln in je einem kleinen Testprojekt zu untersuchen.
    Wenn Du mit allen Teilaufgaben zufrieden bist, fügst Du es zu einem neuen Gesamtprojekt zusammen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke, dann kann ich mein Project ja hier rein machen? nur das mir dem in den Source Code Stellen hab ich nicht so verstanden.
    Ich habe den Vorschlag Umgesetzt und Using anstatt Dim für den StreamReader verwendet. Und habe ObjWriter.Dispose() verwendet und bekomme keine Fehler mehr. Vielen Dank. So Lerne Ich anständig Progn. :D :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Stefan“ ()

    Ich musste den Code abändern. Es soll überprüft werden ob Die datei "path.txt" Exsistiert. Und wenn sie NICHT Exsistiert dann soll ein folderBrowsingDialog aufgerufen werden und der angegebene Pfad in die Datei "path.txt" gespeichert werden. Anschliesend soll der die Datei eingelesen werden (enthält den Pfad) und alle Ordner innerhalb des Pfades sollen in einer ComboBox aufgelisstet werden. So wie mein Code ist (mit Dispose) bekomme Ich keine Fehler von VS. Aber das Programm macht nichts von dem was ich möchte. wenn ich denn Dispose befehl (Ressourcen Freigeben ) am Ende meiner Befehlskette setze. macht das Programm was ich möchte, aber VS zeigt mir Fehler an, das ich Dispose Setzen soll. warum ist das So und was kann ich dagegen machen? ?(
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. If File.Exists("Path.txt") = False Then
    3. MsgBox("Bitte geben Sie einen Speicherort für Ihr Projekt an.", vbInformation, "Pfadangabe")
    4. Dim folderDlg As New FolderBrowserDialog
    5. folderDlg.Dispose()
    6. folderDlg.ShowNewFolderButton = True
    7. If (folderDlg.ShowDialog() = DialogResult.OK) Then
    8. Dim root As Environment.SpecialFolder = folderDlg.RootFolder
    9. Dim myWriter As New StreamWriter("Path.txt", False)
    10. myWriter.Dispose()
    11. myWriter.WriteLine(folderDlg.SelectedPath)
    12. Dim objRead As New StreamReader("Path.txt")
    13. objRead.Dispose()
    14. Dim lin As String
    15. lin = objRead.ReadLine()
    16. For Each folder As String In IO.Directory.GetDirectories(lin)
    17. ComboBox1.Items.Add(New IO.DirectoryInfo(folder).Name)
    18. Next
    19. End If
    20. Else
    21. Dim objRead As New StreamReader("Path.txt")
    22. objRead.Dispose()
    23. Dim lin As String
    24. lin = objRead.ReadLine()
    25. For Each folder As String In IO.Directory.GetDirectories(lin)
    26. ComboBox1.Items.Add(New IO.DirectoryInfo(folder).Name)
    27. Next
    28. End If
    29. End Sub


    Manchmal glaube ich ich bin zu blöd für alles. :S

    Stefan schrieb:

    Es soll überprüft werden ob Die datei "path.txt" Exsistiert.

    VB.NET-Quellcode

    1. If Not IO.File.Exist(DEINE_DATEI_MIT_PFAD) Then
    2. ' nicht da
    3. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dispose heißt sowas wie "loswerden", "abstoßen", "freistellen", "wegschmeißen".
    Also wenn du deine OpenFileDialog gleich nachdem du ihn erstellst wieder wegschmeißt, dann kann der auch nicht viel machen, und man wundert sich nur, dasses nicht richtig abstürzt.
    Disposen tut man ein Dingens erst, wennmans nicht mehr braucht.

    Und wie ich sehe, hast du Option Strict Off - das nix gutt: Option Strict On! - das dürfte weitere Fehler zutagefördern.
    Das mit Dispose verstehe ich ja. Aber wenn ich das so ... mache funktioniert das Prog. aber ich bekomme Fehler angezeigt von VS??? un was ist mit Option Strict Off gemeint?? Da versteh ich nur Bahnhof. Fals damit die "If folder... = False then gemeint ist. Ok das kann man umdrehen und das False weg lassen.?? ;(
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. If Not IO.File.Exists("Path.txt") Then
    3. MsgBox("Bitte geben Sie einen Speicherort für Ihr Projekt an.", vbInformation, "Pfadangabe")
    4. Dim folderDlg As New FolderBrowserDialog
    5. folderDlg.ShowNewFolderButton = True
    6. If (folderDlg.ShowDialog() = DialogResult.OK) Then
    7. Dim root As Environment.SpecialFolder = folderDlg.RootFolder
    8. Dim myWriter As New StreamWriter("Path.txt", False)
    9. myWriter.WriteLine(folderDlg.SelectedPath)
    10. Dim objRead As New StreamReader("Path.txt")
    11. Dim lin As String
    12. lin = objRead.ReadLine()
    13. For Each folder As String In IO.Directory.GetDirectories(lin)
    14. ComboBox1.Items.Add(New IO.DirectoryInfo(folder).Name)
    15. Next
    16. objRead.Dispose()
    17. myWriter.Dispose()
    18. End If
    19. folderDlg.Dispose()
    20. Else
    21. Dim objRead As New StreamReader("Path.txt")
    22. Dim lin As String
    23. lin = objRead.ReadLine()
    24. For Each folder As String In IO.Directory.GetDirectories(lin)
    25. ComboBox1.Items.Add(New IO.DirectoryInfo(folder).Name)
    26. Next
    27. objRead.Dispose()
    28. End If
    29. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Stefan“ ()

    Option Strict On heißt, dass dir der Compiler sagt, dass eine Zeichenkette keine Zahl ist (String != Integer). Oder auch, dass Äpfel keine Birnen sind. Sieh dir dazu auch mal den Link von @ErfinderDesRades an, da ist das sehr gut erklärt.
    Mit freundlichen Grüßen,
    Thunderbolt
    Ok Strict On Hab Ich. Aber VS zeigt mir immernoch die Warnungen an. und Ich verstehe es immer noch nicht, warum.? Es funktioniert. aber was ist Falsch.?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Stefan“ ()

    Stefan schrieb:

    Aber VS zeigt mir immernoch die Warnungen an.
    Welche?
    Bei mir werden keine Warnungen angezeigt.
    Was mir allerdings auffällt: Eine MessageBox hat in der Form_Load nix zu suchen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi, VS 2010 zeigt mir immer warnung an das ich Dispose setzen soll und das habe ich ja getan wie oben zu sehen.Das mit Dispose, hab ich ja verstanden, ist ja nicht altzu schwer zu verstehen. Die MassageBox hab ich, damit der Benutzer weiss was er im nächsten Fanster (BrowsingTialog) zu tun hat. Oder hast du einen besseren forschlag. Bin schon am verzweifeln, weil icch hier Extra das Projekt neu angefangen habe, da ich nicht weitergekommen bin. Bin für jede hilfe offen. Pls.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Stefan“ ()

    Stefan schrieb:

    VS 2010 zeigt mir immer warnung an das ich Dispose setzen soll.
    Bei mir nicht.
    Kannst Du bitte mal einen Screenshot oder so swas posten, das ich das nachvollziehen kann?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!