欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习C#泛型概述,泛型用来解决什么问题

程序员文章站 2024-03-14 21:21:59
...

 

一个先入先出的队列:

//一个先进先出的队列
    class Queue
    {
        private const int DEFAULTQUEUESIZE = 100;

        //队列的成员为int类型
        private int[] data;
        private int head = 0, tail = 0;
        private int numElements = 0;

        //构造器构造队列的大小默认值为100
        public Queue()
        {
            this.data = new int[DEFAULTQUEUESIZE];
        }

        //指定队列大小的构造器
        public Queue(int size)
        {
            if (size > 0)
            {
                this.data = new int[size];
            }
            else
            {
                throw new ArgumentOutOfRangeException("size", "Must be greater than zero");
            }
        }

        //向队列添加数据项,使用循环缓存存放数据
        public void Enqueue(int item)
        {
            if (this.numElements == this.data.Length)
            {
                throw new Exception("Queue is full");
            }

            this.data[this.head] = item;
            this.head++;
            this.head %= this.data.Length;
            this.numElements++;
        }

        //从队列中删除数据项,出队和入队顺序一致
        public int Dequeue()
        {
            if (this.numElements == 0)
            {
                throw new Exception("Queue is empty");
            }

            int queueItem = this.data[this.tail];
            this.tail++;
            this.tail %= this.data.Length;
            this.numElements--;
            return queueItem;
        }
    }

使用队列,

static void Main(string[] args)
        {
            Queue queue = new Queue();

            queue.Enqueue(100);
            queue.Enqueue(-25);
            queue.Enqueue(33);

            Console.WriteLine($"{queue.Dequeue()}");
            Console.WriteLine($"{queue.Dequeue()}");
            Console.WriteLine($"{queue.Dequeue()}");
        }

显示输出:

学习C#泛型概述,泛型用来解决什么问题

可见数学项按入队顺序出队。

Queue类能支持int类型的成员的操作,创建字符串队列,float队列,甚至更复杂类型的队列怎么办?

方法一,重写Queue类,没错,可以实现,但是有没有更好方法呢?

方法二,使用object类,C#中可以object类引用任意类型的值或变量,但问题来了,

如何将Dequeue方法返回值转换为恰当的类型呢?

另外,object是引用类型,如果是值类型,就会消耗额外的内存和处理器时间,对每个数据项来说造成的性能开销不大,但如果创建大量数据,积累起来这个开销还是不容忽视的。

 

C#使用泛型可以解决这个问题。