泛型概述, 创建泛型类

   在.NET 1.0中,要创建一个灵活的类或方法,但该类或方法在编译期间不知道使用什么类,就必须以Object类为基础。而Object类在编译期间没有类型安全性,因此必须进行强制类型转换。另外,给值类型使用Object类会有性能损失。
.NET 2.0提供了泛型。有了泛型,就不再需要Object类了。泛型类使用泛型类型,并可以根据需要用特定的类型替换泛型类型。这就保证了类型安全性:如果某个类型不支持泛型类,编译器就会生成错误。
泛型概述:
泛型的一个主要优点是性能。
泛型的另一个特性是类型安全。
二进制代码的重用.泛型允许更好地重用二进制代码。泛型类可以定义一次,用许多不同的类型实例化。
代码的扩展.
在用不同的类型实例化泛型时,会创建多少代码?
命名约定.  泛型类型的名称用字母T作为前缀;如果没有特殊的要求,泛型类型允许用任意类替代,且只使用了一个泛型类型,就可以用字符T作为泛型类型的名称;  如果泛型类型有特定的要求(例如必须实现一个接口或派生于基类),或者使用了两个或多个泛型类型,就应给泛型类型使用描述性的名称.


下面创建链表的泛型版本。

 

泛型类的定义与一般类类似,只是要使用泛型类型声明。之后,泛型类型就可以在类中用作一个字段成员,或者方法的参数类型。LinkedListNode类用一个泛型类型T声明。字段value的类型是T,而不是object。构造函数和Value属性也变为接受和返回T类型的对象。也可以返回和设置泛型类型,所以属性Next和Prev的类型是LinkedListNode<T>。

 

  1. public class LinkedListNode<T>
  2. {
  3. private T value;
  4. public LinkedListNode(T value)
  5. {
  6. this.value = value;
  7. }
  8. public T Value
  9. {
  10. get { return value; }
  11. private LinkedListNode<T> next;
  12. public LinkedListNode<T> Next
  13. {
  14. get { return next; }
  15. internal set { next = value; }
  16. }
  17. private LinkedListNode<T> prev;
  18. public LinkedListNode<T> Prev
  19. {
  20. get { return prev; }
  21. internal set { prev = value; }
  22. }
  23. }

LinkedList类包含LinkedListNode类型的first和last字段,它们分别标记了链表的头尾。AddLast()方法在链表尾添加一个新元素。首先创建一个LinkedListNode类型的对象。如果链表是空的,则first和last字段就设置为该新元素;否则,就把新元素添加为链表中的最后一个元素。执行GetEnumerator()方法时,可以用foreach语句迭代链表。GetEnumerator()方法使用yield语句创建一个枚举器类型。

在.NET 2.0推出后,IEnumerable接口也有一个泛型版本IEnumerable<T>IEnumerable<T>派生IEnumerable,添加了返回IEnumerator<T>的GetEnumerator()方法,LinkedList<T>执行泛型接口IEnumerable<T>。

 

  1. public class LinkedList<T> : IEnumerable<T>
  2. {
  3. private LinkedListNode<T> first;
  4. public LinkedListNode<T> First
  5. {
  6. get { return first; }
  7. }
  8. private LinkedListNode<T> last;
  9. public LinkedListNode<T> Last
  10. {
  11. get { return last; }
  12. }
  13. public LinkedListNode<T> AddLast(T node)
  14. {
  15. LinkedListNode<T> newNode = new LinkedListNode<T>(node);
  16. if (first == null)
  17. {
  18. first = newNode;
  19. last = first;
  20. }
  21. else
  22. {
  23. last.Next = newNode;
  24. last = newNode;
  25. }
  26. return newNode;
  27. }
  28. public IEnumerator<T> GetEnumerator()
  29. {
  30. LinkedListNode<T> current = first;
  31. while (current != null)
  32. {
  33. yield return current.Value;
  34. current = current.Next;
  35. }
  36. }
  37. IEnumerator IEnumerable.GetEnumerator()
  38. {
  39. return GetEnumerator();
  40. }
  41. }

    使用泛型类LinkedList<T>,可以用int类型实例化它,且无需装箱操作。如果不使用AddLast()方法传送int,就会出现一个编译错误。使用泛型IEnumerable<T>,foreach语句也是类型安全的,如果foreach语句中的变量不是int,也会出现一个编译错误。
LinkedList<int> list2 = new LinkedList<int>();
list2.AddLast(1);
list2.AddLast(3);
list2.AddLast(5);
foreach (int i in list2)
{
Console.WriteLine(i);
}
   同样,可以给泛型LinkedList<T>使用string类型,将字符串传送给AddLast()方法。
LinkedList<string> list3 = new LinkedList<string>();
list3.AddLast("2");
list3.AddLast("four");
list3.AddLast("foo");
foreach (string s in list3)
{
Console.WriteLine(s);
}

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值