C#泛型集合 using System.Collections.Generic

本文介绍了C#中泛型集合的使用,强调了泛型集合提供的类型安全性和性能优势,以及如何通过System.Collections.Generic命名空间的List<T>创建泛型集合。文章还解释了泛型的概念,以及其作为模板的特性,最后展示了如何创建和操作泛型集合,包括排序和搜索功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱。
    很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:

非泛型集合类泛型集合类
ArrayListList
HashTableDIctionary
QueueQueue
StackStack
SortedListSortedList

为什么要用泛型集合?
    在C# 2.0之前,主要可以通过两种方式实现集合:
    a.使用ArrayList
    直接将对象放入ArrayList,操作直观,但由于集合中的项是Object类型,因此每次使用都必须进行繁琐的类型转换。
    b.使用自定义集合类
    比较常见的做法是从CollectionBase抽象类继承一个自定义类,通过对IList对象进行封装实现强类型集合。这种方式要求为每种集合类型写一个相应的自定义类,工作量较大。泛型集合的出现较好的解决了上述问题,只需一行代码便能创建指定类型的集合。

什么是泛型?
    泛型是C# 2.0中的新增元素(C++中称为模板),主要用于解决一系列类似的问题。这种机制允许将类名作为参数传递给泛型类型,并生成相应的对象。将泛型(包括类、接口、方法、委托等)看作模板可能更好理解,模板中的变体部分将被作为参数传进来的类名称所代替,从而得到一个新的类型定义。

怎样创建泛型集合?
    主要利用System.Collections.Generic命名空间下面的List<T>泛型类创建集合,语法如下:

List<T> ListOfT = new List<T>();

其中的"T"就是所要使用的类型,既可以是简单类型,如string、int,也可以是用户自定义类型。下面看一个具体例子。

定义Person类如下:

class Person
{
    
private string _name; //姓名
    private int _age; //年龄

    
//创建Person对象
    public Person(string Name, int Age)
    
{
        
this._name= Name;
        
this._age = Age;
    }


    
//姓名
    public string Name
    
{
        
get return _name; }
    }


    
//年龄
    public int Age
    
{
        
get return _age; }
    }

}


//创建Person对象
Person p1 = new Person("张三"30);
Person p2 
= new Person("李四"20);
Person p3 
= new Person("王五"50);

//创建类型为Person的对象集合
List<Person> persons = new List<Person>();

//将Person对象放入集合
persons.Add(p1);
persons.Add(p2);
persons.Add(p3);

//输出第2个人的姓名
Console.Write(persons[1].Name);

   可以看到,泛型集合大大简化了集合的实现代码,通过它,可以轻松创建指定类型的集合。非但如此,泛型集合还提供了更加强大的功能,下面看看其中的排序及搜索。

 

摘录自<http://www.cnblogs.com/kenny-jiang/archive/2007/11/23/970033.html>

<think>我们正在讨论C#中`using System.Collections.Generic;`的作用。根据用户提供的引用,我们可以总结如下: 引用[1]提到:`System.Collections.Generic`命名空间包含集合,而`System`命名空间包含基本类,`System.Text`包含字符串处理和编码相关类。 引用[2]说明:我们可以使用`System.Collections.Generic`命名空间下的`List<T>`类来创建集合,语法为`List<T> ListOfT = new List<T>();`。 引用[3]举例:在Unity中,如果不使用`using System.Collections.Generic;`,那么在代码中使用`List<T>`等集合会导致编译错误。 引用[4]解释了非集合的继承关系,但我们的重点是集合。 因此,`using System.Collections.Generic;`的主要作用是引入C#中的集合,如`List<T>`, `Dictionary<TKey, TValue>`, `HashSet<T>`等。这些类在`System.Collections.Generic`命名空间中定义。 下面详细说明: 1. **为什么需要集合?** - 在C# 2.0之前,集合(如`ArrayList`)使用`object`来存储元素,这导致: - 值类需要装箱和拆箱,性能损失。 - 类不安全,因为任何类都可以放入集合,取出时需要强制类转换,可能引发运行时异常。 - 集合通过类参数解决了上述问题: - 编译时类检查,避免运行时类错误。 - 无需装箱拆箱,提高性能。 - 代码更简洁(无需强制转换)。 2. **常用集合**(在`System.Collections.Generic`命名空间中): - `List<T>`:动态数组,类似`ArrayList`,但类安全。 - `Dictionary<TKey, TValue>`:键值对集合,类似`Hashtable`,但类安全。 - `Queue<T>`:先进先出队列。 - `Stack<T>`:后进先出栈。 - `LinkedList<T>`:双向链表。 - `HashSet<T>`:不包含重复元素的集合。 3. **`using System.Collections.Generic;`的作用**: - 允许在代码中直接使用这些集合,而无需每次都写完全限定名(如`System.Collections.Generic.List<T>`)。 - 简化代码,提高可读性。 4. **示例对比**: - 不使用`using`: ```csharp System.Collections.Generic.List<int> numbers = new System.Collections.Generic.List<int>(); ``` - 使用`using`: ```csharp using System.Collections.Generic; ... List<int> numbers = new List<int>(); ``` 5. **在控制台应用程序中默认包含的原因**: - 集合C#中最常用的数据结构之一,几乎每个程序都会使用到(如`List<T>`)。因此,在创建控制台应用程序时,Visual Studio默认添加了这个`using`指令,以方便开发者。 6. **与`System.Collections`(非集合)的区别**: - `System.Collections`包含非集合(如`ArrayList`, `Hashtable`),这些集合存储`object`类元素。 - `System.Collections.Generic`包含集合,提供类安全和性能优势。 7. **代码示例**: ```csharp using System; using System.Collections.Generic; class Program { static void Main() { // 使用List<T> List<string> names = new List<string>(); names.Add("Alice"); names.Add("Bob"); // 使用Dictionary<TKey, TValue> Dictionary<int, string> employees = new Dictionary<int, string>(); employees.Add(1, "Alice"); employees.Add(2, "Bob"); // 遍历List foreach (string name in names) { Console.WriteLine(name); } } } ``` 总结:`using System.Collections.Generic;`指令允许我们在代码中直接使用集合,这些类提供了类安全和性能优势,是C#编程中不可或缺的一部分[^1][^2][^3]。 §§相关问题§§ 1. C#集合与非集合的主要区别是什么? 2. 如何在C#中使用`Dictionary<TKey, TValue>`存储和检索数据? 3. 为什么集合在性能上优于非集合?</think># C#中`using System.Collections.Generic`的作用详解 `using System.Collections.Generic;`是C#中用于引入集合相关类的命名空间指令,它在现代C#开发中扮演着关键角色。 ## 核心作用 ### 1. 提供类安全的集合 - **非集合的问题**:传统集合(如`ArrayList`)存储`object`类元素,需要频繁装箱拆箱,存在类安全风险 - **集合的优势**:`System.Collections.Generic`提供了类安全的集合类,如: - `List<T>`:动态数组 - `Dictionary<TKey, TValue>`:键值对集合 - `Queue<T>`:先进先出队列 - `Stack<T>`:后进先出栈 - `HashSet<T>`:不重复元素集合 ### 2. 避免装箱拆箱开销 集合直接操作具体类,无需将值类转换为`object`: ```csharp // 非集合(需要装箱拆箱) ArrayList list = new ArrayList(); list.Add(42); // 装箱 int value = (int)list[0]; // 拆箱 // 集合(无开销) List<int> genericList = new List<int>(); genericList.Add(42); // 直接存储int int val = genericList[0]; // 直接访问 ``` ### 3. 增强代码可读性和安全性 - 编译时类检查:避免运行时类转换错误 - 代码自文档化:集合直接表明元素类 ## 关键类解析 | 类 | 描述 | 示例 | |------|------|------| | `List<T>` | 动态大小数组 | `List<string> names = new List<string>();` | | `Dictionary<TKey, TValue>` | 键值对集合 | `Dictionary<int, string> employees = new Dictionary<int, string>();` | | `Queue<T>` | 先进先出队列 | `Queue<Process> processes = new Queue<Process>();` | | `Stack<T>` | 后进先出栈 | `Stack<Command> undoStack = new Stack<Command>();` | | `HashSet<T>` | 唯一元素集合 | `HashSet<string> uniqueIds = new HashSet<string>();` | ## 使用场景示例 ### 创建和使用集合 ```csharp using System.Collections.Generic; class Program { static void Main() { // 创建字符串列表 List<string> cities = new List<string> { "New York", "London", "Tokyo" }; // 添加元素 cities.Add("Paris"); // 安全访问(编译时类检查) string firstCity = cities[0]; // 创建字典 Dictionary<int, string> products = new Dictionary<int, string> { {101, "Laptop"}, {102, "Smartphone"} }; // 安全检索 string productName = products[102]; // "Smartphone" } } ``` ## 与传统集合的对比 | 特性 | `System.Collections` (非) | `System.Collections.Generic` () | |------|-------------------------------|-------------------------------------| | 类安全 | ❌ 需要强制转换 | ✅ 编译时类检查 | | 值类处理 | ❌ 需要装箱拆箱 | ✅ 直接操作值类 | | 性能 | ⚠️ 较低(装箱拆箱开销) | ✅ 高效 | | 代码清晰度 | ⚠️ 类信息不明确 | ✅ 类信息明确 | ## 为什么默认包含在控制台应用中? 1. **集合使用频率高**:几乎所有程序都需要集合操作 2. **性能优势**:比传统集合更高效 3. **现代编程标准**:C#的核心特性之一 4. **减少样板代码**:避免重复编写类转换逻辑 ## 实际应用建议 1. **优先使用集合**:除非需要兼容旧代码 2. **明确指定类参数**:避免使用`var`隐藏集合信息 3. **利用初始化语法**:简化集合创建和初始化 4. **结合LINQ使用**:实现强大的数据查询功能 ```csharp List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = numbers.Where(n => n % 2 == 0).ToList(); ``` 5. **注意空值处理**:使用`Nullable<T>`或`default`关键字处理可能为null的值 ## 常见问题解答 **Q: 什么时候需要手动添加这个using指令?** A: 当使用集合时,如果Visual Studio未自动添加,或在新创建的类文件中使用这些集合。 **Q: 它会影响程序性能吗?** A: 不会。`using`指令只在编译时起作用,帮助编译器解析类名称,不影响运行时性能。 **Q: 能否完全不使用这个命名空间?** A: 技术上可以,但需要使用完全限定名(如`System.Collections.Generic.List<T>`),这会显著降低代码可读性[^1][^2]。 `using System.Collections.Generic;`是现代C#开发的基础指令,它提供的集合使代码更安全、高效和易维护,是每个C#开发者必须掌握的核心概念[^1][^2][^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值