泛型与集合

泛型与集合

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

下一节预告:委托与事件


相关推荐
SunnyDays101116 小时前
如何使用 C# 创建、修改和删除 Excel 中的 VBA 宏(无需Microsoft Excel)
c#·excel·vba宏·创建vba宏·修改vba宏·删除vba宏
唐青枫17 小时前
C#.NET gRPC 深入解析:Proto 定义、流式调用与服务间通信取舍
c#·.net
水深00安东尼18 小时前
C# 鼠标点击小游戏
c#
波波00718 小时前
每日一题:C#中using的三种用法
开发语言·c#
游乐码18 小时前
c#万物之父
开发语言·c#
xiaoshuaishuai818 小时前
C# Chrome安全机制解析
开发语言·visualstudio·c#
游乐码18 小时前
c#字符串函数
开发语言·c#
asdzx6719 小时前
C#:通过模板快速生成 Word 文档
开发语言·c#·word
游乐码19 小时前
c#StringBuilder
开发语言·c#
CSharp精选营19 小时前
都是微软亲儿子,WPF凭啥干不掉WinForm?这3个场景说明白了
c#·wpf·跨平台·winform