IIF macht Problem

16/12/2010 - 11:28 von Wolfgang Badura | Report spam
Liebe Dotnet Gemeinde!

Ich verstehe nicht, warum dieser (zwecks Test vereinfachter) Code nicht
funktioniert:

Trace.WriteLine(" Me$ ends with $=<" & "me$".EndsWith("$"c) & ">")
IIf("me$".EndsWith("$"c) = True, strLoeschbar = "wahr", strLoeschbar =
"falsch")
Trace.WriteLine(" strLoeschbar=<" & strLoeschbar & ">")

Output
Me$ ends with $=<True>
strLoeschbar=<>

Folgender funktioniert

strLoeschbar = "falsch"
If "me$".EndsWith("$"c) Then strLoeschbar = "wahr"
Trace.WriteLine(" strLoeschbar=<" & strLoeschbar & ">")

Output
strLoeschbar=<wahr>

Vielleicht weiß jemand, Rat.

Mit bestem Dank
Wolfgang
 

Lesen sie die antworten

#1 Armin Zingler
16/12/2010 - 12:51 | Warnen spam
Am 16.12.2010 11:28, schrieb Wolfgang Badura:
Liebe Dotnet Gemeinde!

Ich verstehe nicht, warum dieser (zwecks Test vereinfachter) Code nicht
funktioniert:

Trace.WriteLine(" Me$ ends with $=<" & "me$".EndsWith("$"c) & ">")
IIf("me$".EndsWith("$"c) = True, strLoeschbar = "wahr", strLoeschbar =
"falsch")
Trace.WriteLine(" strLoeschbar=<" & strLoeschbar & ">")



Der zweite und dritte Parameter müssen Ausdrücke aber dürfen keine
Zuweisungen sein. IIf liefert als Funktionswert den zweiten oder
dritten Parameter als Wert zurück. Das sind jeweils Vergleiche.
Wenn "me$" mit "$" endet, und das trifft ja zu, liefert IIf den
Wert des ersten Ausdrucks zurück. IIf prüft also, ob strLoeschbar
den Wert "wahr" enthàlt. Das ist vermutlich nicht der Fall, also
liefert IIf den boolschen Wert False zurück. Da du den Funktionswert
aber ignorierst ist die ganze Zeile überflüssig. Richtig wàre:

strLoeschbar = IIf("me$".Endswith("$"c), "wahr", "falsch")

Wobei die IIf-Funktion eigentlich ausgedient hat und ich das
If-Schlüsselwort empfehle:

strLoeschbar = If("me$".Endswith("$"c), "wahr", "falsch")

Ist in diesem Fall zwar kein Unterschied, da IIf aber eine Funktion
ist, werden immer alle Ausdrücke zuerst ausgewertet, damit die
Werte an die Funktion übergeben werden können, wàhrend bei If
nur der jeweils benötigte Parameter berechnet wird. Also z.B.

dim breite = if(MyForm is nothing, 0, MyForm.Width)

Das funktioniert. Bei IIf würde das Prog abschmieren da die Auswertung
des dritten Ausdrucks zu einer NullReferenceException führen würde.


Armin

Ähnliche fragen