list.removeall参数null异常未抛出

时间:2012-09-04 09:50:40

标签: c#

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

list.RemoveAll如果我在一个计数为零的列表上调用ArgumentNullException,它应该抛出 _dataNotWrittenToDb.RemoveAll(item => item.ScopeId == _a2Data.ScopeId); _dataWrittenToDB.RemoveAll(item => item.ScopeId == _a2Data.ScopeId); ,但即使计数为零也不会抛出任何异常。

{{1}}

4 个答案:

答案 0 :(得分:2)

来自MSDN

<强>例外

Exception   Condition
ArgumentNullException   

match is null.

只有当传递参数为null时,RemoveAll抛出ArgumentNullException,在你的情况下它不是null

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

答案 1 :(得分: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); 

答案 2 :(得分: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的唯一时间是参数实际上等于null

答案 3 :(得分:-1)

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

NullReferenceException只会在null个对象上抛出,而不是空洞。

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