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

yizhihongxing

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#程序员应该养成的程序性能优化写法

    下面我将为您详细讲解C#程序员应该养成的程序性能优化写法,包含一个完整的攻略以及两条示例说明。 攻略 1. 明确性能优化的目标 在进行性能优化之前,需要先明确性能优化的目标,以及需要优化的具体内容,例如响应时间、内存占用等。只有明确了目标,程序员才能有针对性地进行优化。 2. 使用高效的数据结构 对于大规模数据处理的情况,使用高效的数据结构可以极大地提高程序…

    C# 2023年6月1日
    00
  • C#实现IDisposable接口释放非托管资源

    下面是“C#实现IDisposable接口释放非托管资源”的完整攻略: 什么是IDisposable接口 IDisposable接口是一个管理非托管资源的机制,它允许程序员自行释放非托管资源。IDisposable接口包含Dispose()方法,该方法释放由实现对象持有的所有资源。 下面是实现IDisposable接口的步骤 实现IDisposable接口并…

    C# 2023年6月7日
    00
  • C# WinForm应用程序降低系统内存占用方法总结

    C# WinForm应用程序降低系统内存占用方法总结 简介 C# WinForm应用程序在运行过程中会消耗较多的系统内存,如果内存占用过高则会影响系统的反应速度,导致用户体验不佳。本篇文章将介绍降低C# WinForm应用程序内存占用的方法。 方法 1. 图片资源优化 图片资源占用大量内存,影响程序性能。对于C# WinForm应用程序,图片资源可以通过以下…

    C# 2023年6月3日
    00
  • asp.net中Fine Uploader文件上传组件使用介绍

    下面是关于“asp.net中Fine Uploader文件上传组件使用介绍”的完整攻略。 Fine Uploader是什么? Fine Uploader是一个基于JavaScript的文件上传库,它支持大文件上传、断点续传、浏览器兼容性好等特性。Fine Uploader可以通过原生的XHR2(XMLHttpRequest Level 2)实现文件上传,在服…

    C# 2023年6月1日
    00
  • C#中的随机数函数Random()

    C#中的Random()函数可以用来生成随机数,其基本用法如下: Random random = new Random(); // 创建一个新的Random对象 int randomNumber = random.Next(); // 生成一个随机的32位有符号整数 注意,这里使用了默认的构造函数来创建Random对象,如果需要指定随机数生成器的种子值,可以…

    C# 2023年6月8日
    00
  • C# File.GetAttributes(string path):获取指定文件或目录的属性

    File.GetAttributes(string path) 方法的作用是获取指定路径上的文件或目录的属性。 其使用方法的完整攻略如下: 1. 导入命名空间 在使用该方法之前,需要先导入 System.IO 命名空间,因为此方法是定义在 System.IO.File 类中的静态方法。 using System.IO; 2. 参数说明 该方法的参数 path…

    C# 2023年4月19日
    00
  • C# WPF如何反射加载Geometry几何图形数据图标

    请看下面的详细说明。 C# WPF 如何反射加载 Geometry 几何图形数据图标 什么是Geometry? Geometry 是Windows中WPF 支持的描述2D和3D 几何图形对象的一个抽象类,我们在WPF开发中可以通过Geometry 来制定元素的形状,并以此来展示出不同的图标。 如何实现反射加载Geometry 几何图形数据图标? 反射加载Ge…

    C# 2023年6月6日
    00
  • .net6 在中标麒麟下的安装

    尝试了下.net6在信创环境下的安装和部署 信创服务器,CPU:ARM64,操作系统:中标麒麟 v10,网络环境:政务网(无法连接外网) 1、下载 .net 6 SDK 6.0.408 Arm64二进制文件。https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 2、在服务器/home目录下创建两个新目录…

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