技术开发 频道

Slice2CSharp映射之序列的映射


【IT168技术文档】

  Slice2CS编译器支持两种不同的sequences映射,默认情况下,sequence被映射成c#数组;同样我们也可以利用元指令强制编译器将sequence映射为强类型集合(CollectionBase),即让它继承自System.Collections.CollectionBase接口。

  1 序列映射为数组

  默认情况下,sequence被映射成c# 数组类型,这意味着,Slice2CS编译器只是将SliceSequece生成为一个指定类型的数组,而不会生成任何其它的代码。例如:
sequence<Fruit> FruitPlatter; 上面的定义将会生成下面两个代码中的任一一个:: Fruit[] fp = { Fruit.Apple, Fruit.Orange }; 或 Fruit fp[] = new Fruit[2]; fp[0] = Fruit.Apple; fp[1] = Fruit.Orange;
  将sequence映射成数组是简单而又高效的,特别是当sequence只包含值类型时,因为访问数组的元素不需要装箱和拆箱操作。

  2 序列映射为CollectionBase

  将sequence映射为数组是很简单的,但如果sequence的元素是不固定的,而我们又将其映射为数组,我们就不能进行动态的增加、删除序列的元素。这种情况下,我们可以利用元指令强制编译器将序列映射为CollectionBase:
["clr:collection"] sequence<Fruit> FruitPlatter; 上面的定义产生的代码如下: using System; using System.Collections; public class FruitPlatter : CollectionBase,ICloneable { public FruitPlatter(); public FruitPlatter(int capacity); public FruitPlatter(Fruit[] a); public Fruit this[int index] { get;set; } public virtual int Capacity { get;set; } #region ICloneable Members public object Clone(); #endregion public void CopyTo(Fruit[] a); public void CopyTo(Fruit[] a, int i); public void CopyTo(int i, Fruit[] a, int ai, int c); public Fruit[] ToArray(); public void AddRange(FruitPlatter s); public void AddRange(Fruit[] a); public int Add(Fruit value); public int IndexOf(Fruit value); public void Insert(int index, Fruit value); public void Remove(Fruit value); public bool Contains(Fruit value); public virtual void TrimToSize(); public virtual void Sort() public virtual void Sort(IComparer comparer) public virtual void Sort(int index, int count,IComparer comparer) public virtual void Reverse() public virtual void Reverse(int index, int count) public virtual int BinarySearch(Fruit value) public virtual int BinarySearch(Fruit value, System.Collections .IComparer comparer) public virtual int BinarySearch(int index, int count,Fruit value,IComparer comparer) public virtual void InsertRange(int index, FruitPlatter c) public virtual void InsertRange(int index, Fruit[] c) public virtual void RemoveRange(int index, int count) public virtual FruitPlatter GetRange(int index, int count) public virtual void SetRange(int index, FruitPlatter c) public virtual void SetRange(int index, Fruit[] c) public virtual int LastIndexOf(Fruit value) public virtual int LastIndexOf(Fruit value, int startIndex) public virtual int LastIndexOf(Fruit value, int startIndex, in t count) public static FruitPlatter Repeat(Fruit value, int count) public override int GetHashCode(); public override bool Equals(object other); public static bool Equals(FruitPlatter lhs,FruitPlatter rhs); public static bool operator ==(FruitPlatter lhs,FruitPlatter rhs); public static bool operator !=(FruitPlatter lhs,FruitPlatter rhs); // ... }
0
相关文章