Das Feature "Bearbeiten und Fortsetzen" in C# 2.0

Veröffentlicht: 18. Jan 2005

Von 3 Leaf Solutions

Dieser Artikel bietet eine Übersicht über das neue Debug-Feature "Bearbeiten und Fortsetzen" in Visual C# 2005. Durch dieses Feature können Sie während des Debuggens einer Anwendung den Code ändern und diese Codeänderungen übernehmen, ohne die Anwendung schließen, neu erstellen und erneut ausführen zu müssen. (6 gedruckte Seiten)

Auf dieser Seite

 Einführung
 Was ist "Bearbeiten und Fortsetzen"?
 Wie unterstützt "Bearbeiten und Fortsetzen" die Entwickler?
 Verwenden von "Bearbeiten und Fortsetzen"
 Wie funktioniert "Bearbeiten und Fortsetzen"?
 Einschränkungen von "Bearbeiten und Fortsetzen"
 Festlegen der nächsten Anweisung
 Schlussbemerkung

Einführung

"Bearbeiten und Fortsetzen", im Folgenden als E&C (Edit and Continue) bezeichnet, ist ein neues, in Visual C# 2005 eingeführtes Debug-Feature. Durch dieses Feature können Sie während des Debuggens einer Anwendung den Code ändern und diese Codeänderungen übernehmen, ohne die Ausführung beenden und die Anwendung neu erstellen und erneut ausführen zu müssen.

In diesem Artikel erfahren Sie, was unter E&C zu verstehen ist. Er enthält eine Beispiel-Debugsitzung, in der E&C verwendet wird, sowie eine abschließende Darstellung, wie Sie die E&C-Unterstützung in C# am besten verwenden können.

 

Was ist "Bearbeiten und Fortsetzen"?

E&C ist ein neues Feature, durch das C#-Entwickler bestimmte Fehlerarten in ihrem Code auf produktive Weise beheben können. Wenn Sie in Ihrer Anwendung auf einen Fehler gestoßen sind, mussten Sie die Anwendung bisher beenden, den Code ändern und ihn neu kompilieren. Mit E&C müssen Sie die Anwendung jedoch nicht mehr beenden und neu kompilieren.

Beim Ändern von Code mit E&C wird die ausgeführte Anwendung im Speicher geändert. Dabei bleibt der Zustand der Anwendung erhalten, d. h. Variablen behalten zum Beispiel ihre Werte und Datenbankverbindungen bleiben geöffnet. Sie können die Ausführung der Anwendung einfach an derselben Stelle fortsetzen, jedoch wird dabei der neue Code verwendet. Dies hat zur Folge, dass Sie viel schneller als bisher Code schreiben und Änderungen daran vornehmen können. Dieses Feature ist auch bei der testgesteuerten Entwicklung nützlich. Wenn ein Test fehlschlägt, können Sie im betroffenen Codeabschnitt einen Haltepunkt setzen und den Code schrittweise ausführen, um festzustellen, an welcher Stelle der Fehler auftritt. Abhängig vom Fehler können Sie diesen möglicherweise sofort beheben und die Ausführung fortsetzen und überprüfen, ob der Test nun erfolgreich verläuft.

 

Wie unterstützt "Bearbeiten und Fortsetzen" die Entwickler?

Stellen Sie sich vor, dass Sie eine komplexe Windows Forms-Anwendung debuggen. Sie haben am Code einige Änderungen vorgenommen und führen die Anwendung nun schrittweise aus, um zu überprüfen, ob Ihre Änderungen wie erwartet funktionieren. Plötzlich fällt Ihnen auf, dass Ihnen ein kleiner Fehler unterlaufen ist: Sie haben eine SQL-Abfrage nicht korrekt formuliert. Verärgert beenden Sie die Anwendung, nehmen die Korrekturen vor und fangen wieder von neuem an.

Genau das ist ein typisches Szenario, in dem E&C helfen kann. Normalerweise arbeiten C#-Entwickler in einem Zyklus, der aus Codieren, Kompilieren und Debuggen besteht. Das bedeutet jedoch, dass Sie viel Zeit damit verbringen, die gesamte Anwendung neu zu kompilieren, obwohl Sie nur eine Codezeile geändert haben. E&C ändert diesen Ansatz und reduziert die Zeit, die zum Beheben von Fehlern erforderlich ist. Beispielsweise könnten Sie in oben genanntem Szenario einfach die SQL-Abfrage ändern und die Anwendung an derselben Stelle fortsetzen.

E&C erhöht die Produktivität von Entwicklern. Sie können sich jetzt darauf konzentrieren, Code zu schreiben und Fehler zu beheben, anstatt die Anwendung immer und immer wieder neu zu kompilieren und beim Ausführen der Anwendung denselben Zustand wiederherzustellen.

 

Verwenden von "Bearbeiten und Fortsetzen"

Im Folgenden werfen wir einen Blick auf einige beispielhafte Anwendungsszenarios. Diese enthalten einige allgemeine Aufgaben, die üblicherweise mit E&C durchgeführt werden.

Basisprojekt

Starten Sie Visual C# 2005 Express Edition und erstellen Sie eine neue Konsolenanwendung. Dadurch wird das Standardgerüst einer Anwendung mit einer Main-Methode für Sie erstellt. Sie müssen keine weiteren Schritte unternehmen, um das E&C-Feature zu aktivieren, es ist standardmäßig aktiviert.

Ändern von Variablen

Beginnen wir mit dem üblichen "Hello World"-Beispiel. Passen Sie die Methode Main folgendermaßen an:

static void Main(string[] args)
{
   string s = "Hello World";
   Console.WriteLine(s);
}

Legen Sie einen Haltepunkt für den Methodenaufruf Console.WriteLine fest. Wählen Sie den Menübefehl Debug | Start (Debuggen | Starten) aus, und starten Sie die Anwendung. Die Anwendung erreicht den Haltepunkt und unterbricht die Ausführung.

Nehmen wir nun einmal an, dass Sie mit der Tradition brechen und etwas anderes als "Hello World" auf der Konsole ausgeben möchten. Normalerweise müssten Sie die Anwendung beenden, die Änderungen vornehmen und die Anwendung dann erneut starten. Dies ist dank E&C jedoch nicht mehr erforderlich. Ändern Sie bei weiterhin unterbrochener Anwendung die Zeichenfolge "Hello World" in "Edit and continue rocks!".

   string s = "Edit and continue rocks!";

Wie schon in der vorherigen Version von Visual Studio können Sie den Ausführungspunkt einfach auf die Zeile verschieben, die Sie als nächste ausführen möchten. Dies bietet in Kombination mit E&C überwältigende neue Möglichkeiten. In unserem Beispiel müssen Sie den Zuweisungscode für die Zeichenfolge erneut ausführen. Verschieben Sie den Ausführungspunkt hierfür auf die geänderte Zeile, indem Sie den gelben Pfeil am Rand mit der Maus verschieben. Wenn Sie sich bereits tief im Innern einer Funktion befinden, können Sie den entsprechenden Wert auch einfach in den Fenstern Locals (Lokale) und Watch (Überwachen) oder im Befehlsfenster bearbeiten.

Bearbeiten des Codes
Abbildung 1: Bearbeiten des Codes ****

Drücken Sie F5, um die Anwendung zu starten. In der Statusleiste werden Meldungen angezeigt, mit denen Sie verfolgen können, wie die Codeänderungen kompiliert und übernommen werden. Im Konsolenfenster wird jetzt Edit and continue rocks! ausgegeben, nicht mehr Hello World. Im Gegensatz zu früheren Versionen von C# ist es nicht erforderlich, die Anwendung zu beenden und neu zu erstellen, um diese Änderung durchzuführen.

Ändern von Code

E&C funktioniert nicht nur beim Ändern von Zeichenfolgenvariablen. Sehen wir uns ein Szenario an, in dem ein allgemeiner Fehler mit E&C behoben wird. Bearbeiten Sie im selben Projekt den Code, so dass er folgendem Ausschnitt entspricht:

static void Main(string[] args)
{
   string s = "Hello World";
   
   for(int i=0; i <= s.Length ; i++)
   {
      Console.Write( s.Substring(i, 1) );
   }
}

Legen Sie für den Methodenaufruf Console.Write einen Haltepunkt fest und führen Sie die Anwendung mit dem Menübefehl Debug | Start (Debuggen | Starten) aus.

Dieses etwas konstruierte Beispiel macht nichts anderes als das erste Programm, enthält in der for-Schleife jedoch eine Indexüberschreitung (Error-by-One). Sie können diesen Fehler beheben, ohne das Programm anzuhalten und neu zu erstellen. Ändern Sie bei weiterhin unterbrochener Anwendung die Deklaration der for-Schleife wie folgt und führen Sie die Anwendung aus.

   for (int i=0; i < s.Length; i++)

Indem Sie eine Debugaktion durchführen, z. B. den nächsten Schritt ausführen, die Ausführung fortsetzen oder die nächste Anweisung festlegen, werden die Änderungen übernommen. Dadurch werden in der Statusleiste die Meldung Code changes were applied successfully (Codeänderungen wurden erfolgreich übernommen) und im Konsolenfenster die erwartete Ausgabe (hier also Hello World) angezeigt. Die vorgenommenen Codeänderungen wurden in das ausführbare Programm im Speicher übernommen.

Statusmeldung beim Übernehmen von Codeänderungen
Abbildung 2: Statusmeldung beim Übernehmen von Codeänderungen

 

Wie funktioniert "Bearbeiten und Fortsetzen"?

Obwohl E&C einfach zu verwenden ist, müssen die CLR und der Compiler zusammenarbeiten, um im Hintergrund einen Großteil der Arbeit zu bewältigen. Wenn Sie in einer Debugsitzung in der IDE eine Datei bearbeiten, überprüft der Compiler zuerst, ob Sie eine zulässige Änderung vorgenommen haben. Wenn es nicht möglich ist, diese Änderung durchzuführen, wird ein Dialogfeld wie das in Abbildung 3 angezeigt.

Meldungsfeld bei einer nicht zulässigen Änderung
Abbildung 3: Meldungsfeld bei einer nicht zulässigen Änderung

Wenn Sie auf die Schaltfläche Edit Code (Code bearbeiten) klicken, kehren Sie zur Debugsitzung zurück, und Sie können die Fehler beheben, die das Fortsetzen des Debugvorgangs verhindern. Wählen Sie diese Option, wenn die Fehler, die die Fortsetzung von E&C verhindern, Buildfehler sind. Wenn Sie auf die Schaltfläche Stop Debugging (Debuggen beenden) klicken, wird die aktuelle Debugsitzung beendet und Sie kehren in den Entwurfsmodus zurück. Wählen Sie diese Option, wenn die erkannten Fehler Änderungen sind, die Sie durchführen müssen. Der Compiler erzeugt Deltas der IL und der Metadaten, mit denen Teile der vorhandenen IL und Metadaten im Speicher ersetzt werden. Die Deltas beziehen sich hier einfach auf die Lücken, die verwendet werden, um den bearbeiteten Code einzufügen. Wenn die bearbeiteten Methoden mit JIT in nativen x86-Code kompiliert wurden, werden diese mit dem neuen x86-Code ersetzt.

 

Einschränkungen von "Bearbeiten und Fortsetzen"

Als allgemeine Regel für E&C-Änderungen können wir davon ausgehen, dass Sie praktisch alles innerhalb einer Methode ändern können. Größere Bereichsänderungen, die Code auf öffentlicher Ebene oder auf Methodenebene beeinflussen, werden hingegen nicht unterstützt. Es folgen einige Beispiele für diese nicht unterstützten Änderungen:

  • Ändern des Namens einer Klasse

  • Hinzufügen oder Entfernen von Methodenparametern

  • Hinzufügen von Feldern zu einer Klasse

  • Hinzufügen oder Entfernen von Methoden

Beachten Sie in diesen Fällen die Wellenlinie unter der entsprechenden Änderung. Wenn Sie fortsetzen, obwohl im Programm Wellenlinien angezeigt werden, wird Ihnen die Meldung in Abbildung 4 angezeigt.

Fehler bei einer nicht von E&C unterstützten
Abbildung 4: Fehler bei einer nicht von E&C unterstützten Änderung

 

Festlegen der nächsten Anweisung

In den Beispielen in diesem Artikel waren Sie sich der Fehler im Code schon bewusst. Oft finden Sie in der Praxis einen Fehler jedoch erst, wenn Sie über die entsprechende Codestelle schon hinaus sind. Wie Sie in unseren Beispielen gesehen haben, können Sie die erforderliche Änderung während der Ausführung der Anwendung vornehmen.

Dabei müssen Sie jedoch beachten, dass E&C keine Zeitmaschine ist. Wenn Sie Variablen, Initialisierungscode oder anderen Code ändern, der einen Einfluss auf die gerade ausgeführte Methode haben kann, können Sie den Ausführungszeiger mit dem Befehl Set Next Statement (Nächste Anweisung festlegen) im Kontextmenü an eine frühere Stelle im Code verschieben. Jedoch wird durch den Befehl Set Next Statement die Programmausführung nicht rückgängig gemacht. Es wird nur der Punkt verschoben, an dem die Ausführung fortgesetzt wird. Beachten Sie, dass Sie die Fenster Locals (Lokale) und Watch (Überwachen) sowie das Befehlsfenster verwenden können, um eine Anwendung schnell in den gewünschten Zustand zu versetzen, wenn beim Debuggen mehrere Versuche erforderlich sind.

 

Schlussbemerkung

E&C ist in Visual C# 2005 enthalten, um die Produktivität der Entwickler zu erhöhen. In diesem Artikel werden die Szenarios erläutert, in denen E&C von Vorteil sein kann.

Einer der größten Vorteile von E&C ist, dass nahezu jeder davon profitieren kann, unabhängig von den Kenntnissen über das Feature. Wir können alle einer reibungsloseren und seltener unterbrochenen Entwicklung entgegensehen, die es ermöglicht, dass ein Entwickler seinen Arbeitstag produktiver gestalten kann.