c#中的泛型集合

c#中的泛型集合

在应用程序中存储数据最简单的容器是数组,但数组无法满足数据的动态伸缩,为了摆脱这些数组的限制,.net基础类库发布了很多包含集合类的命名空间,集合类的尺寸是动态的,可以在运行时插入或者移除数据项,集合类包括两类:

1.非泛型集合:

主要位于System.Collections命名空间,包括ArraryList,BitArray,Stack,Queue等类,同时System.Collections.Specialized下的ListDictionary等类以及一些接口。

非泛型集合存在的问题:

1)性能问题:.Net支持两大数据类型:值类型和引用类型,有时候需要用某个类别的变量表示另外一个类别的变量,c#提供了装箱的机制将值类型的数据保存在引用类型中,装箱的实际定义为CLR会在堆上分配新的对象,将值类型的值赋予新的实例,并返回新的对象的引用。相反的操作为拆箱,拆箱是将保存在对象引用上的值转换回栈上相应的值类型,CLR会验证收到的值类型是否是装箱的值类型,如果是就将值赋值回本地值类型,如果不是则抛出异常。尽管装箱和拆箱都很方便,但带来的栈/堆内存的转移会导致性能问题。

2)类型安全问题

除了拆箱的时候我们需要记住装箱的值类型,还需要类型安全的容器来操作某些特定的数据类型,在引入泛型之前,需要通过手工创建强类型的集合类。

2.泛型集合

如果使用泛型集合便可以解决上面的问题,包括性能的损失,泛型更类型安全。基本定义如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 泛型集合
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> newone = new List<string>();
            newone.Add("this");
            newone.Add("time");
            newone.Add("you");
            newone.Add("should");
            newone.Add("understand");
            Console.WriteLine("长度是" + newone.Count);
            string str = "";
            foreach(string stemp in newone)
            {
                str += stemp + " ";

            }
            Console.WriteLine(str);
        }
    }
}

你可能感兴趣的:(C#学习)