自己实现栈如下:
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将为其产生一份独立的代码。