2016-08-05 6 views
1

Ich habe einen einfachen Code in regex:Verwenden von Regex und sauberem String-Speicher?

string strFile5 = File.ReadAllText(@"C:\Users\dennis\Desktop\regex.txt"); 

strFile5 = Regex.Replace(strFile5, @"Documents", "document2"); 
File.WriteAllText(@"C:\Users\dennis\Desktop\regex2.txt", strFile5); 

I strFile5 aus dem Speicher entfernen möchten.

+1

Um .. auf Null gesetzt? Es ist ziemlich schwer zu tun, da Strings unveränderlich sind. Was sind deine Bedenken? – Botonomous

+1

Warum verwenden Sie überhaupt die Bibliothek "Regex" – Jonesopolis

+1

1) Regex in diesem Problem ist Overkill, 2) Sie brauchen sich nicht darum kümmern, wird GC alle Arbeit erledigen. –

Antwort

5

Die GC lokale Variablen für die Sammlung markiert, wenn sie nicht mehr verwendet werden. Du musst dir deswegen keine Sorgen machen.

Gelesen: Should I Set Variables to Null to Assist Garbage Collection?

Beispiel von Jeffrey Richter in CLR über C#:

public static void Main() 
{ 
    Timer t = new Timer(TimerCallback, null, 0, 2000);   
    Console.ReadLine();  
} 

Wenn die Sammlung beginnt, es wird davon ausgegangen, dass zuerst alle Objekte in der Halde nicht erreichbar sind (garbage); Dazu gehört das Timer-Objekt. Dann, der Kollektor untersucht die Wurzeln der Anwendung und sieht, dass Main nicht die t-Variable nach der ursprünglichen Zuordnung zu ihm verwendet. Daher hat die Anwendung keine Variable, die sich auf das Objekt Timer bezieht, und die Speicherbereinigung ruft den Speicher dafür zurück; Diese stoppt den Timer und erklärt, warum die TimerCallback-Methode nur einmal aufgerufen wird.

Nehmen wir an, Sie verwenden einen Debugger, um durch Main zu gehen, und eine Garbage Collection passiert gerade, kurz nachdem t die Adresse des neuen Timer-Objekts zugewiesen wurde. Angenommen, Sie versuchen, das Objekt anzuzeigen, auf das sich t bezieht, indem Sie das Quick Watch des Debuggers verwenden. Was denkst du wird passieren? Der Debugger kann Ihnen das Objekt nicht anzeigen, da es nur Müll gesammelt wurde. Dieses Verhalten würde von den meisten Entwicklern als sehr unerwartet und unerwünscht angesehen werden, so dass Microsoft eine Lösung gefunden hat.

Wenn Sie Ihre Assembly mit dem C# Compiler/Debug-Schalter, der Compiler wendet eine System.Diagnostics.DebuggableAttribute mit seinen DebuggingModes’ DisableOptimizations Flag gesetzt in die resultierende Baugruppe zusammenstellen. Zur Laufzeit beim Kompilieren einer Methode sieht der JIT-Compiler dieses Flag gesetzt und verlängert künstlich die Lebensdauer aller Wurzeln auf das Ende der Methode. Für mein Beispiel trickst der JIT-Compiler sich selbst zu glauben, dass die t-Variable in Main bis Ende der Methode leben muss. Also, wenn eine Garbage Collection stattfinden sollte, denkt der Müll Collector jetzt, dass t immer noch ein Root ist und dass das Timer Objekt , auf das sich t bezieht, weiterhin erreichbar sein wird.Das Timer-Objekt überlebt die Sammlung und die TimerCallback-Methode wird wiederholt aufgerufen, bis Console.ReadLine zurückkehrt und Main beendet wird.

+0

Woah, was ist, wenn er die Datei von der Festplatte entfernen will und wir alle die Variable annehmen? Verblüfft. – Botonomous

+0

@Botonomous dann ist die Frage nicht klar :) – user3185569

+0

Ich kann nicht herausfinden, warum jemand eine Frage über die Beseitigung einer lokalen Zeichenfolge stellen würde .. Vielleicht kommt er aus C++ Land. – Botonomous

6

Sie müssen sich keine Sorgen um Ihre Variable strFile5 machen, sobald sie nicht mehr im Geltungsbereich ist, wird sie vom Garbage Collector erfasst. Es gibt nichts, was Sie tun müssen.

Auch, es gibt keine Notwendigkeit zu verwenden Rgex.Replace eine einfache string.Replace würde die Arbeit tun.

Sie können tun, auch, dass alle in einer einzigen Anweisung ohne jede Variable beteiligt wie:

File.WriteAllText(@"C:\Users\dennis\Desktop\regex2.txt", 
        File.ReadAllText(@"C:\Users\dennis\Desktop\regex.txt") 
         .Replace("Documents", "document2")); 
+0

Um pedantisch zu sein, wäre es richtiger zu sagen: "Einmal außerhalb des Geltungsbereichs * kann * der Müllsammler * irgendwann * gesammelt werden." Wie auch immer, zu diesem Zeitpunkt ist es für den Entwickler kein Problem mehr, es sei denn, es enthält einige sensible Daten. –

+4

@GlorinOakenfoot, plus wenn es sensible Daten enthält, ist es besser, ['SecureString'] zu verwenden (https://msdn.microsoft.com/en-us/library/system.security.securestring (v = vs.110) .aspx) – Habib

+0

Wie sichere Zeichenfolge über Regex verwenden? –