泛型与object的比较

    技术2022-07-15  62

    先定义一个使用object类型数组存储内容的类

    public class FixedSizeCollection { public static int InstanceCount { get; set; } public int ItemCount { get; private set; } private object[] Items { get; set; } public FixedSizeCollection(int maxItems) { FixedSizeCollection.InstanceCount++; this.Items = new object[maxItems]; ItemCount = 0; } public void AddItem(object item) { if (ItemCount<=Items.Length) { this.Items[ItemCount] = item; ItemCount++; } else { throw new Exception("Item queue if full"); } } public object GetItem(int index) { if (index>=this.Items.Length&&index>=0) { throw new ArgumentOutOfRangeException(nameof(index)); } return Items[index]; } public override string ToString() => $"该类总共有{FixedSizeCollection.InstanceCount.ToString()}个实例,这个对象的类型为" + $"{this.Items.GetType().ToString()},这个类型的当前容量为{this.ItemCount}"; }

    定义一个FixedSizeCollection类。 有三个属性: ①static InstanceCount 用来记录,这个类有多少实例对象。 ②ItemCount 用来记录,当前类对象的存储情况,以及存储下标 ③object[] Items 用来存储对象的数组

    有三个方法: ①构造方法,含有一个参数,用来规定Items的存储空间大小,初始化Items,itemCount,并且InstanceCount++,来记录实例的次数 ②AddItem 参数为object类型,表示可以传进来任何类型的参数,但涉及到装拆箱的过程,也不含类型的安全检查,例如第一次传进去的为int类型,第二次传进去的可以为string或者其他类型 ③GetItem 参数为int类型,用来所以数组的[index]用,返回类型为object类型。 重写了ToString()方法,用来输出当前类有多少实例,当前实例的对象类型,以及当前实例的容量。

    定义一个使用T[] 数组存储内容的类

    class FixedSizeCollectionT<T> { public static int InstanceCount { get; set; } public int ItemsCount { get; private set; } private T[] Items { get; set; } public FixedSizeCollectionT(int maxItems) { this.Items = new T[maxItems]; InstanceCount++; ItemsCount = 0; } public void AddItem(T addItem) { if (ItemsCount<this.Items.Length) { Items[ItemsCount] = addItem; ItemsCount++; } } public T GetItem(int index) { if (index>this.Items.Length) { throw new ArgumentOutOfRangeException(nameof(index)); } return Items[index]; } public override string ToString() => $"该类的实例总共有{FixedSizeCollectionT<T>.InstanceCount.ToString()}个" + $"对象的类型为{this.GetType().ToString()},当前对象中的T[]数组容量{this.Items.Length}"; }

    定义FixedSizeCollectionT类,有一个可以用的类型占位符T。 有三个属性: ①static InstanceCount 用来记录,这个类有多少实例对象。 ②ItemsCount 用来记录,当前类对象的存储情况,以及存储下标 ③T[] Items 用来存储对象的数组

    有三个方法: ①构造方法,含有一个参数,用来规定Items的存储空间大小,初始化Items,itemCount,并且InstanceCount++,来记录实例的次数 ②AddItem 参数为T类型,占位符T,在对象实例化的时候关闭如:FixedSizeCollectionT fixedIntCollectionT = new FixedSizeCollectionT(2); ③GetItem 参数为int类型,用来所以数组的[index]用,返回类型为类型。 重写了ToString()方法,用来输出当前类有多少实例,当前实例的对象类型,以及当前实例的容量。

    在主方法中声明两个类,并加入数据,看打印的结果:

    class Program { static void Main(string[] args) { FixedSizeCollection fixedIntCollection = new FixedSizeCollection(2); FixedSizeCollection fixedIntCollection1 = new FixedSizeCollection(2); FixedSizeCollection fixedStringCollection = new FixedSizeCollection(1); fixedIntCollection.AddItem(5); fixedIntCollection.AddItem(4); fixedStringCollection.AddItem("abc"); Console.WriteLine(fixedIntCollection.ToString()); Console.WriteLine(fixedStringCollection.ToString()); FixedSizeCollectionT<int> fixedIntCollectionT = new FixedSizeCollectionT<int>(2); fixedIntCollectionT.AddItem(5); fixedIntCollectionT.AddItem(4); FixedSizeCollectionT<string> fixedStringCollectionT = new FixedSizeCollectionT<string>(2); fixedStringCollectionT.AddItem("abc"); fixedStringCollectionT.AddItem("qwe"); Console.WriteLine(fixedIntCollectionT.ToString()); Console.WriteLine(fixedStringCollectionT.ToString()); } }

    FixedSizeCollection声明了三个实例 FixedSizeCollection声明了两个实例 输出结果:

    分析: 可以看到FixedSizeCollection声明的实例是共用静态参数的,而FixedSizeCollection,会根据关闭的类型声明不同,产生每个类型共用的静态参数 并且可以看到FixedSizeCollection返回的都是Object类型,且没有类型检查 FixedSizeCollection返回的是关闭类型,且有类型检查

    Processed: 0.019, SQL: 9