■82662 / inTopicNo.3) |
Re[1]: クラスで定義した変数を比較する方法 |
□投稿者/ 魔界の仮面弁士 (1075回)-(2017/01/25(Wed) 10:17:21)
|
2017/01/25(Wed) 10:50:34 編集(投稿者)
■No82660 (スキン さん) に返信 > Dim xxx as test > xxx.aaa="あああ" > xxx.bbb="いいい" > xxx.ccc="ううう"
test が Structure であれば、そのようにも書けますが、 今回は Class なので、使用前に New test() を呼び出さないと NullRefrenceException になってしまいますよ。
> 変数xxxと変数yyyが完全に等しいか調べたいのですが
等価演算子を実装するには、Clsss test 内に
Public Shared Operator =(ByVal l As test, ByVal r As test) As Boolean If l Is Nothing Then Return r Is Nothing ElseIf r Is Nothing Then Return False Else 'VB での文字列比較は「Option Compare」依存であることに注意 Return l.aaa = r.aaa AndAlso l.bbb = r.bbb AndAlso l.ccc = r.ccc End If End Operator Public Shared Operator <>(ByVal l As test, ByVal r As test) As Boolean Return Not (l = r) End Operator Public Overrides Function GetHashCode() As Integer Dim hash As Integer = MyBase.GetHashCode() If aaa IsNot Nothing Then hash = hash Xor aaa.GetHashCode() If bbb IsNot Nothing Then hash = hash Xor bbb.GetHashCode() If ccc IsNot Nothing Then hash = hash Xor ccc.GetHashCode() Return hash End Function
のように仕込めば OK です。
これにより、呼び出し側が『If xxx = yyy Then』だけで済みます。 http://smdn.jp/programming/netfx/comparison/1_equivalence_operator_overload/
※上記実装は一例です。たとえば「If xxx = Nothing Then」の判定を True / False のいずれと看做すかなどの調整は、適宜行ってください。
> If xxx = yyy then > If xxx is yyy then
Is/IsNot は同一参照かどうかの判定ですね。
Imports System.Net Module Module1 Sub Main() Dim a, b, c As IPAddress
'クラスなので、インスタンス化が必要 a = New IPAddress(New Byte() {192, 0, 2, 1}) b = IPAddress.Parse("192.0.2.1") c = a '変数 c は、a と同じインスタンスを参照している
'a、b、c はいずれも同じ内容を表示する Console.WriteLine("a : {0}", a) Console.WriteLine("b : {0}", b) Console.WriteLine("c : {0}", c)
'『値』として比較すると、a = b = c として扱われる Console.WriteLine() Console.WriteLine("【a = b】【b = c】【c = a】") Console.WriteLine("【{0}】【{1}】【{2}】", a.Equals(b), b.Equals(c), c.Equals(a))
'『参照』の比較だと、b と c が同一、a は別インスタンス Console.WriteLine() Console.WriteLine("【a Is b】【b Is c】【c Is a】") Console.WriteLine("【{0}】【{1}】【{2}】", a Is b, b Is c, c Is a) 'Console.WriteLine("【{0}】【{1}】【{2}】", ReferenceEquals(a, b), ReferenceEquals(b, c), ReferenceEquals(c, a))
Console.Read() End Sub End Module
構造体の場合も、異なるデータを同値とみなす実装にすることがあります。
Dim a As Decimal = CDec("1.2500") Dim b As Decimal = CDec("1.250")
'a、b は異なる内容 Console.WriteLine("a : {0}", a) Console.WriteLine("b : {0}", b)
'『値』としては、a = b となる Console.WriteLine(a = b) Console.WriteLine(a.Equals(b))
|
|