Laden...

Wie Settings referenzieren? / Bestimmte Aktionen nur im Debug-Modus ausführen

Erstellt von LL0rd vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.959 Views
L
LL0rd Themenstarter:in
22 Beiträge seit 2007
vor 12 Jahren
Wie Settings referenzieren? / Bestimmte Aktionen nur im Debug-Modus ausführen

Hallo Leute,

ich brauche mal eben einen Rat von euch. Ich habe ein Setting namens "debug". Damit möchte ich in meinem Programm debug Ausgaben einschalten können. Der Wert des Settings ist unter

Properties.Settings.Default.debug

abrufbar. Nun, ich habe irgendwie keine Lust den langen Rattenschwanz immer hinzuschreiben und dachte deshalb an eine Abkürzung. Deshalb habe ich einfach eine Klassenvariable deklariert und ihr den Wert des Settings zugewiesen:

private static bool debug = Properties.Settings.Default.debug;

Das Problem ist jetzt, dass wenn ich den Wert des Settings ändere, der Wert der statischen debug Variable immer noch der "alte" ist.

private static bool* debug = &Properties.Settings.Default.debug;

Ich könnte auch mit Pointern arbeiten, aber C# meldet mir: "Zeiger und Puffer fester Größe können nur in einem unsicheren Kontext verwendet werden."

Habt ihr eine Idee, wie ich einfach nur diesen langen Rattenschwanz abkürzen kann?

1.552 Beiträge seit 2010
vor 12 Jahren

Das Problem ist jetzt, dass wenn ich den Wert des Settings ändere, der Wert der statischen debug Variable immer noch der "alte" ist.

Bool ist ja auch kein Referenztyp sondern ein Wertetyp.
Wrappe es in ein Property, dann kannst du es so machen wie du willst:


public static bool Debug
{
    get
    {
        return Properties.Settings.Default.debug;
    }
}

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

B
198 Beiträge seit 2005
vor 12 Jahren

Für diesen Zweck kannst du auch mit dem Präprozessor arbeiten.

Bei den Codestellen bei denen du abprüfen willst ob du im DEBUG Modus bist, kannst du auch einfach

#if DEBUG

...

#endif

schreiben. Der Code innerhalb dieser Direktive wird dann nur ausgeführt wenn du im Debug Modus bist. Dann brauchst du den Settingseintrag nicht mehr.

Lg

5.742 Beiträge seit 2007
vor 12 Jahren

Oder du schaust dir das ConditionalAttribute an.

L
LL0rd Themenstarter:in
22 Beiträge seit 2007
vor 12 Jahren

Ich bin zwar von der Lösung von xxMUROxx begeistert, weil es genau das war, was ich mir vorgestellt habe, allerdings möchte ich die anderen beiden Lösungen auch "irgendwie" umsetzbar.

Worum geht es mir?
Ich habe ein Programm entwickelt und das Programm als Installationspaket (also ohne Quellcodes) ausgeliefert. Die Debug Ausgabe wird an zwei Stellen benötigt:

  1. um allgemeine Fehler näher zu spezifizieren und "einfache" User nicht durch genaue Fehlermeldungen zu verunsichern:
                catch (Exception eee)
                {
                    String debugstring = "";
                    if (debug)
                    {
                        debugstring = " Debug Exception Message:\n\n" + eee.ToString();
                    }
                    MessageBox.Show("The calculation process cannot be displayed. Maybe the image is not ready or there is no current calculation running." + debugstring);
                }
  1. ich weiß, dass es in dem Programm einen Fehler gibt, der sporadisch auftritt, wenn man Multitasking mit 64 Threads benutzt. Der Fehler tritt bei mir mit einer Wahrscheinlichkeit von 1:10.000.000 (also rund alle 150 Programmnutzungen) auf. Im "Debug" Modus möchte ich, dass das Programm abgebrochen wird, wie aktuell:
                    if(newCImageObjects.Count != numberOfNewObjects)
                        throw new Exception("something with the new object list is wrong...");

Im normalen Modus ist es allerdings kein Problem, wenn man die aktuelle Berechnung einfach abbricht und neustartet.

Ich finde, dass das Debug Setting hier richtig ist. Oder gibt es da eine Bessere alternative?

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo LL0rd,

die Alternativen von Blue_Dragon und winSharp93 wirken zur Compile-Time, man muss sich also schon beim Übersetzen entscheiden, ob man die Anwendung mit oder ohne Debugging-Code haben will. Wählt man "ohne", ist der Debugging-Code gar nicht in der Anwendung vorhanden. Bei deinem Vorschlag kannst du den Modus zur Laufzeit umschalten. Man kann nicht sagen, dass das eine besser ist als das andere. Beides hat seine Vor- und Nachteile.

herbivore