ERLEDIGT
JA
JA
ANTWORTEN
7
7
ZUGRIFFE
12398
12398
EMPFEHLEN
-
Hallo!
Wenn man in VB.Net prüfen will, ob eine Objektvariable "Nothing" ist, dann hat man zwei Möglichkeiten:
Kann mir jemand sagen wo da der Unterschied liegt bzw. warum es zwei Varianten gibt?Code vbnet:1 2 3 4
'entweder Ergebnis = (Object Is Nothing) 'oder Ergebnis = IsNothing(Object)
Geändert von Shakie (18.07.06 um 18:12 Uhr)
hihi = -h²
-
Natürlich kann dir das wer sagen. Hier zuerst die Variante (object is nothing) als Sourcecode:
Code :1 2 3 4 5 6 7 8
Module Module1 Sub Main() Dim muh As Object Console.WriteLine(muh Is Nothing) End Sub End Module
Daraus resultiert folgender MSIL-Code:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
.method public static void Main() cil managed { .entrypoint .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) // Code size 13 (0xd) .maxstack 2 .locals init ([0] object muh) IL_0000: nop IL_0001: ldloc.0 IL_0002: ldnull IL_0003: ceq IL_0005: call void [mscorlib]System.Console::WriteLine(bool) IL_000a: nop IL_000b: nop IL_000c: ret } // end of method Module1::Main
Was passiert hier? Im Grunde wird durch das ldnull eine Null-Reference auf den Evaluation Stack gelegt. ceq vergleicht darauf hin deren Integer-Werte. Sind beide Werte ident, dann ist das Object Nothing, andernfalls nicht.
Nun die Variante mit IsNothing(). Zuerst der VB.NET-Sourcecode:
Code :1 2 3 4 5 6 7 8
Module Module1 Sub Main() Dim muh As Object Console.WriteLine(IsNothing(muh)) End Sub End Module
Und jetzt wieder MSIL-Code, damit wir die Vorgänge dahinter sehen:
Hier ist schön zu sehen, dass ein Object erstellt wird. Dieses Objekt wird der IsNothing-Methode übergeben, welche einen Boolean zurückgibt. Dieser Wert wird dann ausgegeben.Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
.method public static void Main() cil managed { .entrypoint .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) // Code size 20 (0x14) .maxstack 1 .locals init ([0] object muh) IL_0000: nop IL_0001: ldloc.0 IL_0002: call object [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(object) IL_0007: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.Information::IsNothing(object) IL_000c: call void [mscorlib]System.Console::WriteLine(bool) IL_0011: nop IL_0012: nop IL_0013: ret } // end of method Module1::Main
Das Endergebnis dieser Analyse kannst du dir sicherlich selbst ausmalen.
-
Der IsNothing Funktion kann ich also auch Value Types übergeben. Es wird dann halt immer False zurückgegeben.
Zitat von Norbert Eder
Bei einem kleinen Test habe ich festgestellt, dass "Is Nothing" wesentlich schneller ist als die IsNothing Funktion. Ich werde wohl in Zukunft "Is Nothing" verwenden.hihi = -h²
-
Wie kommst darauf dass man der IsNothing Funktion auch ValueTypes übergeben kann?
Der is Operator funktioniert mit allen Typen.
Und schneller ist er weil das Objekt nicht extra kopiert wird.MfG,
Christian
Wer sein Problem definiert, hat es schon halb gelöst!
Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.
The Code Project! - C# Programming | C# / VB.NET Pendants
Regeln + Netiquette
Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
und vor allem nicht auf das, was euch die IHK dazu erzählt!
Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...
-
Wenn ich in VB.Net folgenden Code erstelle:
Zitat von cosmochaosmaker
dann kann dies nicht kompiliert werden. Es erscheint die Fehlermeldung:Code vbnet:1 2
Dim intTest As Integer Console.WriteLine(intTest Is Nothing)
Zitat von Build Error
hihi = -h²
-
Klar, ein Value Type kann auch nicht null/Nothing sein.
-
Hallo Shakie,
seit wann bist du denn auf .NET umgestiegen
Das Ergebnis ist gleich. IsNothing ist eben eine Funktion, Is Nothing hingegen
ein Ausdruck, der inline kompiliert wird. Ein Funktionsaufruf ist langsamer.
IsNothing funktioniert auch für Wertetypen und liefert immer True. Da das
Argument ByVal übergeben wird, wird das gesamte Objekt bei Wertetypen immer
kopiert und ist somit nochmal langsamer.
Warum gibt es beide Formen?
Keine Ahnung. Ich verwende nur Is Nothing. Für Wertetypen ist IsNothing
sowieso sinnlos.
Jens
-
Genau das hätte mich interessiert!
Zitat von JensG
Seit Microsoft eine kostenlose Entwicklungsumgebung zum Download angeboten hat.
Zitat von JensG
.Net-Programmierung mach ich aber nur so aus Spaß an der Laune.Geändert von Shakie (15.02.10 um 00:42 Uhr) Grund: Rechtschreibfehler gefunden
hihi = -h²
Ähnliche Themen
-
Richtige Syntax bei Operatorüberladung, wann sind "friend", "const", "&" nötig?
Von mrs_schokokeks im Forum C/C++Antworten: 4Letzter Beitrag: 25.08.10, 19:13 -
Unterschied zwischen "Global" und "Public"
Von Nickie97 im Forum Visual Basic 6.0Antworten: 4Letzter Beitrag: 28.01.10, 17:05 -
Eingabe in der timeline: "time*100" - bei Effekt "turbulentes Versetzen"-"Evolution"
Von MTMonline im Forum Videoschnitt, Videotechnik & -produktionAntworten: 2Letzter Beitrag: 25.04.08, 09:49 -
Finder methods + JBoss + Was expecting one of: "CONCAT" "SUBSTRING" ... "(" ... <STRI
Von cengizhdde im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 6Letzter Beitrag: 27.05.05, 15:29 -
Unterschied "shared Memory" & "dezidierter VRAM" bei Grafikarten
Von dibe0014 im Forum HardwareAntworten: 1Letzter Beitrag: 08.02.05, 08:14





Zitieren
Login





