基本上我想知道使用代码合同来确定 ConcurrentDictionary 中是否存在密钥是否是可接受的代码合同使用。这对我来说感觉不对,因为它不仅仅是参数检查,因为它取决于运行时字典的状态。
public class MyClass
{
private ConcurrentDictionary<string, object> someItems =
new ConcurrentDictionary<string, object>();
public object GetItem(string itemName)
{
Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(itemName));
// ?? Is this a correct alternative to checking for null???
Contract.Requires<KeyNotFoundException>(someItems.ContainsKey(itemName));
return someItems[itemName];
}
}
但如果可以的话,它是一种更简洁的方法,它有 2 个 Contract.Requires 和一个 return,而不是下面的传统方式。
public class MyClass
{
private ConcurrentDictionary<string, object> someItems =
new ConcurrentDictionary<string, object>();
public object GetItem(string itemName)
{
Contract.Requires<ArgumentNullException>(!String.IsNullOrWhiteSpace(itemName));
// Traditional null check
var item = someItems[itemName];
if (item == null)
{
throw new KeyNotFoundException("Item " + itemName + " not found.");
}
return item;
}
}