泛型与集合

泛型与集合

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

下一节预告:委托与事件


相关推荐
人工智能AI技术1 天前
两会“人工智能+“风口已至:C#开发者用Semantic Kernel搭建企业级Agent的3个实战套路
人工智能·c#
进击的编程阿伟1 天前
C#开发工程师-面经
面试·c#
缺点内向1 天前
C#实战:使用Spire.XLS for .NET 将Excel转换为SVG图片
c#·自动化·.net·excel
小曹要微笑1 天前
C#的运算符重载
开发语言·c#·运算符重载·c#运算符重载
我是唐青枫1 天前
C#.NET Channel 深入解析:高性能异步生产者消费者模型实战
开发语言·c#·.net
Crazy Struggle1 天前
C# + ViewFaceCore 快速实现高精度人脸识别
c#·人脸识别·.net·开源项目
小曹要微笑1 天前
委托(Delegate)在C#中的概念与应用
前端·javascript·c#
人工智能AI技术1 天前
Oracle裁员3万人的警钟:C#程序员如何构建AI工具链反杀,从“被替代“到“驾驭AI“
人工智能·c#
小曹要微笑1 天前
事件(Event)在C#中的概念与应用
c#·委托·事件·c#事件
xgstb1 天前
如何使用C#与SQL Server数据库进行交互
数据库·c#·交互