VB.Net Unterschied "Is Nothing" und "IsNothing()"

Shakie

Erfahrenes Mitglied
Hallo!
Wenn man in VB.Net prüfen will, ob eine Objektvariable "Nothing" ist, dann hat man zwei Möglichkeiten:
Code:
'entweder
Ergebnis = (Object Is Nothing)
'oder
Ergebnis = IsNothing(Object)
Kann mir jemand sagen wo da der Unterschied liegt bzw. warum es zwei Varianten gibt?
 
Zuletzt bearbeitet:

Norbert Eder

Erfahrenes Mitglied
Natürlich kann dir das wer sagen. Hier zuerst die Variante (object is nothing) als Sourcecode:

Code:
Module Module1

    Sub Main()
        Dim muh As Object
        Console.WriteLine(muh Is Nothing)
    End Sub

End Module

Daraus resultiert folgender MSIL-Code:

Code:
.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:
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:

Code:
.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
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.

Das Endergebnis dieser Analyse kannst du dir sicherlich selbst ausmalen.
 

Shakie

Erfahrenes Mitglied
Norbert Eder hat gesagt.:
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.

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.
 

Christian Kusmanow

Erfahrenes Mitglied
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.
 

Shakie

Erfahrenes Mitglied
cosmochaosmaker hat gesagt.:
Der is Operator funktioniert mit allen Typen.
Wenn ich in VB.Net folgenden Code erstelle:
Code:
Dim intTest As Integer
Console.WriteLine(intTest Is Nothing)
dann kann dies nicht kompiliert werden. Es erscheint die Fehlermeldung:
Build Error hat gesagt.:
'Is' requires operands that have reference types, but this operand has the value type 'integer'.
 

JensG

Erfahrenes Mitglied
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
 

Shakie

Erfahrenes Mitglied
JensG hat gesagt.:
Warum gibt es beide Formen?
Genau das hätte mich interessiert!

JensG hat gesagt.:
seit wann bist du denn auf .NET umgestiegen :)
Seit Microsoft eine kostenlose Entwicklungsumgebung zum Download angeboten hat.
.Net-Programmierung mach ich aber nur so aus Spaß an der Laune.
 
Zuletzt bearbeitet: