C#学习笔记-泛型(读自C#从入门到精通 第2版)

ArrayList类缺陷

在ArrayList类中,所有的元素类型都为object类型。.NET中的object类是所有类的基类,因此ArrayList类可以接受任何类型的值作为它的元素。使用ArrayList中的元素时,必须强制进行类型转换,将元素转换为合适的类型。如果元素是值类型的值,会引起CLR进行拆箱和装箱的操作,造成一定的性能开销。而且,还必须小心处理类型转换中可能出现的错误。

泛型

泛型是一种类型占位符,或称为类型参数。我们知道在一个方法中,一个变量的值可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许程序员在代码中将变量或参数的类型先用“类型占位符”来代替,在调用的时候再指定这个类型参数是什么。

在System.Collections.Generic命名空间中包含了多个泛型集合类,List和Dictionary<K,V>是其中常用的两种泛型集合类,在实际应用中有很重要的作用。

List<T>类

List类是ArrayList相对应的泛型集合,用法与ArrayList类似,有更好的类型安全性,无需拆、装箱。

// 语法
List<T> 集合名 = new List<T>();

在泛型定义中,泛型类型参数“”是必须指定的,其中的“T”是定义泛型类时的占位符,其并不是一种类型,仅代表某种可能的类型。在定义时“T”会被使用的类型代替。泛型集合List中只能有一个参数类型,“”中的“T”可以对集合中的元素类型进行约束。

注意:泛型集合必须实例化,实例化时和普通类实例化时相同,必须在后面加上“()”。

List的添加、删除和检索等方法和ArrayList相似,但是不需要像ArrayList那样装箱和拆箱。
用法与ArrayList基本相同,ArrayList示例可查看链接:ArrayList类相关方法

// List类部分方法示例
List<int> list1 = new List<int>();
list1.Add(1);
list1.Add(2);
list1.Insert(2, 3);
int[] strs1 = { 5, 6 };
list1.AddRange(strs1);
int[] strs2 = { 4 };
list1.InsertRange(3, strs2);
Console.WriteLine("list1的容量为{0},数目为{1}", list1.Capacity, list1.Count); // 8 6
foreach (var i in list1)
    Console.Write(i + " "); // 1 2 3 4 5 6
Console.WriteLine();

list1.Remove(1);
foreach (var i in list1)
    Console.Write(i + " "); // 2 3 4 5 6
Console.WriteLine();

list1.RemoveAt(3);
foreach (var i in list1)
    Console.Write(i + " "); // 2 3 4 6
Console.WriteLine();

list1.RemoveRange(1, 2); // list1.RemoveRange(index, count)
foreach (var i in list1)
    Console.Write(i + " "); // 2 6
Console.WriteLine();

Console.ReadKey();
Dictionary<K,V>类

在System.Collections.Generic命名空间中,与HashTable相对应的泛型集合是Dictionary<K,V>,其存储数据的方式和哈希表相似,通过键/值来保存元素,并具有泛型的全部特征,编译时检查类型约束,读取时无需进行类型转换。

// 语法
Dictionary<K, V> 泛型集合名 = new Dicitionary<K, V>();

其中“K”为占位符,具体定义时用存储键“Key”的数据类型代替,“V”同样也是占位符,用元素的值“Value”的数据类型代替,这样在定义该集合时,就声明了存储元素的键和值的数据类型,保证了类型的安全性。

Dictionary用法与Hashtable基本相同,Hashtable示例可查看链接:Hashtable类相关方法

// 部分示例
Dictionary<string, string> openWith = new Dictionary<string, string>();
openWith.Add("txt", "test.exe");
openWith.Add("bmp", "paint.exe");
foreach(var i in openWith)
{
    Console.WriteLine(i.Key + ": " + i.Value);
}
/**
 * txt: test.exe
 * bmp: paint.exe
 */
Console.ReadKey();
泛型优点
  • 性能高。使用泛型不需要进行类型转换,可以避免装箱和拆箱操作,能提高性能
  • 类型安全。泛型集合对其存储对象进行了类型约束,不是定义时声明的类型,是无法存储到泛型集合中的,从而保证了数据的类型安全
  • 代码重用。使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。在处理集合类时,如果遇到下列情况,则可考虑使用泛型类
    1> 如需要对多种类型进行相同的操作处理。
    2> 如需要处理值类型,使用泛型则可避免装箱/拆箱带来的性能开销。
  • 使用泛型可以在应用程序编译时发现类型错误,增强程序的健壮性
  • 减少不必要的重复编码,使代码结构更加清晰

可以根据需要创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值