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
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!"
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?
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?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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?
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;
}
}
Ich habe mal ein Screenshot erstellt, was beim Debuggen passiert.
Gruß
Martinar
@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.
Mag sein, dass Extension-Methods wegen Linq eingeführt wurde, aber nutzen kann man sie generell. Weitere Infos/Links in gfoidls Beitrag weiter unten.
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!"
@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?
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
@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.
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!"
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code