《C#高级编程》之泛型--1创建泛型类

.NET自从2.0版本开始就支持泛型。

  • 非泛型链表

闲话休提,马上来看下非泛型的简化链表类,它可以包含任意类型的对象。

LinkedListNode.cs中:



在链表中,一个元素引用另一个元素,所以必须创建一个类,将其封装在链表中,并引用下一个对象。

 1     public class LinkedListNode
 2     {
 3         public LinkedListNode(object value)
 4         {
 5             this.Value = value;
 6         }
 7
 8         public object Value { get; private set; }
 9
10         public LinkedListNode Next { get; internal set; }
11         public LinkedListNode Prev { get; internal set; }
12     }

LinkedListNode.cs中:



LinkedList类包含LinkedListNode类型的First,与Last属性,它们分别标志了链表的头尾。通过实现GetEnumerator()方法,可以用foreach语句遍历链表。

 1     public class LinkedList : IEnumerable
 2     {
 3         public LinkedListNode First { get; private set; }
 4         public LinkedListNode Last { get; private set; }
 5
 6         public LinkedListNode AddLast(object node)
 7         {
 8             var newNode = new LinkedListNode(node);
 9             if (First == null)
10             {
11                 First = newNode;
12                 Last = First;
13             }
14             else
15             {
16                 Last.Next = newNode;
17                 Last = newNode;
18             }
19             return newNode;
20         }
21
22         public IEnumerator GetEnumerator()
23         {
24             LinkedListNode current = First;
25             while (current != null)
26             {
27                 yield return current.Value;
28                 current = current.Next;
29             }
30         }

Program.cs中:


1             var list1 = new LinkedList();
2             list1.AddLast(2);
3             list1.AddLast(4);
4             list1.AddLast("6");
5
6             foreach (int i in list1)
7             {
8                 Console.WriteLine(i);
9             }

此时,会出现一个运行异常,因为把链表中第3个元素转换成整形时会出现异常。

  • 泛型链表

为了避免这种情况,下面创建泛型的链表。

LinkedListNode.cs中:



LinkedListNode类用一个泛型类型T声明。属性Value的类型是The,而不是object.

    public class LinkedListNode<T>
   {
      public LinkedListNode(T value)
      {
         this.Value = value;
      }

      public T Value { get; private set; }
      public LinkedListNode<T> Next { get; internal set; }
      public LinkedListNode<T> Prev { get; internal set; }
   }

LinkedList.cs中:



也把LinkedList定义成泛型类。

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

Program.cs中:


 1     class Program
 2     {
 3         static void Main()
 4         {
 5             var list2 = new LinkedList<int>();
 6             list2.AddLast(1);
 7             list2.AddLast(3);
 8             list2.AddLast(5);
 9
10             foreach (int i in list2)
11             {
12                 Console.WriteLine(i);
13             }
14
15             var list3 = new LinkedList<string>();
16             list3.AddLast("2");
17             list3.AddLast("four");
18             list3.AddLast(null);
19
20             foreach (string s in list3)
21             {
22                 Console.WriteLine(s);
23             }
24             Console.Read();
25
26         }

现在foreach是类型安全的了。

时间: 2024-08-29 19:11:05

《C#高级编程》之泛型--1创建泛型类的相关文章

解读经典《C#高级编程》泛型 页114-122.章4

前言 本章节开始讲解泛型..Net从2.0开始支持泛型,泛型不仅是C#的一部分,也与IL代码紧密集成.所以C#中泛型的实现非常优雅.相对于C#,Java是后期引入的泛型,受限于最初的设计架构,就实现的比较别扭,遭到不少人的吐槽,比如"类型擦除"问题.使用C#还是幸福的. 使用泛型最典型的应用,可能是List<T>了,从List<T>我们可以看到,使用泛型最明显的优点是: 将List的功能和包含类T的功能分开,功能各自实现.使得代码内聚性.复用性.灵活性都更好.

《C#高级编程》【第五章】泛型 -- 学习笔记

 泛型是高级程序设计语言的一种特性.泛型的引入使得程序开发的效率得到提高,代码的重用性大大的提升.有了泛型,我们可以创建独立于被包含类型的类和方法,我们不必给不同的类编写功能相同的很多方法或者类,只创建一个方法或类就可以了.现在我们看看泛型的优点 性能上,泛型不需要进行类型转换(也就是拆箱和装箱). 类型安全,和Object类相比,Object类属于非类型安全的,而泛型使用泛型类型,可以根据需要用特定的类型替换泛型类型,这样就保证了类型安全类.在编译时,只有与泛型类型T定义的允许使用的类型不

重学《C#高级编程》(泛型与数组)

前段时间工作比较忙,就没有写随笔了,现在继续. 前两天重新看了泛型和数组两章,简单说下我自己的收获吧 泛型 我们知道数组是一种批量的数据格式,而泛型其实就是一种自定义的批量数据格式,当数组和C#现有的泛型类List和Dictionary<K,V>不满足我们的要求时,我们可以自己创建泛型类,具体怎么创建就不在这里一一解释了,要创建时再去找解决方案吧(个人感觉完全没必要去纠结每一个功能如何实现,真要使用时可以去网上搜到大把的实现方式,我们只要知道有这样一种解决方案,可以实现这样一个功能就行). 泛

C#高级编程三十天----泛型结构,泛型方法,泛型委托

泛型结构 泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与编程语言中的数字的区别(数据库中数字可以为空,编程语言中数字不可为空).因为Nullable<T>使用过于的繁琐,于是就引入了一种特殊的语法,使用个"?"运算符.例: int? x1; Nullable<int> x2; x1和x2这两种方式定义是等价的. 非空类型

《C#高级编程》读书笔记

<C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) short System.Int16 16位有符号的整数 -32 768~32 767(−215−215~215−1215−1) int System.Int32 32位有符号的整数 -2 147 483 648~2 147 483 647(−231−231~231−1231−1) long System.Int

Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结

Atitit.  高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driver/mvc 等) 2 1.2. 高级概念(lambda,闭包closure,fp,dsl ) 2 1.3. 元编程MOP  Annotation/attributi 2 1.4. 规则引擎and jbpm 2 1.5. 自己的框架and工具的 2 1.6. 自己的输入法 2 1.7. Uapi 3

C++学习笔记(六):高级编程:模板,预处理器,信号处理,多线程,Web编程

模板 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式. 库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如vector <int>和vector <string>. 您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用. 函数模板 模板函数定义的一般形式如下所示: template <class type>

C#高级编程之委托

看C#高级编程第八版看到委托,有人说它和Java中的代理有些相似,但我认为这是一个C#与其他编程语言不同的地方,这也应该很重要,不然书上也不会大篇幅的讲委托的概念和应用.我在网上查阅了关于委托的资料,发现它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,混身不自在. 那初次看见"委托"这个词,我脑海中出现的第一个疑问就是: 1.什么是委托? 我看完整这个章节,依然是一知半解的,功夫不负有心人,通过强大的网路,我寻找到了答案,那到底什

Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APU