C#——系统学习(集合与泛型)

C#集合框架与泛型的深入解析

C#集合框架是.NET框架的核心组件之一,为开发者提供了一套强大的工具用于管理和组织各种数据结构。其中,泛型作为一种关键特性,显著提升了代码的灵活性、可读性和安全性,使得开发者能够在不牺牲类型安全的前提下,创建高度可复用的数据结构。

1. 泛型概念与用途

泛型是一种在C#中定义通用类、接口、方法和委托的技术,允许我们使用类型参数化的方式来表达这些实体。在尖括号<>中声明的类型参数(如T、K、V等)在编译阶段会被具体的类型替代,从而确保类型安全。

  • List<T> 是一种动态数组,它能够存储任何类型的对象,通过类型参数T来决定数组元素的类型。
  • Dictionary<TKey, TValue> 是键值对集合,键(TKey)和值(TValue)都可以是任意类型,确保了键的唯一性和数据的快速查找。
  • HashSet<T> 是不允许重复元素的集合,适用于去重和快速查找等场景。
2. 创建和使用泛型类

以MyGenericClass<T>为例,这是一个使用泛型的类,它可以存储任意类型的对象。在此类中,我们定义了一个私有的泛型列表items来存储元素,并提供了AddItem和GetFirstItem两个方法。

实例演示

cs 复制代码
public class MyGenericClass<T>
{
    private List<T> items = new List<T>();

    public void AddItem(T item)
    {
        items.Add(item);
    }

    public T GetFirstItem()
    {
        if (items.Count > 0)
            return items[0];
        else
            throw new InvalidOperationException("集合为空");
    }
}

// 实际使用时,我们可以创建一个存储字符串的实例
MyGenericClass<string> stringCollection = new MyGenericClass<string>();
stringCollection.AddItem("Hello");
string firstString = stringCollection.GetFirstItem(); // 返回 "Hello"
3. 创建和使用泛型方法

泛型方法允许我们在方法级别定义类型参数,使其独立于类的类型参数,适用于那些与类无关的通用功能。

cs 复制代码
public static T Max<T>(params T[] values) where T : IComparable<T>
{
    T maxVal = values[0];
    foreach (T value in values)
    {
        if (value.CompareTo(maxVal) > 0)
            maxVal = value;
    }
   return maxVal;
}

// 使用该方法,我们可以找到一组整数或浮点数中的最大值
int maxInt = Max<int>(10, 20, 30); // 返回 30
double maxDouble = Max<double>(1.5, 2.0, 3.1); // 返回 3.1
4. 泛型委托

泛型委托允许我们定义带类型参数的委托签名,使得委托也能接受和返回泛型类型的参数。

cs 复制代码
public delegate TResult MyGenericDelegate<T, TResult>(T arg);

public static TResult ProcessWithDelegate<T, TResult>(T input, MyGenericDelegate<T, TResult> processor)
{
    return processor(input);
}

// 定义一个泛型方法作为委托的目标方法
public static int SquareNumber(int num)
{
    return num * num;
}

// 使用这个泛型委托处理方法
var result = ProcessWithDelegate<int, int>(5, SquareNumber); // 结果为 25

总结起来,C#集合框架结合泛型的使用,极大程度地提高了代码的可复用性和效率,同时保持了严格的类型安全约束,降低了潜在的运行时错误风险,成为了现代编程实践中不可或缺的一部分。通过理解和掌握泛型的应用,开发者可以构建更加健壮、灵活且易于维护的软件系统。

相关推荐
小羊没烦恼!6 小时前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#
UIU1149 小时前
头文件可以防什么错?运用头文件做声明
c++·学习·c#
鑫 源15 小时前
C#源码开源, 获取macOS 电池数据,包括iOS (xamarin开发)
c#·.net·xamarin
爱吃奥利奥_wen1 天前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
wflynn2 天前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github·nvidia·amd·directx12
疯狂的维修2 天前
关于用C#写电机起保停控制
开发语言·c#
用户788477316342 天前
门店核销闭环:小程序扫码 + .NET 幂等接口 + WPF 看板,一天能跑通
微信小程序·c#
samble2 天前
从零搭建灌装监控系统(十三):报警系统设计,生命周期与通知
c#·wpf·mvvm·modbus·工业控制
miofly3 天前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github
周杰伦fans3 天前
8GB显存下模型量化实战指南
人工智能·后端·c#