上篇博客介绍了基本的数值类型,以及字符、字符串的使用方式,本篇博客详细介绍下更多的常用数据类型:元组、数组,并且介绍下可空修饰符以及值类型和引用类型的区别。
元组
元组允许在一个语句中完成所有变量的赋值并且允许每一项都有不同的数据类型,在我看来元组更像是一个阉割版本的类,因为我们这么做的时候通过是因为这些变量存在某些业务关系,但是它又不需要像类那样重,需要有很多方法什么的。
元组的使用方式多种多样,既支持显示、又支持隐式变量声明,在5中还可以将元组数据赋值给一个元组类型,不仅如此,元组不单支持具名访问还支持8中不具名的使用item顺序访问,以及9中的弃元操作。
数组
数组再熟悉不过了,不管是C,C#,Java基本啥都有,那我就聊点儿不一样的。在赋值的时候,要么开辟内存空间,要么将地址的引用赋给数组变量。
需要注意的是,如果指定了大小,并且包含了元素,那么元素个数一定要和大小一致。若只是指定了大小但未分配值,则每个元素使用默认值。引用类型,为null; 数值类型为0; bool类型为false; char类型为\0。
多维数组和交错数组
多维数组是一个n*m的矩形,每一维的大小必须一致。而交错数组表示在一个数组里添加了一堆数组:
private static void Main(string[] args) { int[][] aa = { new int[] { 1, 0}, new int[] { 0, 2, 0 }, new int[] { 1, 2, 1,5 } }; System.Console.WriteLine(aa[1][0]); //返回true System.Console.ReadKey(); }
每一维的大小可以不一致。
数组方法的使用
包括一些常用方法:Sort用于排序,BinarySearch用于先排序后获取指定元素的索引,目标元素不存在返回索引,值得特别注意的是:
- Length方法:如果是多维数组会返回多维数组的总数,而如果是交错数组,会返回交错数组里的数组个数
- Clear方法:不删除数组元素,只是将数组里的元素没一个都设置为其默认值
- Clone方法:返回一个数组的拷贝,该拷贝是一个堆数据的拷贝,修改新数组不会影响原始数组
- Rank方法:获取整个数组的维数,也就是N*M里的N.
除了以上常用方法,还可以使用ToCharArray将字符串转为字符数组。再使用Reverse方法反转该字符串数组
C#冷知识
1,一个类型要么是值类型、要么是引用类型。值类型的数据总是拷贝值,而引用类型的数据总是拷贝引用。所以比较推荐的用法是,值类型内存占用最好不要超过16字节。
2,引用类型的实例指向堆,运行时要先从变量读到内存位置,然后再跳转到堆里数据存储的实际位置。
3,一般不能将null赋给值类型,但是在值本来缺失的时候,由不希望编译报错,可以使用可空修饰符:?
private static void Main() { int? count = null; Console.WriteLine(count); }
一个好处是,在进行数据库编程的时候不用担心取到null值给值类型会报错了,因为数据库里没有数据的时候就是null,这时候用可空修饰符就没有关系。int的默认值0在表里可是也是有意义的,所以说一定要给值类型一个缺失而不是指定某个值。
4,可以使用var来隐式声明变量,编译器会依据编译时赋的值来确定类型。但是如果不是显而易见的的类型,尽量不要使用var,而是使用本来类型来声明变量。
C#新知识
1,可以使用default关键字来获取任何数据类型的默认值:
int count =default(int) //0
2,从C#3.0开始,创建数组时不需要显示指定数据类型,也可以依据元素来确认:
private static void Main() { var people = new[] { "hhh", "ttt" }; }