关于异常:为什么C#TryAdd,TryRemove,TryGetValue在失败时返回null集?

Why do C# TryAdd, TryRemove, TryGetValue return null sets when they fail?

字典方法失败时为什么返回空集?

If the answer is"what do you expect them to return???" I guess I was
expecting an empty HashSet that I can run methods like Count or
GetEnumerator on. Without getting an exception.

Maybe my question is really, should I catch an exception, make the return value not null and then return it?

我看过这个问题,但是当我调用add()、remove()或TryGetValue()时,我的字典不是空的。

是的,这是一个编程分配,但数据结构是我的选择,用两个并发的操作来表示一个图。

测试运行时:

1
2
DependencyGraph t = new DependencyGraph();
Assert.IsFalse(t.GetDependees("x").GetEnumerator().MoveNext());

我的方法运行:

1
2
3
4
5
6
    public IEnumerable<string> GetDependees(string s)
    {
        HashSet<String> valuesForKey = new HashSet<String>();
        dependeeGraph.TryGetValue(s, out valuesForKey);
        return valuesForKey;
    }

当它在返回值上碰到.GetEnumerator().MoveNext()时,我得到nullreferenceexception。


哦……

停止忽略返回值。返回值告诉你"没有数据"。唯一的原因是,在所有的out参数集是因为C #要求你做你不应该使用这样的价值。

如果你真的在乎的差异之间的"无数据"和"一个零设置项目",你可以写你自己的扩展方法来简化事情。

1
2
3
4
5
6
7
8
public static IEnumerable<string> GetValueOrEmpty(this DependencyGraph dg, string s)
{
  HashSet<string> value;

  if (!dg.TryGetValue(s, out value)) return Enumerable.Empty<string>();

  return value;
}


TryGetValue安切洛蒂outTValue类型参数的参数。因为outinitialised参数必须由所谓的功能,TryGetValue必须做generically每可能的类型。搜索是唯一的价值是nulldefault(TValue)类型为零的参考和值类型。