我开始学习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
答案 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