迭代模式
不就是迭代模式嗎,就是第一個,上一個,下一個,最后一個,當前元素嗎?
用得著搞幾個接口弄出五六個類出來嗎?
而且元素還是Object類型,裝箱,拆箱的,真要命,用泛型吧
有時候在想,設計模式是用來欣賞的、用來學習的,真正在用的時候根本用不上,那么多接口和類,調來調去的
不好資源的嗎?真正在用的時候應該是精簡版的設計模式,你也可以說他不是設計模式,畢竟嘴是你的。
如果你的方法參數為基礎類型,沒有用out或ref,C#就會為你產生一個變量,因為基礎類型是值拷貝
當然基礎類型分配在棧中,分配速度較快,而且能很快回收,棧的容量是有限的嗎,能不很快回收嗎。
棧是先進后出,比如一個方法中的基礎類型變量,先定義的先進棧,卻后釋放,什么叫壓棧,就是這個道理啦。
引用類型參數一般不會產生多余的變量,引用類型就是引用對象的地址,直接對對象的地址內容進行操作
引用類型分配在托管堆中,在其中分配資源的速度相對棧較慢,因為需要尋找空閑內存,搜集整理內存碎片,都是要時間的。
托管堆中的資源什么時候被GC回收是不知道的,當然不會很久,這種事情是不能拖的,他可跟控件不同,你想脫就脫啊。
namespace ClassTest { /// <summary> /// 迭代模式 /// </summary> public class Iterator<T> { private ConcreteList<T> concreteList; //索引值 int index; public Iterator(ConcreteList<T> concreteList) { index = 0; this.concreteList = concreteList; } /// <summary> /// 第一個元素 /// </summary> public void First() { index = 0; } /// <summary> /// 最后一個元素 /// </summary> public void Last() { index = concreteList.Count - 1; } /// <summary> /// 當前元素 /// </summary> /// <returns></returns> public T CurrentItem() { return concreteList.GetCurrent(index); } /// <summary> /// 下一個元素 /// </summary> /// <returns></returns> public bool Next() { if (++index >= concreteList.Count) //如果當前元素已經最后一個元素,返回false { return false; } return true; } /// <summary> /// 上一個元素 /// </summary> private void Previous() { if (index > 0) { index--; } } } } using System; using System.Collections.Generic; namespace ClassTest { /// <summary> /// 實體集合 /// 對元素進行添加、刪除和顯示 /// </summary> /// <typeparam name="T"></typeparam> public class ConcreteList<T> { private IList<T> list; public ConcreteList() { list = new List<T>(); } /// <summary> /// 添加元素 /// </summary> /// <param name="t"></param> public void Add(T t) { list.Add(t); } /// <summary> /// 刪除指定元素 /// </summary> /// <param name="t"></param> public void Remove(T t) { list.Remove(t); } /// <summary> /// 根據索引刪除元素 /// </summary> /// <param name="index"></param> public void RemoveAt(int index) { if (Count <= index) //索引超出范圍 { throw new ArgumentOutOfRangeException("index"); } list.RemoveAt(index); } /// <summary> /// 元素個數 /// </summary> public int Count { get { return list.Count; } } /// <summary> /// 獲取當前元素 /// </summary> /// <param name="index"></param> /// <returns></returns> public T GetCurrent(int index) { if (Count == 0) //處理集合為空的情況 { return default(T); } if (Count<=index) //索引超出范圍 { throw new ArgumentOutOfRangeException("index"); } return list[index]; } } }
浙公網安備 33010602011771號