【问题标题】:Concurrent Dictionary with Get and Private Set - C#带有 Get 和 Private Set 的并发字典 - C#
【发布时间】:2020-12-17 10:04:13
【问题描述】:

我有一个私人ConcurrentDictionary 如下图:

#region Private Fields
private ConcurrentDictionary<string, string> properties = new ConcurrentDictionary<string, string>();
#endregion

我有一个带有get 的公共属性,如下所示:

#region Properties
public ConcurrentDictionary<string, string> Properties { get { return properties; } }
#endregion

我认为这是有效的,但在我的测试中,我仍然可以通过公共 Properties 属性和 TryAdd 等将内容添加到字典中。

我在同一个类中有一个名为 AddProperties 的方法,它接受 keyvalue 并将它们存储在私有字典中,但我希望 Properties 只能在其他类中读取。

【问题讨论】:

  • 属性只读 - 您不能修改属性值。但这与不能改变属性值所指的对象不同。您可以将属性类型更改为IReadOnlyDictionary&lt;string, string&gt;,尽管调用者仍然可以转换回ConcurrentDictionary&lt;string, string&gt;。另请注意,这与 ASP.NET Core 无关 - 我将删除标记。

标签: c#


【解决方案1】:

您想要做的是将您的字典公开为IReadOnlyDictionary。现在类只能get Properties 字典,但是一旦有了它就可以用它做他们想做的事。相反,您可以将您的 ConcurrentDictionary 公开为只读,方法是将其转换为 IReadOnlyDictionary,如下所示:

public IReadonlyDictionary<string, string> Properties { get { return (IReadOnlyDictionary) properties } }

现在访问该属性的类只能从字典中读取。但请注意,他们可以在技术上将其转换回 ConcurrentDictionary 并再次修改它


编辑:刚刚看到Jon Skeet 发布了a comment,在我写这个答案时也说了同样的话

【讨论】:

  • 非常感谢两位,是IReadOnlyDictionary 还是IReadonlyDictionary?要么是要求我安装一个 nuget System.Runtime 是对的吗?
  • 它的 IReadOnlyDictionary&lt;string, string&gt; 在演员阵容中,但 Visual Studio 告诉我演员阵容是多余的。只需要更改我的界面,但它似乎在没有演员阵容的情况下工作。我也会记住它也被转换回ConcurrentDictionary。谢谢
  • @user1574598 是的,它是IReadOnlyDictionary,大写的O,我的错。是的,演员阵容是不必要的,我只是添加它来明确显示到底发生了什么
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 2015-09-03
  • 2018-04-25
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多