C#泛型编程

时间:2022-06-28 08:21:05

    C#中的泛型与C++中的模板类似,泛型是实例化过程中提供的类型或类建立的。泛型并不限于类,还可以创建泛型接口、泛型方法,甚至泛型委托。这将极大提高代码的灵活性,正确使用泛型可以显著缩短开发时间。与C++不同的是,C#中所有操作都是在运行期间进行的。

2.使用泛型

 可空类型

值类型必须包含一个值,它们可以在声明之后,赋值之前,在未赋值状态下存在,但不能以任何方式使用,,而引用类型可以为null。有时让值类型为空是很有用的,泛型提供了使用System.Nullable<T>使值类型为空的一种方式。如下代码:

private Nullable<int> _nullableInt;

则可以为_nullableInt赋为null,如下:

_nullableInt = null;

可空类型非常有用,以致于C#中加入了语法:

int? _nullableIntSecond;

System.Collections.Generic 名称空间

    这个名称空间用于处理集合的泛型类型,使用的非常频繁。将以List<T>和Dictionary<K,V>为例介绍这些类,以及和它们配合使用的接口和方法。

1.List<T>

        List<T>泛型集合类更加快捷,更易于使用,创建T类型对象的集合需要一下方法:

List<string> _myCollection = new List<string>();

将创建T为String的List集合。

可以在代码中去查看List<T>所支持的方法,这里不再赘述。

2.对泛型列表进行排序和搜索

对泛型列表进行排序和搜索与和其它列表进行排序和搜索是一样的,如下为实例代码:

public class NumberCollection : List<int> { public NumberCollection(IEnumerable<int> initialNums) { foreach (var num in initialNums) { Add(num); } } public NumberCollection() { for (int i=0;i < 10;++i) { Add(i); } } public void Print() { foreach (var num in this) { Console.WriteLine(num); } Console.Read(); } }

public static class NumberCollectionDelegate { public static int Compare(int i,int j) { if (i > j) { return -1; } else if (i < j) { return 1; } return 0; } public static bool Find(int i) { if (i %2 == 0) { return true; } return false; }

public static Comparison<int> CopmareDelegate = new Comparison<int>(Compare);

public static Predicate<int> Predicate = new Predicate<int>(Find);

}

var numColleciton = new NumberCollection(); numColleciton.Print(); numColleciton.Sort(NumberCollectionDelegate.CopmareDelegate); numColleciton.Print(); var newNumCollection = new NumberCollection(numColleciton.FindAll(NumberCollectionDelegate.Predicate)); newNumCollection.Print(); Console.ReadLine();

如上代码,首先定义了NumberCollection继承自List<int>,定义了Print方法用来输出集合中所有的值,类NumberCollectionDelegate中定义了Compare方法,以及Find方法,Compare方法用于对集合进行降序排序(为什么这么写是降序排序请关注另一篇文章),Find方法用于选择集合中为偶数的值。在实例的使用中,首先对集合中的元素进行了降序排序,后选择集合中为偶数的值组成新的集合,当然上述比较与查找用法可以简化为以下用法:

numColleciton.Sort(NumberCollectionDelegate.Compare);

var newNumCollection = new NumberCollection(numColleciton.FindAll(NumberCollectionDelegate.Find));

这样就不需要显示引用Comparison<int>类型了,但是在使用时仍然会隐式创建Comparison<int>实例,对于比较也是同样的。在许多情况下,都可以使用方法组以这种方式隐式的创建委托,使代码变的更容易读取。

3.Dictionary<K,V>

    这个类型可以定义键值对的集合,这个类型需要实例化两个类型,分别用于键和值,以表示集合中的各个项。可以使用强类型化的Add方法添加键值对,如下。