List索引如何工作? C#

时间:2015-02-21 10:23:26

标签: c# list indexing

private List<Vector2> waypoints;

void Moveto ()
{
    if (waypoints[0] != null)
        {

            print("Why does it print this?");
        }
}

所以我尝试使用列表,但我没有得到它。 到目前为止,这个列表是空的,但它打印的东西。我从未添加任何东西。为什么if子句是真的?

我做错了索引吗?

这是假方法吗?

列表中是否总有第一个元素?

我想稍后在列表中添加航点。我总是希望该方法采用列表的第一个元素,并在做完之后删除它。第一个元素是空的,还是所有其他元素都会下拉一个索引? 列表是愚蠢的数组。请帮忙

2 个答案:

答案 0 :(得分:1)

仅仅为了一般知识,通用列表实现基于幕后动态增长的数组。

  1. 如果您尚未初始化列表,则会收到null异常。 如果您没有对列表字段进行任何其他分配 我建议你将列表字段设置为readonly并使用字段初始化,并保存自己将其检查为null并在每个构造函数或使用方法\属性中重新初始化它的头痛。

  2. 一旦List的默认构造函数被调用,它的'数据存储阵列就是 如果你要求,初始化为4的容量(如果我没有记错的话) 您可以使用的可用容量范围(零到4-1)之间的任何索引 超出范围例外。

  3. 在使用索引器之前,您应该检查上面的两个, 例如:

    private bool TryGetValue(int index , out Vector2 vector)
    {
      vector = default(Vector2);
      if(wayPoints!=null&& index >=0&& wayPoint.Count> index)
      {
        vector = wayPoints[index];
        return true;
      }
    
      return false;    
    }
    

答案 1 :(得分:-3)

以下是来自Reflector Webtropy -

的List索引的代码
public T this[int index] {
        get {
            // Fllowing trick can reduce the range check by one
            if ((uint) index >= (uint)_size) {
                ThrowHelper.ThrowArgumentOutOfRangeException();
            }
            return _items[index];
        }
        set {
            if ((uint) index >= (uint)_size) {
                ThrowHelper.ThrowArgumentOutOfRangeException();
            }
            _items[index] = value;
            _version++;
        }
    }