C#泛型概念的简介与泛型的使用

C#泛型概念的简介与泛型的使用

什么是泛型?

泛型是C#中一种抽象的数据类型,它可以用于创建具有不同类型参数的可重用代码。在传统的数据类型中,只能通过指定数据类型来定义数据和方法。而泛型则可以在代码中定义一个泛型类型或方法,然后在创建实例时将其参数化,从而实现代码的通用性。

泛型类型定义非常灵活,可以定义任何类型的参数,例如引用类型、值类型或结构体等,还可以使用约束来限制允许的类型参数。对于一些需要处理多种类型的场景,使用泛型可以减少代码的复杂性,提高代码的可重用性。

基本使用方法

泛型在C#中的使用非常简单,只需要在类型名后添加<T>即可。

示例1:定义一个通用的栈(Stack)类型。

public class Stack<T>
{
    private List<T> list = new List<T>();

    public void Push(T item)
    {
        list.Add(item);
    }

    public T Pop()
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("栈已空");
        }
        T item = list[list.Count - 1];
        list.RemoveAt(list.Count - 1);
        return item;
    }
}

上述代码定义了一个泛型类型Stack<T>,栈中每个元素的类型由类型参数T决定。Stack类中包括了入栈和出栈两个操作,每个操作都是针对任意类型的。

示例2:使用Stack类型。

Stack<int> intStack = new Stack<int>();
intStack.Push(1);
intStack.Push(2);
intStack.Push(3);
Console.WriteLine(intStack.Pop()); // 输出3
Console.WriteLine(intStack.Pop()); // 输出2
Console.WriteLine(intStack.Pop()); // 输出1

上述代码中,使用Stack<int>创建了一个int类型的栈,然后向栈中添加3个元素123,最后依次弹出三个元素并输出。

泛型类型约束

当我们定义了一个泛型类型或方法时,有时需要限制参数类型范围,从而增强类型安全性或避免错误的输入。这时就可以使用泛型类型约束,对类型参数进行限制。常见的类型约束有以下几种:

  1. where T : class (T必须是引用类型)
  2. where T : struct (T必须是值类型)
  3. where T : new() (T必须有无参构造函数)
  4. where T : IFoo (T必须实现接口IFoo)

示例3:使用泛型类型约束。

public class MyStack<T> where T : class
{
    private List<T> list = new List<T>();

    public void Push(T item)
    {
        if (item == null)
        {
            throw new ArgumentNullException(nameof(item), "元素不能为空");
        }
        list.Add(item);
    }

    public T Pop()
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("栈已空");
        }
        T item = list[list.Count - 1];
        list.RemoveAt(list.Count - 1);
        return item;
    }
}

MyStack<string> myStack = new MyStack<string>();
myStack.Push("hello");
myStack.Push(null); // 抛出ArgumentNullException异常
Console.WriteLine(myStack.Pop()); // 输出hello

上述代码中,定义了一个泛型类型MyStack<T>,并使用where T : class的约束限制类型参数必须是引用类型,这样就避免了传入值类型时的错误。同时在Push方法中增加了对空值的判断,避免添加空元素。

结语

泛型是C#中非常强大的一个特性,使用泛型可以更加高效和安全地编写代码。在实际开发中,我们需要根据不同的场景合理使用泛型,从而减少代码的冗余和提高代码的可重用性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#泛型概念的简介与泛型的使用 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • 深入理解C#之接口

    当我们需要定义一个规范或者一个协议,描述某个对象应该具有哪些能力时,可以使用接口。接口可以看做是一种特殊的抽象类,它没有任何实现,只用于描述对象应该有哪些能力。具体来说,一个接口是由一组抽象方法、属性、索引器和事件组成的。可以将接口看做一种契约,实现接口的类型需要履行这个契约,提供指定的能力。 以下是实现接口的基本语法: [public | internal…

    C# 2023年6月7日
    00
  • C#操作字符串方法总结实例代码

    C#是一种强类型语言,字符串字符串是程序开发中必不可少的部分。在C#中,有许多操作字符串的方法可以使用。下面将讲解一些常用的字符串处理方法及其实例代码。 字符串对象的基本操作 长度 可以使用字符串对象的Length属性获取字符串的长度,例如: string str = "Hello World"; Console.WriteLine(st…

    C# 2023年5月31日
    00
  • C#调用动态unlha32.dll解压Lha后缀的打包文件分享

    要讲解“C#调用动态unlha32.dll解压Lha后缀的打包文件分享”的完整攻略,我们需要掌握以下知识点: unlha32.dll是什么 如何在C#中调用unlha32.dll 如何解压Lha后缀的打包文件 接下来,我们将分别讲解每个知识点,并结合示例说明。 1. unlha32.dll是什么 unlha32.dll是一个解压缩工具,可以解压多种类型的压缩…

    C# 2023年6月8日
    00
  • WEB API .NET环境发布

    1、创建WEBAPI 1 using Dapper; 2 using MesErp.Models; 3 using Microsoft.AspNetCore.Mvc; 4 using Microsoft.Extensions.Configuration; 5 using Newtonsoft.Json; 6 using System; 7 using Sys…

    C# 2023年5月9日
    00
  • C#多线程用法详解

    C#多线程用法详解 C#支持多线程编程,可以充分利用多核CPU的性能,提高程序的性能和响应速度。本文将详细讲解C#多线程的用法。 线程的创建 C#创建线程有两种方式,一种是使用Thread类,另一种是使用ThreadPool类。 使用Thread类创建线程 使用Thread类创建线程可以获得更多的控制权,可以更灵活地控制线程的行为。 Thread threa…

    C# 2023年5月15日
    00
  • C#使用Oracle.ManagedDataAccess.dll组件连接Oracle数据库

    C#使用Oracle.ManagedDataAccess.dll组件连接Oracle数据库 准备工作 安装Oracle数据库 下载Oracle.ManagedDataAccess.dll组件 可以在Oracle官网下载,或者在NuGet包管理器中搜索“Oracle.ManagedDataAccess”进行下载 步骤说明 在项目中添加Oracle.Manage…

    C# 2023年6月2日
    00
  • C# File.ReadAllText(string path):读取指定文件的所有文本内容

    C#的File.ReadAllText(string path)方法用于读取指定文件的所有文本内容,并以字符串形式返回。该方法适用于读取文本文件中的数据,如果尝试读取非文本文件(如二进制图像),则会导致方法执行失败。 方法参数 File.ReadAllText() 方法需要传入表示文件路径的字符串类型参数,指定要读取的文件。 返回值 File.ReadAll…

    C# 2023年4月19日
    00
  • C# 制作PictureBox圆形头像框并从数据库中读取头像

    这里是制作C# Windows Form应用程序中PictureBox圆形头像框并从数据库中读取头像的完整攻略。在这个攻略中,你将学习如何: 在Windows Form中创建一个PictureBox控件。 将PictureBox控件转换为圆形形状。 从数据库中读取图像数据,并将其显示在PictureBox控件中。 封装代码使其可以在多个窗体和应用程序中重复使…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部