Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么在使用.Add时未访问setter?_.net_Vb.net - Fatal编程技术网

.net 为什么在使用.Add时未访问setter?

.net 为什么在使用.Add时未访问setter?,.net,vb.net,.net,Vb.net,我试图在修改集合时设置一个标志——这样做的逻辑位置似乎在setter方法中。问题是当我使用这个代码时 setterDemo1.Widgets.Add(new Widget) m_widgetSetterVisited未设置为True。 有人看到我遗漏了什么吗? 谢谢 戴夫 当设置列表(小部件)本身时,您的代码仅更改m_widgetSetterVisited标志-而不是在访问其成员时。所以您需要这样的代码来触发它: setterDemo.Widgets = New List(Of Widget)

我试图在修改集合时设置一个标志——这样做的逻辑位置似乎在setter方法中。问题是当我使用这个代码时

setterDemo1.Widgets.Add(new Widget)
m_widgetSetterVisited未设置为True。 有人看到我遗漏了什么吗? 谢谢 戴夫


当设置
列表(小部件)
本身时,您的代码仅更改
m_widgetSetterVisited
标志-而不是在访问其成员时。所以您需要这样的代码来触发它:

setterDemo.Widgets = New List(Of Widget)


简单地操作该引用的成员是不起作用的。

在设置
列表(小部件)
本身时,您的代码只会更改
m\u widgetSetterVisited
标志,而不是在访问其成员时。所以您需要这样的代码来触发它:

setterDemo.Widgets = New List(Of Widget)


简单地操作该引用的成员将不起作用。

在示例代码中,您正在对字段执行一个
get
,然后对返回的
List
类型的对象调用一个方法。请注意,您从未设置字段
m\u Widgets
的值。简言之,这是行不通的

我认为要完成您想要做的事情,您需要从
System.Collections.ObjectModel
命名空间(或
List
如果不可能)中的类继承并重写添加和删除成员的各种方法,或者封装
List
并自己实现
IList
,根据需要发送到内部列表。或者,您可以使用在添加/删除对象时触发事件的


编辑-输入Gideon的注释以使用
System.ObjectModel.Collection
如果可能

在示例代码中,您正在对字段执行
get
,然后对返回的
List
类型的对象调用方法。请注意,您从未设置字段
m\u Widgets
的值。简言之,这是行不通的

我认为要完成您想要做的事情,您需要从
System.Collections.ObjectModel
命名空间(或
List
如果不可能)中的类继承并重写添加和删除成员的各种方法,或者封装
List
并自己实现
IList
,根据需要发送到内部列表。或者,您可以使用在添加/删除对象时触发事件的


编辑-输入Gideon的注释以使用
System.ObjectModel.Collection
(如果可能)

我们处理此问题的方法是让所有集合继承自或

这些集合具有被设计为重写的方法(InsertItem、RemoveItem、ClearItems和SetItem),每当对集合中的项进行更改时,这些方法都将被激发


您可以重写这些方法中的每一个,并根据需要设置您的标志。

我们处理这一问题的方法是让所有集合从或继承

这些集合具有被设计为重写的方法(InsertItem、RemoveItem、ClearItems和SetItem),每当对集合中的项进行更改时,这些方法都将被激发


您可以覆盖这些方法中的每一种,并根据需要设置您的标志。

您可以使用支持
IList
界面并支持集合更改通知的
ObservableCollection

Imports System.Collections.ObjectModel
Imports System.Collections.Specialized

Public Class ChangedDemo

    Private m_Widgets As ObservableCollection(Of Widget) = New ObservableCollection(Of Widget)
    Public m_WidgetsChanged As Boolean = False

    Public Sub New()
        AddHandler m_Widgets.CollectionChanged, AddressOf m_Widgets_CollectionChanged
    End Sub

    Private Sub m_Widgets_CollectionChanged(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs)
        m_WidgetsChanged = True
    End Sub

    Public ReadOnly Property Widgets() As IList(Of Widget)
        Get
            Return m_Widgets
        End Get
    End Property

End Class

您可以使用支持
IList
界面的
ObservableCollection
,还支持收集更改通知:

Imports System.Collections.ObjectModel
Imports System.Collections.Specialized

Public Class ChangedDemo

    Private m_Widgets As ObservableCollection(Of Widget) = New ObservableCollection(Of Widget)
    Public m_WidgetsChanged As Boolean = False

    Public Sub New()
        AddHandler m_Widgets.CollectionChanged, AddressOf m_Widgets_CollectionChanged
    End Sub

    Private Sub m_Widgets_CollectionChanged(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs)
        m_WidgetsChanged = True
    End Sub

    Public ReadOnly Property Widgets() As IList(Of Widget)
        Get
            Return m_Widgets
        End Get
    End Property

End Class

我有兴趣回应那些认为这个答案没有帮助的人的想法我有兴趣回应那些认为这个答案没有帮助的人的想法非常感谢,我将看到所有这些优秀的答案。我本以为会调用setter,因为通过添加一个新成员,我正在更改.Widgets的值,因此正在向其写入。
List
不是首选的基类(尽管可能存在需要这种方法的外部问题)。在进行集合时,您应该从
System.ObjectModel.Collection
派生。非常感谢我将看到所有这些优秀的答案。我本以为会调用setter,因为通过添加一个新成员,我正在更改.Widgets的值,因此正在向其写入。
List
不是首选的基类(尽管可能存在需要这种方法的外部问题)。创建集合时,应该从
System.ObjectModel.Collection
派生。