四:泛型

Posted yuanhaowen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四:泛型相关的知识,希望对你有一定的参考价值。

性能

装箱拆箱

        static void Main(string[] args)
        {
            var List = new ArrayList();
            List.Add(44);//装箱
            int i = (int)List[0];//拆箱
            foreach(int item in List)
            {
                Console.WriteLine(item);//拆箱
            }
            Console.ReadLine();
        }

装箱拆箱是很平常的操作,但是问题是性能损失很大。

泛型的示例

        static void Main(string[] args)
        {
            List<int> List = new List<int>();
            List.Add(44);//没有装箱
            int i = (int)List[0];//没有拆箱
            foreach(int item in List)
            {
                Console.WriteLine(item);//没有拆箱
            }
            Console.ReadLine();
        }

使用泛型就没有装修和拆箱的性能损失。原因是代码编译后就已经指定List的类型是int,也就是值类型,不会再转换成Object类型。

类型安全

ArrayList添加的类型其实是Object。也就是说如果有类型的转换可能会有问题。

但是List<T>的定义就只能添加整型类型。

命名约定

一般泛型的名称以T作为前缀,如果有多个泛型类型,可以在T字面后面添加描述性名称

泛型类示例

技术分享图片
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyGeneric
{
    class Program
    {
        static void Main(string[] args)
        {
            MyuLinkList<int> myList = new MyuLinkList<int>();
            myList.AddList(1);
            myList.AddList(11);
            myList.AddList(111);
            foreach(var item in myList)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }
    }

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

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

    class MyuLinkList<T>:IEnumerable<T>
    {
        public MyuLinkListNode<T> First { get; internal set; }
        public MyuLinkListNode<T> Last { get; internal set; }
        public MyuLinkListNode<T> AddList(T node)
        {
            var newNode = new MyuLinkListNode<T>(node);
            if(First==null)
            {
                First = newNode;
                Last = First;
            }
            else
            {
                MyuLinkListNode<T> previous = Last;
                Last.Next = newNode;
                Last = newNode;
                Last.Prev = previous;
            }
            return newNode;
        }

        public IEnumerator<T> GetEnumerator()
        {
            MyuLinkListNode<T> current = First;
            while(current!=null)
            {
                yield return current.Value;
                current = current.Next;
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
}
View Code

一般来说,不用自己新建泛型类,只要使用.NET自带的泛型类就可以了。比如List<T>。

泛型的功能

泛型不能把null赋值给泛型类型。

默认值

如果一个

以上是关于四:泛型的主要内容,如果未能解决你的问题,请参考以下文章

<c++> 四模板初阶

作业09-集合与泛型

Java泛型:类型擦除

泛型(第四部分)

注解和反射反射获取泛型反射获取注解

深入Java泛型(四RxJava中深入理解泛型)