tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
12398
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Hallo!
    Wenn man in VB.Net prüfen will, ob eine Objektvariable "Nothing" ist, dann hat man zwei Möglichkeiten:
    Code vbnet:
    1
    2
    3
    4
    
    'entweder
    Ergebnis = (Object Is Nothing)
    'oder
    Ergebnis = IsNothing(Object)
    Kann mir jemand sagen wo da der Unterschied liegt bzw. warum es zwei Varianten gibt?
    Geändert von Shakie (18.07.06 um 18:12 Uhr)
     
    hihi = -h²

  2. #2
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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:

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

  3. #3
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Zitat Zitat von Norbert Eder
    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.
     
    hihi = -h²

  4. #4
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    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...

  5. #5
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Zitat Zitat von cosmochaosmaker
    Der is Operator funktioniert mit allen Typen.
    Wenn ich in VB.Net folgenden Code erstelle:
    Code vbnet:
    1
    2
    
    Dim intTest As Integer
    Console.WriteLine(intTest Is Nothing)
    dann kann dies nicht kompiliert werden. Es erscheint die Fehlermeldung:
    Zitat Zitat von Build Error
    'Is' requires operands that have reference types, but this operand has the value type 'integer'.
     
    hihi = -h²

  6. #6
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Klar, ein Value Type kann auch nicht null/Nothing sein.
     

  7. #7
    Avatar von JensG
    JensG JensG ist offline Mitglied Platin
    Registriert seit
    Jun 2004
    Ort
    Gera (Thüringen)
    Beiträge
    517
    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
     

  8. #8
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Zitat Zitat von JensG
    Warum gibt es beide Formen?
    Genau das hätte mich interessiert!

    Zitat Zitat von JensG
    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.
    Geändert von Shakie (15.02.10 um 00:42 Uhr) Grund: Rechtschreibfehler gefunden
     
    hihi = -h²

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 25.08.10, 19:13
  2. Unterschied zwischen "Global" und "Public"
    Von Nickie97 im Forum Visual Basic 6.0
    Antworten: 4
    Letzter Beitrag: 28.01.10, 17:05
  3. Eingabe in der timeline: "time*100" - bei Effekt "turbulentes Versetzen"-"Evolution"
    Von MTMonline im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 2
    Letzter Beitrag: 25.04.08, 09:49
  4. Finder methods + JBoss + Was expecting one of: "CONCAT" "SUBSTRING" ... "(" ... <STRI
    Von cengizhdde im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 6
    Letzter Beitrag: 27.05.05, 15:29
  5. Antworten: 1
    Letzter Beitrag: 08.02.05, 08:14