1.String类库
String成员方法:
1).Contains、StartsWith、EndsWith
bool Contains(String str):判断字符串对象是否包含给定的字符串。bool StartsWith(String str):判断字符串对象是否以给定的字符串开始。bool EndsWith(String str):判断字符串对象是否以给定的字符串结束。string str = "Hello";Console.WriteLine(str.Contains("l"));//trueConsole.WriteLine(str.Contains("a"));//falseConsole.WriteLine(str.StartsWith("he"));//falseConsole.WriteLine(str.StartsWith("He"));//trueConsole.WriteLine(str.EndsWith("lo"));//trueConsole.WriteLine(str.EndsWith("Lo"));//false
2).Length、IndexOf、LastIndexOf、Substring
int Length:获取字符串的长度属性char ch = s[3];int IndexOf(char ch):返回指定字符在此字符串中第一次出现的索引int IndexOf(String str):返回指定字符串在此字符串中第一次出现的索引LastIndexOf:最后一次出现的位置。String Substring(int start):截取字符串。返回从指定位置开始截取后的字符串。String substring(int start,int length)截取字符串。返回从指定位置开始截取指定长度length的字符串。
string s1 = "hellooabcdaabe";int i = s1.IndexOf('l');Console.WriteLine(i);Console.WriteLine(s1.IndexOf("ab"));Console.WriteLine(s1.LastIndexOf('l'));
string s2 = s1.Substring(4);Console.WriteLine(s2);Console.WriteLine(s1.Substring(4,3));
案例获取一个文件名的名称和扩展名部分:string filename = "[ADS-118]林志aaaaaa玲.avi";//int dotIndex = filename.IndexOf('.');//3string name = filename.Substring(0, dotIndex);Console.WriteLine(name);string ext = filename.Substring(dotIndex + 1);Console.WriteLine(ext);
3)字符串对象内容是不可改变的
.ToLower()、ToUpper()、Replace()、trim()、Split()
String ToLower():把字符串变成小写;String ToUpper():把字符串变成大写String Replace(char oldChar,char newChar):用新的字符去替换指定的旧字符;String Replace(String oldStr,String newStr):用新的字符串去替换指定的旧字符串String trim():去除字符串两端空格, Trim(params char[] trimChars)去掉两端的给定字符。TrimEnd:去掉结尾的空格 TrimStart:去掉开头的空格String是不可变的,因此上面的操作都是生成新的字符串对象,要用返回值去取新的字符串。字符串对象一旦声明对象内容,是不可改变的。字符串对象是只读的String[] Split(...):重载方法很多,字符串按照分隔符切割成字符串数组。案例:把字符串用“,”分割string s2 = "a,b,c,|,1,2,1|1";sstring[] s2_1 = s2.Split(',','|');string[] s2_2 = s2.Split(new char[] { ',', '|' },StringSplitOptions.RemoveEmptyEntries);//StringSplitOptions.RemoveEmptyEntries:去除空字符串的数组元素for (int i = 0; i < s2_1.Length; i++){Console.Write('['+s2_1[i]+"] ");}Console.WriteLine();for (int i = 0; i < s2_2.Length; i++){Console.Write('['+s2_2[i]+"] ");}输出结果:[a] [b] [c] [] [] [1] [2] [1] [1][a] [b] [c] [1] [2] [1] [1]
4)String的静态方法 直接通过类来调用
判断字符串是否为null或者是空字符串:String.IsNullOrEmpty(string value)不区分大小写比较。案例:验证码String.Equals(string a, string b, StringComparison. OrdinalIgnoreCase)把一个数组(集合)用分隔符separator连接为一个字符串。String.Join(string separator, params string[] value)
string s1 = null;//s1未指向任何字符串对象string s2 = "";//s2指向长度为0的空字符串对象 空字符串string s3=" ";//s3指向长度为1的空字符串对象-------string s1 = null;//s1未指向任何字符串对象string s2 = "";//s2指向长度为0的字符串对象 空字符串Console.WriteLine(string.IsNullOrEmpty(s1));//truestring s3 = "aab";string s4 = "Aab";Console.WriteLine(string.Equals(s3,s4));//判断字符串是否完全一样 falseConsole.WriteLine(string.Equals(s3,s4,StringComparison.OrdinalIgnoreCase));//true 不区分大小写int[] nums = { 1, 2, 3, 4, 5 };string num = string.Join(",", nums);Console.WriteLine(num);//1,2,3,4,5
5)StringBuilder
1、使用反编译发现
String s7="111"+"222"+"333"+"444"+"555"会被优化为 String s7 = "111222333444555";但是String s6 = s1 + s2 + s3 + s4 + s5;就没那么幸运了,每次+都会生成一个String对象,当连接字符串比较多的时候就会产生临时字符串对象。
2、使用StringBuilder拼接字符串则不会有临时字符串对象的问题:
StringBuilder sb = new StringBuilder();sb.Append(s1);sb.Append(s2);sb.Append(s3);
因为Append方法把this返回了,还可以sb.Append(s1).Append(s2).Append(s3);最后使用String s = sb.ToString()一次性生成拼接结果字符串即可class Program{
static void Main(string[] args){
/*string s1 = "aaa" ++"aaaaa"+"bbb";Console.WriteLine(s1);*/string s1 = "aaa";string s2 = "bbb";string s3 = "ccc";string s4 = "ddd";string s5 = "afadsf";string s6 = s1 + s2 + s3 + s4 + s5;
StringBuilder sb = new StringBuilder();/*sb.Append(s1);sb.Append(s2);sb.Append(s3);sb.Append(s4);sb.Append(s5);sb.Append(33);*/sb.Append(s1).Append(s2).Append(s3).Append(s4).Append(s5);sb.AppendLine("hello");sb.AppendLine("afasdfads");
string s7 = sb.ToString();Console.WriteLine(s7);
Person p1 = new Person();p1.Eat().Sleep().Dota();//链式编程 JqueryConsole.ReadKey();
}
}class Person{
public Person Eat(){
Console.WriteLine("吃饭");return this;
}public Person Sleep(){
Console.WriteLine("睡觉");return this;
}public Person Dota(){
Console.WriteLine("打Dota");return this;
}
}
6)可空int(值类型)
int等是值类型,不能为null。有时想表达“不知道数字是多少”的时候,用int任何值表示都不合适。C#中可以用“int?”表示“可空的int”。注意类型转换:int? i1=5;if(i1!=null){int i= (int)i1;}也可以通过i1.HasValue判断是否为null、i1.Value来获得值。int? i = null;int? i2 = 3;if (i == null){
Console.WriteLine("i为null");
}if (i2 != null)//i2.HasValue{
//i2++;i2 = i2 + 3;//int i3 = i2;//把可能为null的int?赋值给一定不为null的intint i3 = (int)i2;//i2.ValueConsole.WriteLine(i2);
}long? l = null;
练习:把阿拉伯数字转换为中文金额数字:123→壹佰贰拾三圆2.异常(Exception)
static void ZHuan(int num)
{
string[] nums = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
string[] wei = { "", "", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "亿", "拾", "佰", "仟", };
if (num < 0)
{
throw new Exception("num不能为负数!");
}
string num1 = Convert.ToString(num);
int len = num1.Length;
string tmps, sb;
sb = "";
int i;
for ( i= 1; i <= len; i++)
{
tmps = num1.Substring(len - i, 1);
//sb = nums[Int32.Parse(tmps)] + wei[i] + sb;
sb= string.Concat(nums[Int32.Parse(tmps)] + wei[i], sb);
}
sb= sb.Replace("零拾", "零").Replace("零佰", "零").Replace("零仟", "零");
for (i = 1; i <= 6; i++)
{
sb = sb.Replace("零零", "零");
}
sb=sb.Replace("零萬", "萬").Replace("零億", "億").Replace("零零", "零");
sb += "圆整";
sb = sb.Replace("零圆", "圆");
Console.WriteLine(sb);
}
*异常发生在程序发生的不正常情况下。异常以一个异常类对象的形式抛出,异常类描述异常信息、发生的位置等。
*异常的根类为Exception。异常类一般都继承自Exception
*自定义异常类
class MyException:Exception{public MyException(string msg) : base(msg) { }}throw new MyException("自定义异常信息");
*抛出异常:
“System.NullReferenceException”类型的未经处理的异常在 ExceptionTest.exe 中发生
其他信息: 未将对象引用设置到对象的实例。
*异常捕获:
try{Console.WriteLine("ToString()开始");String s = null;//s1没有指向任何对象s.ToString();//调用s所指向的对象的ToString方法//一旦try代码块中发生异常,则代码块中异常点之后的代码就不会执行了Console.WriteLine("ToString()结束");}catch (NullReferenceException ex){//把可能发生异常的代码放到try代码块中//catch捕获代码段中的NullRefernenceException异常//如果捕捉到了,e就代表异常对象Console.WriteLine("为空"+ex.Message);}
*e就是发生异常的异常类对象,变量名只要不冲突就任意。
*在异常处理中,一旦try里面有问题了。放弃try代码块中之后的代码,直接跳到catch里面执行。如果try代码后还有代码,则处理完catch后还会继续执行。
*多个异常的处理
try{
int a = 10;int b = 0;Console.WriteLine(a / b);int[] arr = { 1, 2, 3 };
Console.WriteLine(arr[3]);
}catch (DivideByZeroException ae){
Console.WriteLine("除数不能为0");
}catch (IndexOutOfRangeException ae){
Console.WriteLine("数组越界异常");
}
可以catch住父类异常,这样就可以抓住所有子类异常了,但是强烈不建议大家这样做,特别是不要没理由的catch(Exception ex)
好的异常处理习惯:
不要只是把异常catch住什么都不做或者只是打印一下,这不是正常的“异常处理”。不知道怎么处理就不要catch,出错比“把错误藏起爱”好。这样以为“不会出错了”,其实是把异常“吃掉了”,会让程序陷入逻辑混乱状态,
要科学合理的处理异常(以后经常用就明白了)。
try{//有可能有问题代码}catch(异常类型 异常变量){//处理方式}finally{//无论“有可能有问题代码”是否出错都要执行的代码}
*finally中一般进行资源的回收等
*注意:在vs调试的情况下,finally的执行可能看不到,因为vs会把异常抛出阻断代码执行,如果想验证是否都会进入finall,可以按CTRL+F5执行程序。
*可以try{}catch(){},try{}catch(){}finally{},try{}finally{}