0

null許容型の値を設定し、iNotifyPropertyChangedを実装するのはやり過ぎのようです。これを行うためのより良い方法はありますか?

        Private _WorkPhone As Long?
    Public Property [WorkPhone]() As Long?
        Get
            Return _WorkPhone
        End Get
        Set(ByVal value As Long?)
            If value.HasValue = False Then
                If _WorkPhone.HasValue = True Then
                    MyBase.RaisePropertyChanging("WorkPhone")
                    _WorkPhone = Nothing
                    MyBase.MarkDirty()
                    MyBase.RaisePropertyChanged("WorkPhone")
                End If
            Else
                If _WorkPhone.HasValue Then
                    If _WorkPhone.Value <> value.Value Then
                        MyBase.RaisePropertyChanging("WorkPhone")
                        _WorkPhone = value
                        MyBase.MarkDirty()
                        MyBase.RaisePropertyChanged("WorkPhone")
                    End If
                Else
                    MyBase.RaisePropertyChanging("WorkPhone")
                    _WorkPhone = value
                    MyBase.MarkDirty()
                End If
                MyBase.RaisePropertyChanged("WorkPhone")
            End If
        End Set
    End Property

単純なコードを使用してみましたが、MyBase.RaisePropertyChanging( "WorkPhone")のブレークポイントがヒットせず、値が変更されません。

    If _WorkPhone <> value Then
    MyBase.RaisePropertyChanging("WorkPhone")
    _WorkPhone = value
    MyBase.MarkDirty()
    MyBase.RaisePropertyChanged("WorkPhone")
End If
4

2 に答える 2

4

すべての複雑なロジックは必要ありません。xyが両方とも同じ基になるタイプのnull可能である場合、次の場合にのみx等しいy

  1. x.HasValuetrue
  2. y.HasValuetrue
  3. x.Value等しいy.Value

また

  1. x.HasValuefalse
  2. y.HasValuefalse

どちらの場合も、プロパティ変更通知を発行する必要はないため、不平等の簡単なテストで十分です。したがって:

Private _WorkPhone As Long?
    Public Property [WorkPhone]() As Long?
        Get
            Return _WorkPhone
        End Get
        Set(ByVal value As Long?)
            If Not _workPhone.Equals(value)
                MyBase.RaisePropertyChanging("WorkPhone")
                _WorkPhone = value
                MyBase.MarkDirty()
                MyBase.RaisePropertyChanged("WorkPhone")
            EndIf
        End Set
    End Property

後者がオペランドがであるかどうかを評価するのではNot Nullable(Of T).Equalsなく、を使用する必要があることに注意してください。<>NothingNothing

于 2010-01-17T15:49:19.817 に答える
1

余談ですが...職場の電話番号を保存するためにLONGを使用していることに気付きました。署名されていない場合でも、これは米国の市外局番429を超えると失敗します。DOUBLEまたはSTRINGを検討してください。

于 2010-01-17T21:07:01.193 に答える