C# stack源码浅析

2021/6/20 22:26:45

本文主要是介绍C# stack源码浅析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

所在框架版本:.Net Framework 4.0.30319

1.部分变量

private T[] _array;      //元素数组
private int _size;   //元素个数
private int _version;   //版本号
[NonSerialized]
private object _syncRoot;  
private const int _defaultCapacity = 4;  //默认容量
private static T[] _emptyArray = new T[0];   //默认空数组

2.构造函数

public Stack() 
    {
      this._array = Stack<T>._emptyArray;    //给空数组
      this._size = 0;   //元素个数为0
      this._version = 0;  //版本号初始化
    }
public Stack(int capacity)
    {
      if (capacity < 0)
        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_NeedNonNegNumRequired);
      this._array = new T[capacity];    //按容量初始化数组
      this._size = 0;   //元素个数为0
      this._version = 0;  //版本号初始化
    }
public Stack(IEnumerable<T> collection)
    {
      if (collection == null)
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
      if (collection is ICollection<T> objs)    //如果传进来的是泛型集合
      {
        int count = objs.Count;     //获得参数集合的元素个数
        this._array = new T[count];   //初始化数组
        objs.CopyTo(this._array, 0);   //拷贝到元素数组中
        this._size = count;   //元素个数赋值
      }
      else     //如果不是泛型集合
      {
        this._size = 0;   
        this._array = new T[4];   //先初始化容量为4
        foreach (T obj in collection)  
          this.Push(obj);   //一个个压栈
      }
    }

3.清空

public void Clear()
    {
      Array.Clear((Array) this._array, 0, this._size);  
      this._size = 0;  //元素个数重置
      ++this._version;   //版本号更新
    }

4.查找

public bool Contains(T item) 
    {
      int size = this._size;
      EqualityComparer<T> equalityComparer = EqualityComparer<T>.Default;
      while (size-- > 0)
      {
        if ((object) item == null)   //如果要查找的元素是空
        {
          if ((object) this._array[size] == null)
            return true;
        }
        else if ((object) this._array[size] != null && equalityComparer.Equals(this._array[size], item))    //使用比较器查找到了
          return true;
      }
      return false;   //默认返回false
    }


这篇关于C# stack源码浅析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程