在.net 2.0中是否有任何预定义的类来保存单个泛型类型的可变字段?

sup*_*cat 1 .net vb.net mutable

在我的一些项目中,我发现自己宣布了一个相当无聊的课程:

    Class Holder(Of T)
        Public It As T
        Sub New(ByVal It As T)
            Me.It = It
        End Sub
    End Class

例如,允许对象以这样的方式向另一个对象提供信息,使得信息可以随后在任何地方发生变化.例如,在一个词典(串,持有人(中SomeImmutableType)),所以可以更新SomeImmutableType的事情,而不必改变词典本身(因为字典对一个给定的关键条目总是包含相同的Holder对象,即持有人对象可以用作锁).

是否有更适合此目的的内置类?我更喜欢.net 2.0兼容性,但即使在4.0中,Tuple类型也是不可变的.如果没有这样建于一件事,就是它需要一个持有人类型来定义它本身作为一个嵌套的类型,或者要求有一个项目中持有人一个定义每种类型的更好吗?

我所知道的唯一内置的东西是Array.使用一个元素的数组是可行的,但它感觉真的很吵,因为通常当代码有一个数组时,期望它可以使用某个大小而不是一个.

PS -用例:

  1. 要计算每个不同字符串在列表中出现的次数,可以创建一个Dictionary(Of String,Holder(Of Integer)),然后对于每个字符串,执行TryGetValue以检索持有者(如果已存在).如果不存在,则创建一个新的持有者并将其存储在字典中.然后在任何一种情况下增加存储在持有者中的值.请注意,以这种方式执行操作将需要最少数量的字典写入.
  2. 如果一个人的不可改变的事情字典,一个希望改变与键关联的旧值的推导值(例如它的"字符串,字符串"的字典和一个希望有效地执行"MyDict(的myKey) = myDict(key)&someThing"),通过编写字典来执行这样的操作将需要锁定整个字典,而一个字符串附加.如果操作像字符串追加一样简单,可能也不会太糟糕,但如果操作更复杂则可能很糟糕.使用"Holder",只需要在获取密钥时锁定Dictionary; 然后可以释放Dictionary锁并锁定Holder,允许其他线程使用Dictionary.
  3. 在生成闭包时,编译器可以使用Holder类来避免委托保留它们不会使用的活动字段.如果范围包含ExpensiveObject"富"和整数"酒吧",它包含一个短暂的关闭,需要两个"富"和"酒吧",和长寿命的一个只需要"酒吧",编译器可以定义两个闭包的单独闭包类型,并且它们都包含对同一个Holder(Of Bar)的引用.这将允许保持闭包语义,而不必保留任何额外的对象.

Eri*_*ert 6

我不知道任何类型做你想要的.

关于你的三个使用案例:

  1. 当然,但请记住,您现在正在交易增加的收集压力,增加的虚拟内存使用量以及大量额外的时间来跟踪生存对象集,以减少整数存储数量到字典存储桶中.这是一个很好的权衡吗?对我来说听起来不是很好.如果这是一场大胜,我会感到惊讶.

  2. 听起来像一个复杂的解决方案.还有其他解决方案.例如,您可以在字典顶部编写一个访问层,根据需要转换值,而不会改变字典.

  3. 关键是"编译器可以制作两种闭包类型".您所描述的问题是由于我们没有有效地对闭包类型进行分区.闭包类本质上是你的"持有者"类型,只是持有任意多个数据,而不仅仅是一个.(我们正在考虑使用更好的解决方案来分区C#和VB中的闭包类型,但没有承诺.)

所有这一切,我以前使用过你的技巧,主要是因为我从C++移植现有代码,大量使用传递对变量的引用.我通常使用这种技巧来启动和运行移植的代码,然后将其重构为更具有某种意义的C#-ish稍后.