泛型与集合

泛型与集合

学习时间 :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. 泛型约束限制类型参数范围               │
└─────────────────────────────────────────┘

下一节预告:委托与事件


相关推荐
czhc11400756633 小时前
C# 428 线程、异步
开发语言·c#
唐青枫5 小时前
C#.NET ThreadLocal 深入解析:线程独享数据、性能收益与实战边界
c#·.net
烟话611 小时前
实际内存条,虚拟内存,堆,栈
c#
归途醉染12 小时前
Swifter.Json
c#·json·swifter.json
伽蓝_游戏12 小时前
第一章:解构游戏资源
游戏·unity·性能优化·c#·游戏引擎·游戏程序·assetbundle
星辰徐哥13 小时前
Unity C#入门:Visual Studio与Unity的关联配置
unity·c#·visual studio
星辰_mya14 小时前
分布式系统里的“快递中转站”——消息队列(MQ)
c#·linq
qq_4312807015 小时前
工作经验总结:半导体上位机软件开发与互联网开发的不同
c#·.net
Metaphor69216 小时前
使用 Python 查找并替换 Word 文档中的文本
python·c#·word
chen_22716 小时前
kanzi插件之节点树可视化
c#·kanzi