C#(五十)之泛型

简介: 泛型( Generic ) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。可以理解为就是C++中的模板。

QQ图片20220426165108.png

C#的缺点:


1:进行拆箱和装箱的过程损耗性能

2:无论什么数据都往集合里放,不利于编译时对代码安全性的检测

3:显示转换会降低代码可读性。


基于以上缺点,C#推出了泛型


1:泛型(Generic  允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。可以理解为就是C++中的模板。


泛型避免了数据装箱和拆箱的过程,大大的提高了程序的运行效率。


使用命名空间:


using System.Collections.Generic;


泛型类实例:


// 定义一个泛型类
    // T标识任意的数据类型(什么代号都可以)
    class fanxings<T>
    {
        // 定义一个数组,类型为T
        T[] array;
        private int head;
        private int tail;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="length">整数型 数组长度</param>
        public fanxings(int length)
        {
            head = 0;
            tail = 0;
            array = new T[length];
        }
        /// <summary>
        /// 压入泛型
        /// </summary>
        /// <param name="item"></param>
        public void qwer(T item)
        {
            if ((tail + 1) % array.Length != head)
            {
                tail = (tail + 1) % array.Length;
                array[tail] = item;
            }
            else
            {
                throw new Exception("full");
            }
        }
        /// <summary>
        /// 取出泛型
        /// </summary>
        /// <returns></returns>
        public T quchu()
        {
            if (head != tail)
            {
                head = (head + 1) % array.Length;
                return array[head];
            }
            else
            {
                throw new Exception("full");
            }
        }
    }


调用实例:


class Program
    {
        static void Main(string[] args)
        {
            // 实例化类;
            fanxings <int> fan = new fanxings<int>(20);
            fan.qwer(1);
            fan.qwer(2);
            fan.qwer(3);
            fan.qwer(4);
            fan.qwer(5);
            fan.qwer(6);
            fan.qwer(7);
            for (int i = 0; i < 7; i++)
            {
                Console.WriteLine(fan.quchu());
            }
            // 实例化类;
            fanxings<string> fansss = new fanxings<string>(20);
            fansss.qwer("A");
            fansss.qwer("B");
            fansss.qwer("C");
            fansss.qwer("D");
            fansss.qwer("E");
            fansss.qwer("F");
            fansss.qwer("G");
            for (int i = 0; i < 7; i++)
            {
                Console.WriteLine(fansss.quchu());
            }
            Console.ReadLine();
        }
    }

 

泛型除了可以定义泛型类之外,还可以定义泛型方法,泛型结构体,泛型委托,泛型接口等。


泛型方法实例:


/// <summary>
        /// 泛型方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a"></param>
        /// <param name="b"></param>
        public static void fasss<T>(ref T a, ref T b)
        {
            T t;
            t = a;
            a = b;
            b = t;
        }


调用


static void Main(string[] args)
        {
            // 调用泛型方法
            int x = 90, y = 90;
            fasss<int>(ref x,ref y );
            Console.WriteLine("x={0},Y = {1}", x, y);  // 输出:x=90,Y = 90
            Console.ReadLine();
        }


2:泛型的集合类


QQ图片20220426165111.jpg


QQ图片20220426165113.png


QQ图片20220426165116.png


// 数据类型  先进后出
            List <string> student = new List<string>(20);
            student.Add("flower");
            student.Add("qwe");
            student.Add("ccc");
            student.Add("ddd");
            student.Add("sss");
            //student.Add(123);   /// 这样写报错
            foreach (string item in student)
            {
                Console.WriteLine(item);
            }
            // 数据类型 先进先出
            Stack<char> str = new Stack<char>();
            str.Push('a');
            str.Push('b');
            str.Push('c');
            str.Push('d');
            str.Push('e');
            foreach (char item in str)
            {
                Console.WriteLine(item);
            }
            // 数据类型  queue 先进先出
            Queue<bool> b1 = new Queue<bool>();
            b1.Enqueue(true);
            b1.Enqueue(true);
            b1.Enqueue(false);
            foreach (bool item in b1)
            {
                Console.WriteLine(item);
            }
            // 对象
            Queue<object> b3 = new Queue<object>();
            b3.Enqueue(3.21f);
            b3.Enqueue("sdkjfhhsdfj");
            foreach (object item in b3)
            {
                Console.WriteLine(item);
            }



目录
相关文章
|
6月前
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
存储 算法 安全
C#三十二 泛型的理解和使用
C#三十二 泛型的理解和使用
36 0
|
2月前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
73 11
|
3月前
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
63 4
|
3月前
|
C#
C# 面向对象编程(三)——接口/枚举类型/泛型
C# 面向对象编程(三)——接口/枚举类型/泛型
31 0
|
6月前
|
存储 安全 Java
34.C#:listT泛型集合
34.C#:listT泛型集合
59 1
|
6月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
346 2
|
6月前
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。
|
6月前
|
存储 Java 编译器
【从Java转C#】第五章:泛型
【从Java转C#】第五章:泛型
|
机器学习/深度学习 存储 缓存
一文带你搞懂C#泛型
泛型是.net 2.0中提供的新特性,是框架的一种升级,用于处理用一个事物来代替多种不同需求的情况。下面我们就一块来看一下具体的讲解吧。