c#数组补充

简介: c#数组的几个简单的补充

c#数组的几个简单的补充

数组是引用类型,不论其元素是值类型还是引用类型。

c#中数组对象实现的各个接口:

// 定义了浅拷贝的能力,因此数组可以进行浅拷贝
System.ICloneable
// ICollection接口的子代,使用接口编程减轻耦合,该接口只定义了一些方法,有索引器,查询元素位置,插入数据,移除索引位置数据这个方法,简单的可以当作存放数据的容器,不能像List那样具有很多数据处理的方法。
System.Collections.IList
// 集合的父基类,定义了返回元素数量,复制等一些集合类型最基本的方法,同时提供了可以同步访问ICollection对象元素的方法,数组具有这些能力
System.Collections.ICollection
// 定义迭代遍历的能力,数组可以使用foreach循环
System.Collections.IEnumerable
// .net4 新增接口,定义了排序的能力,数据可以进行排序因此而来
System.Collections.IStructuralComparable
// .net4 新增接口,定义比较能力,数组可以比较数组是否具有相同的内容
如果元素数量不同直接返回不相等,同时具有几个元素就会执行几次比较
System.Collections.IStructuralEquatable
// 也提供了索引器,删除插入查询数据几个方法,但是是泛型数据

/* 特殊的,所有的数组默认继承自Array抽象类,该类实现了如上的接口,但在查看源码不能看到数组实现如下接口,这些接口实在CLR动态为一维数组实现如下的接口 */
System.Collections.Generic.IList <T>
// 提供泛型的能力,也有基本的增删改查的功能
System.Collections.Generic.ICollection <T>
// 一个类型可以使用linq迭代,必须实现改接口,因此数组可以使用linq查询。
System.Collections.Generic.IEnumerable <T>
// 只读list,通过索引访问该只读list的元素
System.Collections.Generic.IReadOnlyList <T>
// 只读集合,通过索引访问该只读集合的元素
System.Collections.Generic.IReadOnlyCollection <T>

代码查看:

            foreach (var type in (new int[0,0]).GetType().GetInterfaces())
                Console.WriteLine(type);

通过执行该代码,当创建的数组是一维数组时,该数组对象会实现泛型接口,可以拥有linq查询的能力,但当不是一维数组时,此时的数据就不具有linq的能力,此时的数组对象不实现泛型接口。

这些动作是由CLR (公共语言运行时)执行的,内部原理并不清楚,但一般而言linq查询是对集合进行操作,数组属于集合,但由于存在多维数组,数组不能直接实现IEnumerable泛型接口获取linq查询的能力,而是在托管代码运行时由CLR负责处理,对一维数组赋予接口能力,非一维数组不能拥有接口能力。

当然上面这些都是对引用类型而言,值类型不会有这种动态赋予接口能力的操作。

目录
相关文章
|
9月前
|
C#
C#学习相关系列之数组---常用方法使用(二)
C#学习相关系列之数组---常用方法使用(二)
|
9月前
|
存储 C#
C#学习系列相关之数组(一)---数组的定义与使用
C#学习系列相关之数组(一)---数组的定义与使用
|
9月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
127 0
|
5月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
110 2
|
8月前
|
存储 开发框架 .NET
C#中的数组探索
C#中的数组探索
|
9月前
|
C#
C# 字节数组与INT16,float,double之间相互转换,字符数组与字符串相互转换,
C# 字节数组与INT16,float,double之间相互转换,字符数组与字符串相互转换,
329 2
C#基础⑥.2——数组(冒泡排序、求最值、数组排序、forr反转)
一次语文测试后,老师让班长统计每一个学生的成绩并计算全班(全班共5人)的平均成绩,然后把所有成绩显示出来。
|
9月前
|
存储 C#
C#基础语法(数组和函数)
C#基础语法(数组和函数)
84 1
|
9月前
|
存储 C# C++
C# 笔记2 - 数组、集合与与文本文件处理
C# 笔记2 - 数组、集合与与文本文件处理
90 0
|
9月前
|
存储 C# 索引
C# | 比较IEnumerable、List、数组
IEnumerable`定义了一组用于枚举集合的方法,包括`GetEnumerator`方法,该方法返回一个实现了`IEnumerator`接口的对象,用于枚举集合中的每个元素。`List`和数组都可以使用`foreach`循环来遍历其中的元素,这是因为它们都实现了`IEnumerable`接口。 由于数组在内存中开辟了一段连续的空间,因此可以直接通过索引访问元素,访问速度很快。而 List 则需要通过指针或引用来访问元素,速度相对较慢。 由于数组的大小是固定的,当需要添加或删除元素时,需要重新创建一个新数组,将原数组中的元素复制到新数组中,并添加或删除元素。
278 0
C# | 比较IEnumerable、List、数组