如何在C#类中创建每个实例独有的Dictionary?
C#实现每个实例拥有独立Dictionary的方案
你的原代码存在两个核心问题:一是构造函数接收外部Dictionary实例,可能导致多个对象共享同一字典;二是固定三个属性的设计无法灵活支持不同对象的键值对需求。以下是优化后的实现方案:
方案1:带灵活初始化的类实现
这个方案让每个实例自动创建独立字典,同时支持任意数量的键值对初始化,还能动态添加属性:
internal class Item { // 每个实例独立拥有的字典,直接在类内初始化 private readonly Dictionary<string, string> _properties = new Dictionary<string, string>(); // 支持任意数量的键值对作为构造参数 public Item(params KeyValuePair<string, string>[] properties) { foreach (var kvp in properties) { _properties.Add(kvp.Key, kvp.Value); } } // 动态添加属性的方法 public void AddProperty(string key, string value) { if (!_properties.ContainsKey(key)) { _properties.Add(key, value); } // 可选:如果键已存在,可抛出异常或覆盖值 } // 获取属性的方法 public string GetProperty(string key) { _properties.TryGetValue(key, out var value); return value; } }
使用示例
// 创建car对象,初始化speed和price var car = new Item( new KeyValuePair<string, string>("speed", "100"), new KeyValuePair<string, string>("price", "2000") ); // 创建dog对象,初始化age和name var dog = new Item( new KeyValuePair<string, string>("age", "5"), new KeyValuePair<string, string>("name", "doggo") ); // 动态添加属性到新对象 var cat = new Item(); cat.AddProperty("color", "orange"); cat.AddProperty("weight", "3");
方案2:简洁的公共字典属性实现
如果不需要封装,直接暴露公共字典属性,利用C#集合初始化器简化代码:
internal class Item { // 每个实例的独立字典,类内初始化保证独立性 public Dictionary<string, string> Properties { get; } = new Dictionary<string, string>(); }
使用示例
var car = new Item { Properties = { { "speed", "100" }, { "price", "2000" } } }; var dog = new Item { Properties = { { "age", "5" }, { "name", "doggo" } } };
核心要点
- 保证字典独立性:必须在类内部初始化字典(
= new Dictionary<...>),而不是通过构造函数接收外部字典替换,这样每个实例都会生成全新的字典实例。 - 灵活性:放弃固定数量的属性参数,改用支持任意键值对的初始化方式,满足不同对象的个性化键值需求。
内容的提问来源于stack exchange,提问作者gino pasticcio
相关产品推荐
相关产品推荐

