开发者

What is the equivalent of C#'s `default` in VB.NET?

开发者 https://www.devze.com 2023-02-05 14:10 出处:网络
I\'m normally at home in C#, and I\'m looking at a performance issue in some VB.NET code -- I want to be able to compare something to the default value for a type (kind of like C#\'s default keyword).

I'm normally at home in C#, and I'm looking at a performance issue in some VB.NET code -- I want to be able to compare something to the default value for a type (kind of like C#'s default keyword).

public class GenericThing<开发者_运维问答;T1, T2>
{
    public T1 Foo( T2 id )
    {
        if( id != default(T2) ) // There doesn't appear to be an equivalent in VB.NET for this(?)
        {
            // ...
        }
    }
}

I was led to believe that Nothing was semantically the same, yet if I do:

Public Class GenericThing(Of T1, T2)
    Public Function Foo( id As T2 ) As T1
        If id IsNot Nothing Then
            ' ...
        End If
    End Function
End Class

Then when T2 is Integer, and the value of id is 0, the condition still passes, and the body of the if is evaluated. However if I do:

    Public Function Bar( id As Integer ) As T1
        If id <> Nothing Then
            ' ...
        End If
    End Function

Then the condition is not met, and the body is not evaluated...


Unlike C#, VB.NET doesn't require a local variable to be initialized with an expression. It gets initialized to its default value by the runtime. Just what you need as a substitute for the default keyword:

    Dim def As T2    '' Get the default value for T2
    If id.Equals(def) Then
       '' etc...
    End If

Don't forget the comment, it is going to make somebody go 'Huh?' a year from now.


This is not a complete solution, as your original C# code doesn't compile. You can use Nothing via a local variable:

Public Class GenericThing(Of T)
    Public Sub Foo(id As T)
        Dim defaultValue As T = Nothing
        If id <> defaultValue Then
            Console.WriteLine("Not default")
        Else
            Console.WriteLine("Default")
        End If
    End Function
End Class

That doesn't compile, in the same way that the C# version doesn't compile - you can't compare values of unconstrained type parameters like that.

You can use EqualityComparer(Of T) though - and then you don't even need the local variable:

If Not EqualityComparer(Of T).Default.Equals(id, Nothing) Then


The problem in your code is the IsNot operator, not the Nothing keyword. From the docs:

The IsNot operator determines if two object references refer to different objects. However, it does not perform value comparisons.

You're trying to do a value comparison with a reference operator. Once you realize this, either Jon Skeet's or Hans Passant's answers become obvious solutions.

0

精彩评论

暂无评论...
验证码 换一张
取 消