我使用 ConcurrentDictionary<TKey, TValue>
来实现 ConcurrentSet<T>
。
public class ConcurrentSet<T> : ISet<T>
{
private readonly ConcurrentDictionary<T, byte> collection;
}
ConcurrentDictionary<TKey, TValue>
无法包含具有空键的键值对。
// summary, param, returns...
/// <exception cref="ArgumentNullException">
/// <paramref name="item" /> is null.
/// </exception>
public bool Add(T item)
{
// This throws an argument null exception if item is null.
return this.collection.TryAdd(item, 0);
}
所以,我应该...
if (item == null)
throw new ArgumentNullException("item", "Item must not be null.");
return this.collection.TryAdd(item, 0);
或者,我应该:
try
{
return this.collection.TryAdd(item, 0);
}
catch (ArgumentNullException)
{
throw new ArgumentNullException("item", "Item must not be null.");
}
或者,我应该,
try
{
return this.collection.TryAdd(item, 0);
}
catch (ArgumentNullException x)
{
// I know, but I don't want to preserve the stack trace
// back to the underlying dictionary, anyway.
throw x;
}
或者,我应该,
try
{
return this.collection.TryAdd(item, 0);
}
catch (ArgumentNullException)
{
// The thrown exception will have "key", instead of
// "item" as the parameter's name, in this instance.
throw;
}
这个怎么正确的做呢?
ArgumentNullException
包装ArgumentNullException
的意义的信息? - Ilya IvanovConcurrentSet.Add
,所以堆栈跟踪应该显示这一点。此外,抛出的异常应该表明空参数的名称是 "item" 而不是 "key"。 - supercatConcurrentDictionary<TKey, TValue>
引发的ArgumentNullException
将其ParamName
属性设置为“key”,而不是“item”。这不是此类的预期行为,它可能会使ConcurrentSet<T>
的使用者感到困惑,因为它通过异常的ParamName
属性和源自ConcurrentDictionary<TKey, TValue>
的堆栈跟踪公开了实现细节。 - Şafak Gür