題目起的好吧。
結構類型可以在棧分配空間,而參考型別只能分配指標。
通過數組,結構類型可以分配一個連續的空間和一個指標。
數組結合參考型別只能分配連續的指標,和零散的空間。這是效能問題的一個潛在點。
因此要做序列化的東西,而又比較在意效能,數組結合結構類型是有必要的。
沒有指標,可以用下標來訪問,也就是枚舉數組的元素,需要返回數組本身(指標)和他當前的下標(自然數)兩樣東西,這沒有指標方便,但基本可以滿足要求。
問題是,很多資料結構的api並不返回數組和下標,而是傳回值本身。如果該值是參考型別,那麼還能當指標來使用,如果該值是實值型別,那就不能枚舉元素了。
也許我們不需要枚舉元素,只需要改變元素,提取實值型別元素就是複製一份這種設定,也是效能問題的潛在點。
想返回指標而不是值怎麼辦?返回可以訪問它的對象和訪問的方法參數。
如二叉樹,節點對象持有實值型別,而有兩個指標指向左右節點。一般資料結構api傳回值,那麼你就無法修改該節點的。唯一的方法是你返回該節點。
如數組,節點是值,傳回值就無法修改這個節點的值,而需要返回數組,和該節點的下標。
.net內建的類庫我們沒辦法更改,但是要實現高效能的資料結構,就需要考慮提供引用訪問的介面,避免無意義的複製。
c#內建的可枚舉類型(IEnumerable),列舉程式(IEnumerator)類似以上概念,但是返回的當前枚舉所持有的值是不可修改的,第二,它是一個遍曆用途的工具,從0開始,而不是從你需要使用的項開始。比如你想返回數組第3項,但是可枚舉類型會返回一個列舉程式,它的下標是從-1開始的。
理想的設計應該類似是:
class Tor<Node,T>{
Node node;
int i;
pubulic T Value{get{return node[i];}set{node[i] = value}}
public bool move(){if(node.Length > i){i++;return ture;}else return flase;};
public Tor(Node n, int index){node = n; i = index);
}
static void main(){
int [] m = {0,1,2,3,4};
Tor<int[],int> t = new Tor(m, 2);
t.Value = 5;
while (t.move) t.Value = 0;
List<int> list = new List<int>(Enumerable.Rangle(0,4));
Tor<List<int>,int> t = new Tor(list, 2);
}