1、命名空间
可以认为类是属于命名空间的。
如果在当前项目中没有这个类的命名空间,需要我们手动的导入这个类所在的
命名空间。
1)、用鼠标去点
2)、alt+shift+F10
3)、记住命名空间,手动的去引用
2、在一个项目中引用另一个项目的类
1)、添加引用
2)、引用命名空间
3、值类型和引用类型
区别:
1、值类型和引用类型在内存上存储的地方不一样。
2、在传递值类型和传递引用类型的时候,传递的方式不一样。
值类型我们称之为值传递,引用类型我们称之为引用传递。
我们学的值类型和引用类型:
值类型:int、double、bool、char、decimal、struct、enum
引用类型:string、自定义类、数组
存储:
值类型的值是存储在内存的栈当中。
引用类型的值是存储在内存的堆中。
3、字符串
1)、字符串的不可变性
当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值。
当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则立即把它销毁。
2)、我们可以讲字符串看做是char类型的一个只读数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
string s = "sdjejjded";//字符串可以看做只读类型的字符数组 Console.WriteLine(s[0]); Console.ReadKey(); ToCharArray();将字符串转换为char数组 new string(char[] chs):能够将char数组转换为字符串 例: string s = "abcdefg"; char[] chs = s.ToCharArray(); chs[0]='b'; s= new string(chs); Console.WriteLine(s); Console.ReadKey(); |
4、字符串提供的各种方法
1)、Length:获得当前字符串中字符的个数
2)、ToUpper():将字符转换成大写形式
3)、ToLower():将字符串转换成小写形式
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
string s = "a"; string b = "A"; s=s.ToUpper();//统一转化为大小写比较 b=s.ToUpper(); if (s == b) { Console.WriteLine("这两个值相等"); Console.ReadKey(); } else { Console.WriteLine("这两个值不相等"); Console.ReadKey(); } |
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比较两个字符串,可以忽略大小写
例:
1 2 3 4 5 6 7 8 9 10 11 12 |
string s = "a"; string b = "A"; if (s.Equals(b,StringComparison.OrdinalIgnoreCase))//s是第一个字符串 b表示第二个字符串 { Console.WriteLine("这两个值相等"); Console.ReadKey(); } else { Console.WriteLine("这两个值不相等"); Console.ReadKey(); } |
5)、Split():分割字符串,返回字符串类型的数组。(输出的时候用foreach遍历的方法输出)
例:
1 2 3 4 5 6 7 8 9 |
string s = "s sd % ,/_ ags usd"; //char[] chs = { ' ', '%', '/', '_' }; //string[] a = s.Split(chs,StringSplitOptions.RemoveEmptyEntries); string[] a = s.Split( new char[]{' ', '%', '/','_'},StringSplitOptions.RemoveEmptyEntries); foreach (string item in a) { Console.Write(item.ToString()); } Console.ReadKey(); |
例二:
要求输出2015年3月3日
1 2 3 4 5 6 7 8 9 10 11 |
string year = "2015-3-3"; char[] chs = { '-' }; string[] a=year.Split(chs, StringSplitOptions.RemoveEmptyEntries); Console.Write("{0}年{1}月{2}日",a[0],a[1],a[2]); Console.ReadKey(); 6)、Substring():解决字符串。在截取的时候包含要截取的那个位置。 string s = "我是一个学生"; Console.WriteLine(s.Substring(1,3)); Console.ReadKey(); |
7)、IndexOf():判断某个字符串在字符串中第一次出现的位置的索引,如果没有返回-1、值类型和引用类型在内存上存储的地方不一样。
8)、LastIndexOf():判断某个字符串在字符串中最后一次出现的位置索引,如果没有同样返回-1 返回int类型
1 2 3 4 5 6 |
string s = "我的祖国叫中国"; int a=s.IndexOf('祖'); int b = s.LastIndexOf('国'); Console.WriteLine(a); Console.WriteLine(b); Console.ReadKey(); |
9)、StartsWith():判断以….开始返回的是布尔类型
10)、EndsWith():判断以…结束返回的是布尔类型
1 2 3 4 5 6 7 8 9 10 11 |
string s = "我的名字叫薛倩"; if (s.StartsWith("名字")) { Console.WriteLine("yes"); } else { Console.WriteLine("no"); } Console.ReadKey(); |
11)、Replace():将字符串中某个字符串替换成一个新的字符串
12)、Contains():判断某个字符串是否包含指定的字符串
1 2 3 4 5 6 7 |
string s = "我有一个梦想"; if (s.Contains("梦想")) { s=s.Replace("梦想", "水电费接口"); Console.WriteLine(s); Console.ReadKey(); } |
获取某个磁盘路径下面的文件:
1 2 3 4 5 |
string path = @"d:\a\v\c\s\视频.mp4"; int index=path.LastIndexOf("\\"); path=path.Substring(index + 1); Console.WriteLine(path); Console.ReadKey(); |
13)、Trim():去掉字符串中前后的空格
14)、TrimEnd():去掉字符串中结尾的空格
15)、TrimStart():去掉字符串中前面的空格
1 2 3 4 5 6 |
string s = " asadssds "; s=s.Trim();//去掉前后空格 s = s.TrimStart();//去掉前空格 s = s.TrimEnd();//去掉后空格 Console.Write(s); Console.ReadKey(); |
16)、string.IsNullOrEmpty():判断一个字符串是否为空或者为null
1 2 3 4 5 6 7 8 9 10 |
string s = null; //string s=""; if (string.IsNullOrEmpty(s)) { Console.WriteLine("yes"); } else { Console.WriteLine("no"); } Console.ReadKey(); |
17)、string.Join():将数组按照指定的字符串连接,返回一个字符串。
1 2 3 4 |
string[] name = { "张三", "李四", "王强" }; string ad=string.Join("|", name); Console.WriteLine(ad); Console.ReadKey(); |
5、 StringBuilder 和 String 的区别?
答:String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。
使用string做字符串的累加与substring比较&定时器的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Stopwatch wat = new Stopwatch();//创建计时器 wat.Start();//计时开始 string str="123"; for (int i = 0; i < 100000; i++) { str += i;//用string做累加 } wat.Stop();计时结束 Console.WriteLine(wat.Elapsed);//得出总的时间 // 用时:00:00:31.8484531 Console.ReadKey(); string s = null; Stopwatch swt = new Stopwatch(); swt.Start(); StringBuilder sb = new StringBuilder();//用stringbuilder做累加 for (int i = 0; i <100000; i++) { sb.Append(i); } swt.Stop(); Console.WriteLine(swt.Elapsed); //用时:00:00:00.0298519 Console.ReadKey(); |