.NET基础 (09)常用集合和泛型

常用集合和泛型
1 int[]是引用类型还是值类型
2 数组之间如何进行转换
3 解释泛型的基本原理
4 什么是泛型的主要约束和次要约束

常用集合和泛型
1 int[]是引用类型还是值类型

数组类型是一族类型,它们都继承自System.Array,而System.Array又继承自System.Object。所有数组的类型都是引用类型。

引用类型的数组和值类型的数组的内存分配:

2 数组之间如何进行转换

数组类型在符合条件的情况下可以进行隐式地转换,条件包括:数组维数必须相同;目标项目类型和源项目类型必须存在隐式或者显示转换关系;原数组项目类型不是值类型。

数组类型可通过Array.ConvertAll方法进行内容转换,该方法需要使用者提供一个转换算法,以委托或者方法的形式传入Array.ConvertAll方法中。

//编译成功
string[] sz = {"a","a","a"};
object[] oz = sz;

//编译失败,值类型项目的数组不能被转换
int[] sz = {1, 2, 3};
object[] oz = sz;

//编译失败,两者维数不同
string[,] sz = {{"a","b"},{"a","c"};
object[] oz = sz;

数组内容转换示例:

    class ArrayConvert
    {
        static void Main(string[] args)
        {
            String[] times={"2018-1-1",
                            "2018-1-2",
                            "2018-1-3"};

            //使用不同的方法转换
            DateTime[] result1 = OneByOne(times);
            DateTime[] result2 = ConvertAll(times);

            //结果是相同的
            foreach (DateTime item in result1)
                Console.WriteLine(item.ToString("yyyy-MM-dd"));
            foreach (DateTime item2 in result2)
                Console.WriteLine(item2.ToString("yyyy-MM-dd"));
            Console.Read();

        }

        //逐个手动转换
        private static DateTime[] OneByOne(String[] times)
        {
            List<DateTime> result = new List<DateTime>();
            foreach (String item in times)
            {
                result.Add(DateTime.Parse(item));
            }
            return result.ToArray();
        }

        //使用Array.ConertAll方法
        private static DateTime[] ConvertAll(String[] times)
        {
            return Array.ConvertAll(times,
                new Converter<String, DateTime>
                (ArrayConvert.DateTimeToString));
        }

        private static DateTime DateTimeToString(String time)
        {
            return DateTime.Parse(time);
        }
    }

输出:

2018-01-01
2018-01-02
2018-01-03
2018-01-01
2018-01-02
2018-01-03

3 解释泛型的基本原理

泛型允许程序员定义更通用的类型和算法,并且在具体使用时在生成具体的封闭类型。所有代泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性,本质上,它和封闭类没有区别。在.NET中,泛型的另外一个重要作用是避免容器操作中的装箱拆箱。

泛型示例:

    class MainClass
    {
        static void Main(string[] args)
        {
            //从开放类型到封闭类型
            GenericClass<String> gc = new GenericClass<String>("我是泛型");
            Console.WriteLine(gc);
            Console.Read();
        }
    }

    //一个简单的泛型类
    public class GenericClass<T>
    {
        T my;
        public GenericClass(T t)
        {
            my = t;
        }
        public override string ToString()
        {
            return my.ToString();
        }
    }

微软建议所有的泛型参数名称都以T开头,就像接口都以I开头一样,是一种编码的通用规范。

4 什么是泛型的主要约束和次要约束

每个泛型参数可以有至多一个主要约束,泛型的主要约束是指指定泛型参数必须是或者继承自某个引用类型,有两个特殊的主要约束:class和struct,分别代表泛型参数引用类型和值类型。

每个泛型参数可以有无数个次要约束,次要约束和主要约束的语法基本相同,但它规定的是某个泛型参数必须实现所有次要约束指定的接口。

泛型主要约束示例:

    public class ClassT1<T> where T : Exception
    {
        private T myException;
        public ClassT1(T t)
        {
            myException = t;
        }
        public override string ToString()
        {
            //主要约束保证了myException拥有source成员
            return myException.Source;
        }
    }
    public class ClassT2<T> where T : class
    {
        private T myT;
        public void Clear()
        {
            //T是引用类型,可以置null
            myT = null;
        }
    }
    public class ClassT3<T> where T : struct
    {
        private T myT;
        public override string ToString()
        {
            //T是值类型,不会发生NullReferenceException异常
            return myT.ToString();
        }
    }

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

时间: 2024-10-13 15:55:20

.NET基础 (09)常用集合和泛型的相关文章

java基础复习(集合、泛型、IO流、多线程、Junit 、内省 、Properties、 路径问题)

集合 泛型 IO流 多线程 Junit Assert 注解 内省 Properties 路径问题 集合 ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查找快, 增删慢 由于是数组实现, 在增和删的时候会牵扯到数组 增容, 以及拷贝元素. 所以慢.数组是可以直接按索引查找, 所以查找时较快 ---|LinkedList: 链表实现, 增删快, 查找慢由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个

基础篇——集合与泛型

一.集合 TreeSet:以有序状态保持并可防止重复,其元素必须是Comparable HashMap:可用成对的key/value来存取 LinkedList:针对经常插入或者删除中间元素所设计的高效率集合 HashSet:防止重复的集合,可快速地找出相符的元素 LinkedHashMap:类似HashMap,但可以记住元素插入的顺序,也可以设定成依照元素上次存取的先后来排序 ArrayList:可以避免重复的元素,动态的操作 二.排序 对于基础主数据类型,可以用Collection.sort

集合与泛型

集合类负责存储一系列的个体,其集合的长度可能是不变的或者可变的.相比于普通的数组结构,集合类的功能更加具体. 集合类分为普通(非泛型)集合和泛型集合.泛型集合类的命名空间为集合的一个子命名空间:System.Collections.Generic.非泛型的集合中,所有的成员都被当作为object类型,不同的成员可以拥有不同的数据类型.而泛型的集合所有的成员类型都是相同的. 非泛型集合 所有非泛型集合都实现接口ICollection. 所有非泛型集合中的成员都是object. 集合类的基础接口IC

【Linux基础】常用命令大全

Linux基础之常用命令大全 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo 显示CPU info的信息 cat /proc/interrupts 显示中断 cat /

Android基础-09

Android基础-09 内容提供者 01_为什么需要内容提供者 内容提供者:提供了统一的访问数据库的方式,可以让其他应用程序来调用. 02_编写内容提供者 步骤: 1.在工程中添加一个内容提供者的类,继承了ContentProvider类型,实现了增删改查的方法: 2.在清单文件中配置一个provider节点,指定authorities(相当于网站的域名,用来唯一标示一个内容提供者).exported为true(从4.1开始,exported没有指定为true,表示其他应用程序不能访问这个内容

【总结】Java常用集合接口与集合类

目录 常见集合接口概述 Collection<E> Map<K,V> Collection接口 Map接口 补充内容 ? 常见集合接口概述 Java中包含许多集合接口.其中比较常见的主要是Collection接口和Map接口: 1.1 Collection<E> 由单元素组成的集合.其比较常见的直接子接口是List.Set和Queue接口. ? ? ? ? 表1.1 Collection<e>接口常用方法 编号 方法原型 解释 备注 1 boolean?ad

C#集合与泛型集合

看到这个标题,大家应该就知道有泛型集合,就有非泛型集合 既然都是集合,咱们今儿就简单的来对比讲解下 需要记住的不算太多,理解记忆.理解记忆 2017-11-0411:39:09 C# 泛型集合之非泛型集合类与泛型集合类的对应: *****ArrayList对应List ***HashTable对应Dictionary *****Queue对应Queue *****Stack对应Stack SortedList对应SortedList 第一  : ArrayList(非泛型集合)  与List(泛

JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介

JJDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟悉Java的常用集合类.本文将就Java Collections Framework中常用的集合及其特点.适用场景.实现原理进行介绍,供学习者参考.当然,要真正深入理解Java的集合实现,还是要推荐去阅读JDK的源码. Java提供的众多集合类由两大接口衍生而来:Collection接口和Map接口 Collection接口 Collection接口定义了一个包含一批对

C#常用集合

数组的缺点:长度固定.因此引入集合的使用. 注:泛型集合更安全,性能更高. 常用集合 对应泛型 ①动态数组ArrayList    List<T> 常用方法属性:Add  Clear  Contains  IndexOf  Insert  Remove  Sort ②哈希表Hashtable   Dictionary<TKey,TValue> 常用方法属性:Add  Clear  ContainsKey  ContainsValue  Remove ③排序列表SortedList