3

问候,

我只是有一段时间的程序员,我对基础有一些疑问,请您澄清以下内容:案例1:

Public Class BillItems
        Implements INotifyPropertyChanged
        Public Event PropertyChanged As PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
        Private Sub NotifyPropertyChanged(ByVal info As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
        End Sub

        Private _BillIdValue As String


        Property BillId As String
            Get
                Return _BillIdValue
            End Get
            Set(ByVal value As String)
                If Not _BillIdValue = value Then
                    _BillIdValue = value
                End If
            End Set
        End Property
End Class

案例二:

Public Class BillItems
        Implements INotifyPropertyChanged
        Public Event PropertyChanged As PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
        Private Sub NotifyPropertyChanged(ByVal info As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
        End Sub


        Property BillId As String
            Get
                Return BillId
            End Get
            Set(ByVal value As String)
                If Not BillId = value Then
                    BillId = value
                End If
            End Set
        End Property
End Case

案例 1 和案例 2 是否产生相同的结果,我的意思是那里必须有一个私有值?我们可以使用属性本身在其 Set 和 get 语句中使用它自己的值吗?

谢谢你。

4

2 回答 2

4

我无法想象案例 2 会在不导致堆栈溢出异常的情况下运行。你本质上是在制造一个无限循环,它会不断地调用自己。

案例 1 将是正确的方法。

如果您使用的是 .Net 4,您可以这样做(无需进一步的 Get/Set 代码):

Property BillId As String

这将为您生成私有成员变量 ( _BillId)。

编辑:

你可以试试这个来引发事件:

Property BillId As String
    Get
        Return _BillIdValue
    End Get
    Set(ByVal value As String)
        If Not _BillIdValue = value Then
            _BillIdValue = value
            NotifyPropertyChanged("BillId")
        End If
    End Set
End Property
于 2012-05-04T08:01:15.780 回答
3

在 MSDN 上关于Auto-Implemented Properties 的这篇文章中,您可以读到一个属性需要标准语法,当您

Add code to the Get or Set procedure of a property, such as code to validate incoming values in the Set procedure. For example, you might want to verify that a string that represents a telephone number contains the required number of numerals before setting the property value.

因此,因为您实现了 IPropertyChanged 接口,所以您需要在 setter 中添加代码。
并写出这样的东西。

Property BillId As String               
    Get       
       Return _BillIdValue               
   End Get               
   Set(ByVal value As String)                   
        If Not _BillIdValue = value Then                       
            _BillIdValue = value                   
            NotifyPropertyChanged("BillID")
        End If               
   End Set           
End Property   

第二种情况显然是错误的。(正如其他人已经说过的无限循环)

于 2012-05-04T08:15:14.460 回答