以下代码中的密钥不是多余的吗?

时间:2016-03-06 16:40:27

标签: c#

我开始学习MVC 6并找到了this教程。

以下代码引自链接网站:

//TodoItem.cs
namespace TodoApi.Models
{
    public class TodoItem
    {
        public string Key { get; set; }
        public string Name { get; set; }
        public bool IsComplete { get; set; }
    }
}

TodoItem类将是ConcurrentDictionary中的值字段:

static ConcurrentDictionary<string, TodoItem> _todos =
    new ConcurrentDictionary<string, TodoItem>();

具有字符串类型的键字段将包含与TodoItem.Key相同的值:

public void Add(TodoItem item)
{
    item.Key = Guid.NewGuid().ToString();
    _todos[item.Key] = item;
}

这是否意味着每次添加新项目时Key都会存储两次(一次是字典的关键字段,一次是值字段内)或者我遗漏了什么?

我在使用std :: map的C ++中遇到过这种情况,我总是使用这样的东西来避免存储Key的值两次:

struct Item
{
    //std::string Key;
    std::string Name;
    bool IsComplete;
};

std::map<std::string, Item> items;
//       ^^ Item.Key

1 个答案:

答案 0 :(得分:2)

  

这是否意味着每次添加新项目时Key都会   存储两次(一次是字典的关键字段,一次是内部   价值领域)或我遗失了什么?

在.NET System.String类型中是一种引用类型,因此您不必担心存储两次的密钥。它将是内存中的单个实例,字典的Key和项的Key属性都只是指向它。所以不要担心这种情况下的冗余。您在此处使用的ConcurrentDictionary结构只是围绕实际数据的指针的简单包装。

另外值得一提的是.NET中System.String类型的另一个有趣属性。即使您有两个具有相同值的字符串的不同实例,运行时也可以决定实习它们并且它们将指向内存中的相同数据:

string a = "abc";
string b = "abc";
bool res = object.ReferenceEquals(a, b); // true