2012-01-13 20 views
0

VB.NETでswitch文の文字列と比較できるクラスを作成できますか?たとえば、のは、私はFooクラスを持っているとしましょう:switch文の文字列と比較できるクラスを作成する

Public Class Foo 
    Public Bar As String = "test" 
End Class 

は、それは私がそうのようにはFooを使用することができるように、いくつかのインターフェイスを実装したり、いくつかの等価演算子を上書きすることは可能ですか?

Dim foo As New Foo() 

Select Case "test" 
    Case foo 
     ' It worked! 
End Select 

答えて

4

はい、あなたはコンパイラが暗黙的に別の型にあなたのクラスのインスタンスを変換することができ、.NET言語で暗黙のconversion operatorsを定義することができます。

VB.NETでは、これは「ワイド化」演算子と呼ばれます。あなたはこのようにそれを定義します。

Public Class Foo 
    Public Bar As String = "test" 

    Public Shared Widening Operator CType(ByVal f As Foo) As String 
     Return f.Bar 
    End Operator 
End Class 

VB.NETで「絞り込み」演算子と呼ばれている明示的変換は、もあります。これと同じように、前の変換は自動的に行われますが、後者では変換を明示的に指示して変換を実行する必要があります。これはいくつかの厄介な驚きを防ぐことができるだけでなく、コードを混乱させる。

+0

バーの代わりに(列の)リストだったと私は単に私のクラスと文字列の間の平等を定義したい場合はどう:バーが含まれていません我々が比較している文字列。それは実行可能になるだろうか? –

+0

@ケビン:うーん、別の質問です。私はequals演算子をオーバーロードします。例については、[here](http://msdn.microsoft.com/en-us/library/336aedhh.aspx)を参照してください。 'Equals'をオーバーロードすると、おそらく' GetHashCode'もオーバーロードされるはずです(http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method -is-overriden-in-c)を使用します。 –

0

私はあなたの質問に基づいて、特定のクラスインスタンスのBarがtestと等しいかどうかを確認したいと思うと思います。

もしそうなら、あなたはToStringメソッド()のオーバーライドを活用することができます

Public Class Foo 
    Public Bar As String = "test" 

    Public Overrides Function ToString() As String 
     Return Bar 
    End Function 
End Class 

とあなたのcase文は、次のようになります。

Dim foo As New Foo() 

    Select Case "test" 
     Case foo.ToString 
      ' It worked! 
    End Select 

ます。また、デフォルトのプロパティを実装することができますが、それはありません既定のプロパティにはパラメータが必要であるため、クリーンである

その後と呼ばれます
Public Class Foo 
    Public Bar As String = "test" 

    Default Public ReadOnly Property DefaultProp(JustUseZero As Integer) As String 
     Get 
      Return Bar 
     End Get 
    End Property 
End Class 

Dim foo As New Foo() 

    Select Case "test" 
     Case foo(0) 
      ' It worked! 
    End Select