码迷,mamicode.com
首页 > 其他好文 > 详细

四:泛型

时间:2018-11-13 12:18:48      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:klist   void   spl   thread   this   vat   不能   value   fir   

性能

装箱拆箱

        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赋值给泛型类型。

默认值

如果一个

四:泛型

标签:klist   void   spl   thread   this   vat   不能   value   fir   

原文地址:https://www.cnblogs.com/yuanhaowen/p/9951422.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!