2011-01-20 19 views
16

私は通常C#で家にいますが、いくつかのVB.NETコードではパフォーマンスの問題を見ています - タイプのデフォルト値(C#のdefaultキーワードのようなもの)と何かを比較できるようにしたい)。VB.NETでC#の `default`と同等のものは何ですか?

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(?) 
     { 
      // ... 
     } 
    } 
} 

私はNothingは、意味的に同じであったことを信じるように導かれた、まだ私がしなければは:T2Integerで、idの値が0とき

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 

その後、状態がまだ通過し、 ifの本文が評価されます。私がない場合は:

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

が続いて条件が満たされていない、と体が評価されていない元のC#コードはコンパイルされませんよう...

+1

[VBのC#の既定値(T)]の複製が可能です(http://stackoverflow.com/questions/833791/vb-equivalent-for-cs-defaultt) – decyclone

+2

@decycloneその質問は一般的なケースをカバーしていません;実際に私の質問では、私はほとんどの場合 'Nothing'を使用することを知っていることを示しています... –

答えて

10

これは、完全なソリューションではありません。あなたはローカル変数を経由して何を使用することはできません。

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 

C#バージョンがコンパイルされないのと同じように、コンパイルされません - あなたはそのような制約のない型パラメータの値を比較することはできません。

あなたはしかしEqualityComparer(Of T)を使用することができます - して、あなたもローカル変数は必要ありません:C#のとは異なり

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

私は、私の例の中で少しだけビジネス特有の用語を取ったと思いますが、* *あなたはそれが参照型に対してもうまくいくことを知っていますか? –

+0

@ローランド:私が知っている限り、それはうまくいくはずです。 –

+0

私はタイプしているのでコンパイル中ですので、間もなく確かに分かります。私はそれがコンパイラに魔法を働かせ、それを働かせる方法を見ることができます –

19

を、VB.NET式で初期化されるローカル変数を必要としません。ランタイムによってデフォルト値に初期化されます。ちょうどあなたがデフォルトキーワードの代わりとして必要なもの:「ハァッか」

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

、誰かが行くように起こっているコメントを忘れてはいけません今から一年。

4

コードの問題は、Nothingキーワードではなく、IsNot演算子です。 docs

IsNot演算子は、2つのオブジェクト参照が異なるオブジェクトを参照しているかどうかを判断します。ただし、値の比較は実行されません。

参照演算子との値比較を実行しようとしています。これを理解すると、Jon SkeetまたはHans Passantの回答が明白な解決策になります。

+0

完璧な意味を持っています - VBは比較のために '='と 'Is'の両方を持っていることを常に悩ましています。値型または参照型をそれぞれ比較します。 –

+0

@Rowland - C#には "is"演算子もあります。私はこの経験則を使用してC#とVBの両方で動作します。コンパイラが==/=の使用を嫌うならば、まず.Equals()を使います。 –

+0

@ Joel/Rowland、習慣はオブジェクト/クラスに賛成しています。nullable型(Guid?、DateTime?など)を使うときはEqualsを使う傾向があります。 Guidの代わりにGuidsを(文字列として)不適切に扱うコードがたくさんあるのですか? ...それは実際に私が使用する必要があるときにSQLでより多くの私をirks、null =どこにnull通常は私がしようとしているものです。 – Tracker1

関連する問題