加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

vb.net – 创建一个无法在外部更改的List属性

发布时间:2020-12-17 00:07:31 所属栏目:大数据 来源:网络整理
导读:我的VB.NET项目中有一个公共类,它有一个List(Of String)属性.该列表需要由项目中的其他类修改,但由于该类可能(在将来的某个时间)暴露在项目之外,我希望它在该级别上是不可修改的.修改项目中的现有属性只能通过调用列表的方法(特别是.Add,偶尔.Clear)来完成,
我的VB.NET项目中有一个公共类,它有一个List(Of String)属性.该列表需要由项目中的其他类修改,但由于该类可能(在将来的某个时间)暴露在项目之外,我希望它在该级别上是不可修改的.修改项目中的现有属性只能通过调用列表的方法(特别是.Add,偶尔.Clear)来完成,而不是通过用新列表批量替换属性值(这就是为什么我将它作为一个ReadOnly属性).

我想出了一种方法,但我不确定它是什么,你会称之为“优雅”.

就是这样:

Friend mlst_ParameterNames As List(Of String) = New List(Of String)

Public ReadOnly Property ParameterNames() As List(Of String)
    Get
        Return New List(Of String)(mlst_ParameterNames)
    End Get
End Property

现在,这只是工作正常和花花公子.项目中直接访问mlst_ParameterNames字段的任何类都可以根据需要对其进行修改,但是通过公共属性访问它的任何程序都可以将其修改为内容,但由于属性过程总是返回一个,因此无处可去.列表的副本,而不是列表本身.

但是,当然,这带来了开销,这就是为什么我觉得它只是……好吧,在某种程度上看起来“错误”,即使它有效.

参数列表永远不会很大.它最多只包含50个项目,但通常少于10个项目,所以我看不出这是一个性能杀手.然而,它当然让我认为有些人可以拥有更加整洁和清洁的想法.

任何人?

您应该使用AsReadOnly方法获取列表的只读版本,而不是创建原始列表的新副本,如下所示:
Friend mlst_ParameterNames As List(Of String) = New List(Of String)

Public ReadOnly Property ParameterNames() As ReadOnlyCollection(Of String)
    Get
        Return mlst_ParameterNames.AsReadOnly()
    End Get
End Property

根据MSDN:

This method is an O(1) operation.

这意味着无论列表的大小如何,AsReadOnly方法的速度都是相同的.

除了潜在的性能优势之外,列表的只读版本会自动与原始列表保持同步,因此如果使用代码保留对它的引用,则其引用的列表仍将是最新的,即使稍后将项目添加到列表中或从列表中删除.

此外,该列表是真正的只读.它没有Add或Clear方法,因此使用该对象的其他人不会产生混淆.

或者,如果您只需要消费者能够遍历列表,那么您可以将该属性公开为IEnumerable(Of String),这本质上是一个只读接口:

Public ReadOnly Property ParameterNames() As IEnumerable(Of String)
    Get
        Return mlst_ParameterNames
    End Get
End Property

但是,这使得访问For Each循环中的列表变得有用.例如,您无法通过索引获取Count或访问列表中的项目.

作为旁注,我建议添加第二个Friend属性,而不是简单地将字段本身作为朋友公开.例如:

Private _parameterNames As New List(Of String)()

Public ReadOnly Property ParameterNames() As ReadOnlyCollection(Of String)
    Get
        Return _parameterNames.AsReadOnly()
    End Get
End Property

Friend ReadOnly Property WritableParameterNames() As List(Of String)
    Get
        Return _parameterNames
    End Get
End Property

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读