Macro-Ersatz für Assert?
-
Hi,
In C++/CLI ist ja folgendes möglich:
#define M_ASSERT(x) { System::Diagnostics::Debug::Assert((x), #x); }
D.h. in dem Assertion-Fenster erscheint auch die Bedingung, die geprüft wurde.
Gibt es einen Ersatz hierfür in C#? D.h. dass die Bedingung also automatisch als Beschreibung im Fenster erscheint?
-
-
FreakY<3Cpp schrieb:
http://msdn.microsoft.com/de-de/library/kssw4w7z(VS.80).aspx
Kleinen Tip: mit den URL-Tags funktionieren auch solche Links:
http://msdn.microsoft.com/de-de/library/kssw4w7z(VS.80).aspx
-
Nein,
in C# gibt es keine Makros, ist also nicht möglich. Du kannst aberSystem.Diagnostics.Debug.Assert(x != 0, "x != 0");
verwenden, was ja auch nicht wirklich umständlich ist.
Man kann zwar mit #define auch in C# Symbole definieren, ihnen aber keinen Wert zuweisen (als Bedingung für Kompilierung).
http://msdn.microsoft.com/de-de/library/yt3yck0x%28VS.80%29.aspx
-
asc schrieb:
FreakY<3Cpp schrieb:
http://msdn.microsoft.com/de-de/library/kssw4w7z(VS.80).aspx
Kleinen Tip: mit den URL-Tags funktionieren auch solche Links:
http://msdn.microsoft.com/de-de/library/kssw4w7z(VS.80).aspxViel besser wäre, man entfernt die Klammern und alles darin, dann wird man nämlich immer auf die aktuelle Version vom Artikel umgeleitet. Wie zum Beispiel diese zwei Links, welche ich Gugi empfehlen würde:
http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.assert.aspx
http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspxDer erste Link ist grundsätzlich das Gleiche, nur eine Ebene höher. Es gibt nämlich Überladungen von der Assert Funktion, wo man auch Nachrichten angeben kann.
Der zweite Link soll verdeutlichen, dass die Methode nur reinkompiliert wird, wennDEBUG
gesetzt ist. Also ähnlich wieassert
aus dem Header<cassert>
.Grüssli
-
Danke, aber mir ist klar, dass es verschiedene Überladungen von Assert gibt, und dass die nur aktiv sind, wenn DEBUG definiert ist.
Immer nochmals die Bedingung als Text anzugeben, finde ich etwas umständlich, darum meine Frage, ob man diesen Text automatisch generieren lassen kann.
Antwort ist also nein^^
Danke, mehr wollte ich nicht wissen
-
Man könnte Expressions dafür mißbrauchen.
Ganz grob etwa so ():
[Conditional("DEBUG")] public static void Assert(Expression<Func<bool>> expression) { System.Diagnostics.Debug.Assert(expression.Compile()(), expression.ToString()); } .... Assert(()=>X!=0);
Nicht perfekt, spart aber ein wenig Schreibarbeit.
-
Ich finde die Lösungen alle mehr oder weniger grauenhaft. Die "beste Lösung" ist IMO auf den "Expression-String" zu verzichten, und einfach
Debug.Assert(condition)
zu schreiben.Debug.Assert(x != 0, "x != 0");
finde ich ziemlich grauenhaft (Wartbarkeit, Lesbarkeit).Das nicht-vorhandensein von Makros in C# ist eine fast genauso schlimme Sache wie der Misbrauch von Makros in C und C++.
Andrerseits... für diverse Code-Refactoring/-Analyse Tools ist es natürlich toll dass es keine Makros gibt...