微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用内部不可变字典构造不可变字典

如何解决用内部不可变字典构造不可变字典

我有以下字典,希望使其不变;

var dict = ConcurrentDictionary<Type,ConcurrentDictionary<Type,Action>>

然后我打电话给

var immmutableDict = dict.ToImmutableDictionary();

不过,我相信这仍会提供内部ConcurrentDictionary<Type,Action>字典。

我该如何使用现有功能以线程安全的方式为整个字典制作一个不变的副本,还是我需要锁定整个操作以确保原子转换?

ImmutableDictionary<Type,ImmutableDictionary<Type,Action>>

或者,如果上述方法不可行,我可以从一开始就重构代码以使用ReadOnlyDictionary字典,但是内部字典面临同样的挑战,使其只能在构造过程中读取:

var dict2 = new Dictionary<Type,Dictionary<Type,InstanceProducer>>();
/* snip perform adds to above dictionary to initialise state */

var immutableDict = dict2.ReadOnlyDictionary(); // ????
// where ReadOnlyDictionary<Type,ReadOnlyDictionary<Type,InstanceProducer>>(); is returned
// i need to make the above immutable with an immutable internal dictionary

解决方法

您只需要将每个内部字典都转换为不可变字典,然后从中创建一个新的ImmutableDictionary。

ImmutableDictionary<Type,ImmutableDictionary<Type,Action>> immutableDict = dict
    .ToImmutableDictionary(e => e.Key,e => e.Value.ToImmutableDictionary());
,

不过,我相信这仍然会提供内部的ConcurrentDictionary 字典。

通话:

var immmutableDict = dict.ToImmutableDictionary();

将创建类型ImutableDictionary<Type,ConcurrentDictionary<Type,Action>,因此不会是ConcurrentDictionary

我该如何使用现有功能以线程安全的方式为整个字典制作一个不变的副本,还是我需要锁定整个操作以确保原子转换?

要了解dict.ToImmutableDictionary()的工作原理,请阅读官方文档,其中指出:

枚举键/值对的序列,并生成其内容的不可变字典。

此线程安全吗? 是的,因为ImmutableDictionary是线程安全的,并且从ConcurrentDictionary创建一个线程也是安全的。

但是,值得问自己另一个问题:

  • 我为什么需要这个?

出现此问题的原因是不可变一词,这意味着它将在每次修改时创建一个新的数据实例。

考虑到多线程意味着可能会更改数据的多线程访问(除非您知道它不会被更改),因此它可能会对性能造成重大影响。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。