1

我有类型结构的列表,我在其中临时添加数据并在将数据写入数据库或文件时删除它们,我正在使用list.RemoveAll方法从列表中删除项目。

如果我在计数为零的列表上调用它,则list.RemoveAll应该抛出ArgumentNullException,但即使计数为零,它也不会抛出任何异常。

    _dataNotWrittenToDb.RemoveAll(item => item.ScopeId == _a2Data.ScopeId);
    _dataWrittenToDB.RemoveAll(item => item.ScopeId == _a2Data.ScopeId);
4

4 回答 4

3

来自MSDN

例外

Exception   Condition
ArgumentNullException   

match is null.

RemoveAll 仅在传递的参数为 null 时抛出 ArgumentNullException,在您的情况下它不为 null

RemoveAll 的工作是删除与给定条件匹配的所有元素,在您的情况下,没有匹配的元素,没有删除并且没有理由返回异常

于 2012-09-04T09:55:12.830 回答
1

如果你想要例外,你可以这样做:

Predicate<YourItemStruct> p = item => item.ScopeId == _a2Data.ScopeId;

if (!_dataNotWrittenToDb.Exists(p))
  throw new Exception("No items exist to delete");
_dataNotWrittenToDb.RemoveAll(p); 
if (!_dataWrittenToDb.Exists(p))
  throw new Exception("No items exist to delete");
_dataWrittenToDb.RemoveAll(p); 
于 2012-09-04T10:09:47.320 回答
0

从列表反编译的来源:

  public int RemoveAll(Predicate<T> match)
    {
      if (match == null)
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
      int index1 = 0;
      while (index1 < this._size && !match(this._items[index1]))
        ++index1;
      if (index1 >= this._size)
        return 0;
      int index2 = index1 + 1;
      while (index2 < this._size)
      {
        while (index2 < this._size && match(this._items[index2]))
          ++index2;
        if (index2 < this._size)
          this._items[index1++] = this._items[index2++];
      }
      Array.Clear((Array) this._items, index1, this._size - index1);
      int num = this._size - index1;
      this._size = index1;
      ++this._version;
      return num;
    }

正如您所看到的,此方法抛出的唯一时间ArgumentNullException是参数实际上是 equals 的时候null

于 2012-09-04T09:55:17.563 回答
-1

如果count为 0,则表示列表为空。但是这个列表是存在的。Null表示该列表不存在。

NullReferenceException只会被扔到null物体上,而不是空的。

与根本没有盒子相比,它就像现实生活中的一个空盒子。

于 2012-09-04T09:55:05.990 回答