user1128144
user1128144

Reputation: 125

Returning Null or Nothing from VBScript function?

I'm trying to write the VBScript equivalent of a function similar to what's below:

object getObject(str)
{
    if ( ... )
    {
        return object_goes_here;
    }

    return null;
}

My guess would be below, except that I'm not understanding the difference between Nothing and Null. As a caller, I'd rather test if the return value is set by using IsNull() versus X Is Nothing.

Function getObject(str)
    If ... Then
        Set getObject = object_goes_here
        Exit Function
    End If

    Set getObject = Nothing  // <-- or should this be Null?
End Function

Upvotes: 9

Views: 21244

Answers (3)

AutomatedChaos
AutomatedChaos

Reputation: 7490

In your sample code, the object gets always Nothing because that is the last action. This is how it should be:

Function getObject(str)
     If ... Then
         Set getObject = object_goes_here
         Exit Function
     End If
     Set getObject = Nothing
End Function

or:

Function getObject(str)
     Set getObject = Nothing  
     If ... Then
         Set getObject = object_goes_here
     End If
End Function

The answer of GSerg is correct: you should use Nothing. Additionally, to see if an object has a null reference, use:

If Not object Is Nothing Then
    '  do something
End If

Upvotes: 3

Ekkehard.Horner
Ekkehard.Horner

Reputation: 38775

Use the second Function skeleton. Avoid Null when dealing with objects, because of the Set Assignment abomination.

Dim oX : Set oX = getObject(...)
If oX Is Nothing Then
   ...
Else
  nice object to work with here
End If

vs

Dim vX : vX = getObject(...) ' <-- no Set, no object
If IsNull(vX) Then
   ...
Else
   no object to work with here
End If

Upvotes: 4

GSerg
GSerg

Reputation: 78210

The correct way to not return an object is to return Nothing and test for Is Nothing.

VB's Null is a special value of type Variant/Null. There are other special values, such as Variant/Empty or Variant/Error. They all have their use, but it's not the one.

Upvotes: 16

Related Questions