自己实现栈,泛型的一些自我认识

时间:2021-07-30 15:39:38

自己实现栈如下:

public class MyStack<T> : IStack<T> where T:class 

    {

        public List<T> MyList { get; set; }

 

        public int Count

        {

            get { return MyList.Count; }

        }

 

        public MyStack()

        {

            MyList = new List<T>();

        }

 

        public MyStack(IEnumerable<T> list)

        {

            MyList = new List<T>();

            foreach (var item in list.Where(item => this.MyList != null))

            {

                Push(item);

            }

        }

 

        #region

        /// <summary>

        /// 元素出栈

        /// </summary>

        /// <returns>出栈元素t</returns>

        public T Pop()

        {

            var t = this.MyList.ElementAt(0);

            this.MyList.RemoveAt(0);

            return t;

        }

        #endregion

 

        #region

        /// <summary>

        /// 元素t压栈

        /// </summary>

        /// <param name="t">压栈元素</param>

        public void Push(T t)

        {

            this.MyList.Insert(0,t);

        }

        #endregion

 

        #region

        /// <summary>

        /// 查找具体位置的元素

        /// </summary>

        /// <param name="location">具体位置</param>

        /// <returns>具体位置上对应的元素</returns>

        public T Peek(int location)

        {

            return this.MyList.ElementAt(location);

        }

        #endregion

 

        #region

        /// <summary>

        /// 判断栈是否为空

        /// </summary>

        /// <returns>bool</returns>

        public bool Empty()

        {

            this.MyList.Clear();

            return this.Count == 0;

        }

        #endregion

 

        #region

        /// <summary>

        /// 实现MyStack对Foreach遍历的支持

        /// </summary>

        /// <returns></returns>

        public IEnumerator<T> GetEnumerator()

        {

            //可以用Foreach等价实现

            return ((IEnumerable<T>)this.MyList).GetEnumerator();

        }

        #endregion

 

        #region

        /// <summary>

        /// 重写ToString方法

        /// </summary>

        /// <returns></returns>

        public override string ToString()

        {

            var stringBuilder = new StringBuilder();

            foreach (var item in this.MyList)

            {

                stringBuilder.Append(item + "\n");

            }

            return stringBuilder.ToString();

        }

        #endregion

 

        IEnumerator IEnumerable.GetEnumerator()

        {

            return GetEnumerator();

        }

    }

 

   接口IStack<T>的代码:

public interface IStack<T>:IEnumerable<T> where T:class 
 {
        T Pop();
        void Push(T t);
        T Peek(int location);
        bool Empty();
        int Count { get; }
    }

泛型机制:

C#泛型代码在被编译为IL代码和无数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以"on-demand"的方式,发生在JIT编译时。

CLR是公共语言运行库(Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。

同时也是有了CLR,我们在编写C#代码的时候就不用去自己分配内存和释放一些空间,让我们的编程更加方便了。但是我觉得我们还是应该去了解这些机制,才会让我们学到的更多。IL,同MSIL(Microsoft Intermediate Language),是将.NET代码转化为机器语言的一个中间语言,因此又把IL语言称之为伪汇编语言。

C#泛型编译机制:

1. 第一轮编译时,编译器只为Stack<T>(栈算法)类型产生“泛型版”的IL代码与元数据-----并不进行泛型类型的实例化,T在中间只充当占位符

2. JIT编译时,当JIT编译器第一次遇到Stack<int>时,将用int替换“泛型版”IL代码与元数据中的T---进行泛型类型的实例化。CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码;但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。