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.
精彩评论