C#基础笔记二

C#基础笔记二

C# 数组(Array)

声明和使用
数组是一个只能存储相同种数据类型元素而且长度大小固定的集合

		static void Main(string[] args)
        {
            //数组的申明并初始化方式1
            string[] strArray = new string[4];
            strArray[0] = "1";
            strArray[1] = "2";
            strArray[2] = "3";
            strArray[3] = "4";
            foreach (var item in strArray)
            {
                Console.WriteLine(item);
            }
            //数组的申明并初始化方式2
            int[] intArray = new int[] { 1, 2, 3, 4 };
            foreach (var item in intArray)
            {
                Console.WriteLine(item);
            }
            //数组的申明并初始化方式3
            object[] objArray ={ 1, 2, 3, 4 };
            foreach (var item in intArray)
            {
                Console.WriteLine(item.ToString());
            }
            Console.ReadKey();
        }

上面我使用了三种方式声明并初始化使用了三种不同类型的数值,分别是string、int、object,数组在确定类型后就表示现在这个数组里面就只能存放这一种类型的数据,如果想放多种类型就只能使用object类型

            object[] objArray ={ 1, "333", 7777L, 4.9999 };
            foreach (var item in objArray)
            {
                Console.WriteLine(item.ToString());
            }

因为object是所有类型的最基类,放入数据时都会隐形的转换为object类型的数据,所以object类型的数组理论上能放入任何数据,不过由于使用时object需要转换成相应的数据类型才可以使用,程序又没办法自己辨别数据原来是什么类型,所以除开一些特殊的需求外,通常情况不会使用object类型的数组。

			int[] intArray ={ 1, 2, 3, 4 };
            foreach (var item in objArray)
            {
                Console.WriteLine(item.ToString());
            }
            for (int i = 0; i < objArray.Length; i++)
            {
                Console.WriteLine(objArray[i]);
            }

数组的遍历通常就是用循环,因为数组是可迭代对象,array[下标] 就是获取指定下标位置的数组中的元素。

需要注意的是,数组在初始化时必须确定其长度,确定长度后如果未对所有位置赋值,那么就会在没有赋值的位置用数组指定数据类型的默认值进行填充

下面说多维数组
c#的多维数组和java的多维数组声明有点不相同:
java的二维数组的声明方式为 array[][];
c#的二维数组的声明方式时 array[,];

在c#中**array[][]**叫做交错数组,理解过来就是数组中的数组

__二维数组相当于表格,打开Excel创建一个空白的表格,表格初始就有一个坐标,横坐标为字母,纵坐标为数字在这里插入图片描述坐标用来干什么呢?坐标就是用来定位,比如现在中间有一个选中框,他的位置就是F7,这就是他的编号,每个框都有这样一个唯一的编号

二维数组就是表格

 			int[,] a = new int[3, 4] 
            {
             {0, 1, 2,  3 } ,   
             {4, 5, 6,  7 } ,   
             {8, 9, 10, 11}   
            };

这就是一个3行4列的表格,需要的元素就对应找到坐标就可以了,比如要找到11这个数字,那么他在第三行的第四列,对应的获取就是a[2,3]
多维数组的长度也是固定的,没有赋值的位置就会用默认值顶替

随便看一下交错数组:
int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};
上面这行代码和多维数不同的是在交错数组里面放的是数组,而且交错数据只是确定了他包含的数组数量,而没有确定要放入的数组的长度,所以里面的数组长度是多少都可以,画作图的话就是下面这个样子的:

在这里插入图片描述

字符串

字符串是在实际应用中应用的最多的对象之一了,java的八大基本类型中,好多初学者都会误认为string字符串类型是八大基本类型之一,因为string的什么和使用都和基本数据类型完全相同,殊不知这只是因为这个类型使用过于普遍而对string对象做了处理,使得它可以向基本数据类型一样使用。
在这里插入图片描述
从string的
从这两张图就可以看出来,string是用class修饰的,他是一个类,而且他实现了ICloneable接口,是一个可迭代对象,也就是说它可以进行遍历,可以像数组那样通过下面直接过去指定位置上的字符;
而基本数据类型是没有class修饰的。

字符串最简单的就是做拼接了,最常见的就是直接+,

//比如
string strA="qwe";
string strB="rty";
string strC=strA+strB;//结果就是strC="qwerty";

最常用,但不代表他说是最好的,只是说我们在做短字符拼接的时候,这样是最方便最快的,但如果是一个非常复杂的字符拼接操作;

            Stopwatch sw = new Stopwatch();
            sw.Start();
            string a = "";
            for (int i = 0; i < 10000; i++)
            {
                a += i.ToString();
            }
            sw.Stop();
            TimeSpan ts = sw.Elapsed;
            Console.WriteLine("DateTime costed for Shuffle function is: {0}ms", ts.TotalMilliseconds);
            Console.ReadKey();

这是对一个字符串做了10000次的拼接操作,并打印其消耗的事件,我的电脑耗时为: 37.9678ms,
接下来我换一个方式:

		    Stopwatch sw = new Stopwatch();
            sw.Start();
            StringBuilder a =new StringBuilder("");
            for (int i = 0; i < 10000; i++)
            {
                a.Append(i.ToString());
            }
            sw.Stop();
            TimeSpan ts = sw.Elapsed;
            Console.WriteLine("DateTime costed for Shuffle function is: {0}ms", ts.TotalMilliseconds);
            Console.ReadKey();

相同的操作,只是换了一个对象:耗时1.2533ms
时间快了几十倍,而得到的结果是完全相同的。

对Java有过学习的应该知道,string、stringBuffer、Stringbuilder的区别,string是一个长度不可变的对象,类似于数组一样,string在被赋值的时候长度就固定了,并且不可修改,后两者stringBuffer和stringBuilder是长度可变的字符串对象,类似于集合,可以随时对其中的元素进行添加和删除的操作,本来stringbuffer是线程安全的,stringbuilder是线程不安全的,推荐使用的是stringBuffer,但是我用的vs2017,.net framework 4.6.1却没有stringBuffer只有stringBuilder,这个具体不清楚怎么回事,也还没有去具体了解过

接下来说说为什么string直接拼接会慢这么多,前面说了string在赋值的时候就已经固定长度了,并且不可更改,为什么还能做+的拼接呢?
因为在做拼接的时候在背后还做了很多的操作,string被赋值的时候就会得到一个内存空间,
比如string A=“3”,现在“3”这个字符串就占据了一个内存空间,当作A+="4"操作时,会开辟一个新的空间,先将“3”这个字符串放进去,在将“4”这个字符串方静去,那么这个内存空间就成为了“34”这个字符串的了,最后再把string A指向这个内存,使它能够直接使用这个空间的数据,以前的那个“3”的空间就只能等待c#的垃圾回收去销毁了

而stringbuilder呢?因为本身就是可增加删除的可变字符串对象,所以他在声明时得到的内存空间会一直保持不变,做拼接操作也只是往这个空间里面添加数据,并没有string那样的创建销毁操作,处理的事情少了,时间自然就少了,下面途中就可以看出来,string在做拼接操作时地址时更改的,而stringbuilder并没有
在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值