Laden...

Debugger lässt Code-Passagen aus [==> durch Release weg optimiert, Debug verwenden]

Erstellt von Martinar vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.108 Views
M
Martinar Themenstarter:in
55 Beiträge seit 2010
vor 11 Jahren
Debugger lässt Code-Passagen aus [==> durch Release weg optimiert, Debug verwenden]

Hallo Community,

im Moment beschäftige ich mit dem Thema "Vererbung von Dictionary".
Ich würde gerne mein eigenes Dictionary entwerfen und mit eigenen Erweiterungen versehen.

Folgende Klasse habe ich entworfen:

    public class cTest<TKey, TValue> : Dictionary<TKey, TValue>
    {
        public cTest() : base() { }
        public bool RowExist()
        {
            return Convert.ToBoolean(this.Count);
        }
}

Wenn ich nun ein Objekt von dieser Klasse erstelle und die Methode RowExist aufrufe, so wie hier:

cTest<string, object> d = new cTest<string, object>();
                    if ( d.RowExist())
                    {
                        es = "JA";
                    }
                    else
                    {
                        es="NEIN";
                    }
//springt hier hin

Dann wird zwar die Methode ausgeführt, aber die IF-Condition wird nicht ausgeführt.

Habe nun in der MSDN und stackoverflow geschaut,aber nichts brauchbares gefunden. Ich hoffe, dass das kein Grundlagenfehler ist.
Hat jemand einen Rat, was ich noch genauer untersuchen muss, um den Fehler zu finden.

Grüße
Martinar

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo Martinar,

am Code ist an sich nichts auszusetzen und das muss schon funktionieren.

aber die IF-Condition wird nicht ausgeführt.

Wie meinst du das? Entweder wird der if- od. der else-Teil ausgeführt.

  
return Convert.ToBoolean(this.Count);  
  

Hier könntest du auch


return this.Count > 0;

schreiben, das finde ich leserlicher.

Klassennamen werden auch nicht mehr mit Präfixen versehen, also keine ungarische Notation. Siehe Guidelines for Names

Beachte bitte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
Martinar Themenstarter:in
55 Beiträge seit 2010
vor 11 Jahren

Hallo gfoidl,

also der Debugger springt von

if ( d.RowExist())

nach

                    }
//springt hier hin

Danke für die Guidelines, werde Sir mir mal anschauen und entscheiden, ob ich sie übernehmen werde bzw. intertessante Teile davon.

Aber zum Problem, kannst Du das nachvollziehen?

16.806 Beiträge seit 2008
vor 11 Jahren

Der Debugger kann nicht über das komplette if-Konstrukt springen. Das geht nicht. 🤔

Drückst Du vielleicht "Jump to next break point" (VS C# 2005 Tastaturlayout: F5) statt "Next Step"( F10 ) ?
Breakpoints im if mal gesetzt? Variable nach dem if ausgewertet?

5.742 Beiträge seit 2007
vor 11 Jahren

return this.Count > 0;

Streng genommen natürlich this.Count != 0 😉

Cleane mal die Solution und führe einen Rebuild durch. Treten evtl. Compilerfehler auf?
Verwendest du die Variable überhaupt?

S
417 Beiträge seit 2008
vor 11 Jahren

Unabhängig von deinem "if"-Problem, wäre es evtl. sinnvoller das ganze mittels Extension-Methods auszulagern, falls du nicht tiefgreifende Änderungen in Dictionary<> vornehmen musst, z. B. so:

public static class DictionaryExtensions
{
	public static bool RowExist<K,V>(this Dictionary<K,V> d)
	{
		return d.Count > 0;
	}
}
M
Martinar Themenstarter:in
55 Beiträge seit 2010
vor 11 Jahren

Ich habe mal ein Screenshot erstellt, was beim Debuggen passiert.

Gruß
Martinar

M
Martinar Themenstarter:in
55 Beiträge seit 2010
vor 11 Jahren

@Sarc
Laut dem Forum, sind Extension nur für LINQ da.
Und ich glaube Golo Roden, hatte mal einen Microsoft-Menschen mit dieser Aussage zitiert.

Hinweis von herbivore vor 11 Jahren

Mag sein, dass Extension-Methods wegen Linq eingeführt wurde, aber nutzen kann man sie generell. Weitere Infos/Links in gfoidls Beitrag weiter unten.

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo Martinar,

bist du im Release-Modus, da könnte es schon sein, dass das weg-optimiert wird, da die es-Variable ja nicht weiter benötigt wird. Stell auf Debug um, dann gehts.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
Martinar Themenstarter:in
55 Beiträge seit 2010
vor 11 Jahren

@gfoidl
Wow das war es!!! Aber wie kann das sein? Wird dann im Release-Modus die Variable "es" nicht gefüllt. Den Unterschied von Debug und Relase kann ich doch bestimmt in der MSDN finden oder?

Welche Einstellungen ist besser, wenn man neue Dinge entwickeln will?

16.806 Beiträge seit 2008
vor 11 Jahren

Entwicklung natürlich Debug. Deswegen heißts Debug. Im Release-Modus werden Code-Stellen optimiert, sodass Variablen, die niemals benötigt werden, im späteren IL-Code nicht mehr auftauchen. Auch werden Code-Strukturen u.U. optimiert. Entfallen von leeren Scopes etc.

Da die Debug-Metadaten aber solche Dinge beinhalten, sollte beim Debug ein "Wegoptimieren" auch nicht stattfinden. Kann man in den Projekteinstellungen definieren.

M
Martinar Themenstarter:in
55 Beiträge seit 2010
vor 11 Jahren

@Abt
Vielen Dank, hatte bis jetzt immer im Release-Modus programmiert.
Gibt es Guidlines, wie man sein IDE einstellen muss, damit das "Wegoptimieren" nicht stattfindet und die höchste Dichte an Informationen hat.

Habe gerade den Punkt weiter getestet und so springt er unter "Release" in die Unterpunkte:

                string es;
                string tr;
                es = string.Empty;
                try
                {
                    bool b;
                    bool t;
                    
                    if ( d.RowExist())
                    {
                        es = "JA";
                    }
                    else
                    {
                        es="NEIN";
                    }
                }
                catch(Exception ex)
                {
 
                }
                tr = es;

Ich möchte alllen Community-Mitgliedern danken, die mir geholfen haben.

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo Martinar,

nimm einfach DEBUG und gut ist es.

Laut dem Forum, sind Extension nur für LINQ da

Nicht nur. Siehe Wo genau Extension Methods einsetzen, wo besser eigene Klassen? und [Einführung] Extension Methods in C# 3.0. Bitte hier keine weitere Diskussion zu Erweiterungsmethoden, sondern ggf. in den anderen Threads. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.2.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

16.806 Beiträge seit 2008
vor 11 Jahren

Es heißt Release - weil das eben in der Regel für die Veröffentlichung gedacht ist. Die Einstellungen an für sich sind vom Standard okay. Aber wir können Dir hier keine Anleitung für das Einstellen von Visual Studio schreiben. Das ist auch nicht unsere Aufgabe 😉

Das Ding ist soo umfangreich und jeder hat seine eigenen Einstellungen der kompletten IDE - die Projektkonfiguration DEBUG und RELEASE sollte man aber an für sich so lassen.

Beschäftige Dich einfach mit der IDE selbstständig und Du wirst sie mit der Zeit kennen lernen.