泛型与集合

泛型与集合

学习时间 :10分钟
难度级别 :进阶
适用对象:有C#基础的开发者


一、学习目标

  1. 理解泛型的概念和优势
  2. 掌握常用泛型集合
  3. 学会自定义泛型类和方法
  4. 了解泛型约束的使用

二、核心内容

2.1 泛型基础

为什么需要泛型?

csharp 复制代码
// 非泛型方式 - 需要装箱拆箱
ArrayList list = new ArrayList();
list.Add(1);        // 装箱
int num = (int)list[0];  // 拆箱

// 泛型方式 - 类型安全,无装箱
List<int> list = new List<int>();
list.Add(1);
int num = list[0];  // 无需转换

2.2 常用泛型集合

List 列表:

csharp 复制代码
List<string> names = new List<string>();
names.Add("张三");
names.AddRange(new[] { "李四", "王五" });

string first = names[0];
names.Remove("张三");
bool exists = names.Contains("李四");

Dictionary<TKey, TValue> 字典:

csharp 复制代码
Dictionary<string, int> scores = new Dictionary<string, int>();
scores.Add("张三", 90);
scores["李四"] = 85;

if (scores.TryGetValue("张三", out int score))
{
    Console.WriteLine($"分数:{score}");
}

Queue 队列:

csharp 复制代码
Queue<string> queue = new Queue<string>();
queue.Enqueue("任务1");
queue.Enqueue("任务2");

string task = queue.Dequeue();  // 取出并移除
string peek = queue.Peek();     // 查看不移除

Stack 栈:

csharp 复制代码
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);

int top = stack.Pop();   // 弹出栈顶
int peek = stack.Peek(); // 查看栈顶

2.3 自定义泛型类

csharp 复制代码
public class Result<T>
{
    public bool Success { get; set; }
    public string Message { get; set; }
    public T Data { get; set; }

    public static Result<T> Ok(T data)
    {
        return new Result<T> { Success = true, Data = data };
    }

    public static Result<T> Fail(string message)
    {
        return new Result<T> { Success = false, Message = message };
    }
}

// 使用
Result<int> result = Result<int>.Ok(100);

2.4 泛型方法

csharp 复制代码
public T Max<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) > 0 ? a : b;
}

// 使用
int max = Max(10, 20);
string maxStr = Max("abc", "xyz");

2.5 泛型约束

约束 说明
where T : class T 必须是引用类型
where T : struct T 必须是值类型
where T : new() T 必须有无参构造函数
where T : BaseClass T 必须继承自 BaseClass
where T : Interface T 必须实现 Interface
csharp 复制代码
public class Repository<T> where T : class, new()
{
    public T Create()
    {
        return new T();
    }
}

三、实践练习

练习1:使用字典

创建一个设备字典,存储设备名称和IP地址。

练习2:自定义泛型类

创建一个通用的响应结果类。


四、学习结果检验

完成本节学习后,你应该能够:

  • 使用 List 和 Dictionary
  • 定义泛型类和方法
  • 理解泛型约束的作用
  • 选择合适的集合类型

五、本节总结

复制代码
┌─────────────────────────────────────────┐
│           本节要点回顾                    │
├─────────────────────────────────────────┤
│ 1. 泛型提供类型安全和性能优势             │
│ 2. List<T> 是最常用的集合                │
│ 3. Dictionary<K,V> 用于键值对存储        │
│ 4. 泛型约束限制类型参数范围               │
└─────────────────────────────────────────┘

下一节预告:委托与事件


相关推荐
samble7 小时前
从零搭建灌装监控系统(十七):LiveCharts 实时温度曲线
c#·wpf·mvvm·modbus·工业控制
淡海水16 小时前
02-07-原理篇-GC暂停时间的本质
开发语言·unity·c#·gc·暂停时间
小羊没烦恼!17 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Behavior19 小时前
Unity 7.0 Alpha 拆解:编辑器干掉 Mono 换 CoreCLR
c#·unity3d·游戏开发
淡海水19 小时前
02-06-原理篇-增量式GC与并发GC
算法·unity·c#·并发·gc·增量
Vertira20 小时前
C# 函数封装成 DLL,
开发语言·c#
浅尝辄止;21 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
kimloner1 天前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
阿松爱学习1 天前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
半亩码田1 天前
C#转Python第4.8篇:正则表达式:Python re 模块 vs C# System.Text.RegularExpressions
python·正则表达式·c#