在.NET2.0中是否有预定义的类来保存单个泛型类型可变字段?

在.NET2.0中是否有预定义的类来保存单个泛型类型可变字段?,.net,vb.net,mutable,.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 类别持有人(T) 将其公开为T 次新(将其作为T进行赋值) 我,它=它 端接头 末级 例如,允许一个对象向另一个对象提供信息,使信息可以在以后的任何地方发生变异。例如,在字典中(字符串的,Ho

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

Class Holder(Of T) Public It As T Sub New(ByVal It As T) Me.It = It End Sub End Class 类别持有人(T) 将其公开为T 次新(将其作为T进行赋值) 我,它=它 端接头 末级 例如,允许一个对象向另一个对象提供信息,使信息可以在以后的任何地方发生变异。例如,在字典中(字符串的,Holder(SomeImmutableType的))可以更新SomeImmutableType的内容,而不必更改字典本身(因为给定密钥的字典条目将始终包含相同的Holder对象,该Holder对象可以用作锁)

是否有更适合此目的的内置类?我更喜欢.NET2.0兼容性,但即使在4.0中,元组类型也是不可变的。如果没有内置这样的东西,那么对于每个需要Holder类型的类型来说,将其自身定义为嵌套类型更好,还是要求在项目中有一个Holder定义更好

我所知道的唯一内置的东西是数组。使用由一个元素组成的数组是可行的,但它确实让人感觉不舒服,因为一般来说,当代码有一个数组时,人们期望它可以在一个以外的大小下使用

PS—用法示例:

  • 要计算每个不同的字符串在列表中出现的次数,可以创建一个字典(字符串的,Holder(整数的)),然后对每个字符串执行TryGetValue以检索Holder(如果已经存在)。如果不存在,则创建一个新的持有者并将其存储在字典中。然后,在任何一种情况下,增加存储在支架中的值。请注意,这样做将需要最少的字典写入次数。
  • 如果有一个不可变事物的字典,并且希望将与键相关的值更改为旧值的派生(例如,它是一个“String,String”的字典,并且希望有效地执行“MyDict(myKey)=MyDict(key)&someThing”),通过编写字典来执行这样的操作需要锁定整个字典,而另一个操作需要追加字符串。如果操作像字符串追加一样简单,可能还不算太糟糕,但如果操作更复杂,则可能很糟糕。使用“Holder”,取钥匙时只需锁定字典;然后可以释放字典锁并锁定保持架,允许其他线程使用字典。
  • 在生成闭包时,编译器可以使用Holder类来避免委托保持不使用的活动字段。如果作用域包含ExpensiveObject “foo”和整数“bar”,它包含一个既需要“foo”又需要“bar”的短期闭包和一个只需要“bar”的长期闭包,编译器可以为这两个闭包定义单独的闭包类型,并让它们都包含对同一个持有者(bar)的引用。这将允许维护闭包语义,而无需保持任何额外对象的活动状态。
    我不知道有哪一种能满足你的要求

    关于您的三种使用情形:

  • 当然可以,但请记住,您现在的交易是收集压力的增加、虚拟内存使用的增加以及跟踪活动对象集所需的大量额外时间,以减少字典存储桶中整数的存储数量。这是一个很好的折衷方案吗?听起来没那么好。如果这是一场巨大的胜利,我会感到惊讶

  • 听起来是个复杂的解决方案。还有其他解决办法。例如,您可以在字典的顶部编写一个访问层,该层可以根据需要转换值,而无需修改字典

  • 关键是“编译器可以生成两种闭包类型”。您描述的问题是由于我们没有有效地划分闭包类型。闭包类本质上是“holder”类型,只保留任意多个数据,而不是一个。(我们正在考虑在C#和VB中使用更好的闭包类型分区解决方案,但没有承诺。)


  • 所有的,以前我使用过你的技巧,主要是因为我正在移植C++中的现有代码,这些代码大量使用了对变量的引用。我通常使用这种技巧来启动并运行移植的代码,然后在以后将其重构为更符合C#ish习惯的代码

    我不知道有哪一种能满足你的需要

    关于您的三种使用情形:

  • 当然可以,但请记住,您现在的交易是收集压力的增加、虚拟内存使用的增加以及跟踪活动对象集所需的大量额外时间,以减少字典存储桶中整数的存储数量。这是一个很好的折衷方案吗?听起来没那么好。如果这是一场巨大的胜利,我会感到惊讶

  • 听起来是个复杂的解决方案。还有其他解决办法。例如,您可以在字典的顶部编写一个访问层,该层可以根据需要转换值,而无需修改字典

  • 关键是“编译器可以生成两种闭包类型”。您描述的问题是由于我们没有有效地划分闭包类型。闭包类本质上是“holder”类型,只保留任意多个数据,而不是一个。(我们正在考虑在C#和VB中使用更好的闭包类型分区解决方案,但没有承诺。)


  • 所有的,以前我使用过你的技巧,主要是因为我正在移植C++中的现有代码,这些代码大量使用了对变量的引用。我通常使用这种技巧来启动并运行移植的代码,然后在以后将其重构为更符合C#ish习惯的代码

    System.Runtime.CompilerServices.StrongBox

    exac