异常_正则表达式
异常try…catch
在很多情况下,我们不确定程序是否能够正常运行,尤其是在需要第三方配合时,比如:用户输入、操作文件、连接数据库等等情况下,会有一些不可控的因素导致程序出现错误。因此,我们需要一种机制来处理程序的意外错误,这就是try…catch语句的应用范围了。
语法
try{ //有可能出现错误的代码 } catch(Exception 异常变量) { //对异常进行处理 }finally { //无论是否出现异常都会被执行的代码 }
其中:
try用来尝试性的执行可能出错的代码,如果代码出错的话就会产生一个Exception异常对象,并将这个异常对象传入的catch语句中,try区域中报错之后的部分不会执行,而是直接去执行catch中代码。如果try区域中没有出错则catch部分中的代码就不会被执行。
try语句在执行的时候,性能是很低的,因此需要尽可能的避免使用try语句,通常我们只在需要第三方配合的情况下,使用try语句。
finally部分是可以省略的。
示例:
try { Console.WriteLine("请输入数字"); string sNum = Console.ReadLine(); float fNum = float.Parse(sNum); Console.WriteLine("已成功转换为数值"); } catch (Exception e) { Console.WriteLine("您的操作有误"); Console.WriteLine(e.ToString()); } finally { Console.WriteLine("操作完毕"); } Console.WriteLine("最后try之外的代码");
Exception对象
就是C#用来存放错误信息的一个类,(e变量)包含的错误的文本信息,以及错误的类型。
catch (FormatException e) //Exception的子类来定义错误对象 { if(e is System.FormatException) Console.WriteLine("您的操作有误"); //Console.WriteLine(e.GetType().ToString()); }
手动抛出异常
它的作用就是手动制造一个错误信息,让程序中断并且(在try语句中不会中断)报错。比如:有时需要提醒其他程序员,这个代码有需要修改的地方。
语法:
throw异常对象;
示例:
throw new Exception();
throw new NotImplementedException();
或
FormatException e = new FormatException();
throw e;
string与stringBuilder类
string与stringBuilder都是用来存放字符串的类型,要想了这两者的区别,首先要明白栈内存、堆内存和string的特征。
string的特征之一:当我们修改字符串的时候,并不是在真正的修改字符串的原值,而是在堆内存中开辟了一个新的空间,并在其中创建了一个新的字符串,然后将栈内存中的变量名指向了新的字符串所在的地址。
正是因为string的这个特征,所以字符串在需要频繁修改时性能会比较差。
因此,我们需要使用另外一种工具:stringBuilder来解决这个问题。当我们对stringBuilder进行修改时,修改的就是堆内存中的原值。
定义语法:
StringBuilder 变量名 = new StringBuilder();
或
StringBuilder 变量名 = new StringBuilder(“字符串”);
它的赋值过程与string不同,不能直接将双引号中的字符串直接赋值给stringBuilder的实例对象。
追加字符串:
StringBuilder不像string类型,不能用+加法运算符来追加字符串,而是必须用Append()来向字符串的末尾追加字符内容。
示例:
StringBuilder sb = new StringBuilder("这是一个字符串"); sb.Append(",说的对。"); Console.WriteLine(sb.ToString()); 其他常用方法 StringBuilder.Insert(位置 , 内容) 将字符串插入到当前StringBuilder的指定位置。 StringBuilder.Remove(开始位置 , 删除长度) 从StringBuilder的指定位置开始删除指定长度个字符。 StringBuilder.Replace(原字符串 , 新字符串) 用指定字符串替换, StringBuilder中的能够匹配的原字符串。
正则表达式
是一种专门用来搜索和匹配字符串的机制,它能够用一些较复杂的规则来约定你要搜索的字符串的特征和范围,类似于通配符*。正则表达式不仅仅在C#中有效,它同样可以在javascript、jquery、php、java等等语言中有效。
基本语法
正则表达式它拥有一套自己的语法规则,常见的语法包括:字符匹配、字符定位、转义匹配等等。
字符格式 |
语法解释 |
示例 |
\d |
匹配数字(0~9) |
\d匹配8,不匹配12 |
\D |
匹配非数字 |
\D匹配c,不匹配3 |
\w |
匹配任意单字符(字母或数字) |
\w\w匹配A3,不匹配@3 |
\W |
匹配非单字符 |
\W匹配@,不匹配c |
\s |
匹配空白字符 |
\d\s\d匹配3 8,不匹配123 |
\S |
匹配非空字符 |
\S\S\S匹配A#4,不匹配3 d |
. |
匹配任意字符 |
....匹配A$ 5,不匹配换行 |
[…] |
匹配方括号中任意字符 |
[b-d]匹配b、c、d,不匹配e |
[^…] |
匹配非括号中的字符。 |
[^b-d]匹配e、a,不能匹配b、c、d |
重复匹配语法
格式 |
语法解释 |
示例 |
{n} |
匹配n次字符 |
\d{3}匹配\d\d\d,不匹配\d\d或\d\d\d\d |
{n,} |
匹配n次或n次以上 |
\w{2,} 匹配\w\w或\w\w\w以上,不匹配\w |
{n,m} |
匹配n次以上m次以下 |
\s{1,3}匹配\s或\s\s或\s\s\s,不匹配\s\s\s\s |
? |
匹配0或1次 |
5?匹配5或0,不匹配非5非0 |
+ |
匹配一次或多次 |
\S匹配一个或更多\S |
* |
匹配0次以上 |
\W*匹配0以上\W |
字符定位语法
格式 |
语法解释 |
^ |
定位后面模式的开始位置,就是从什么位置开始进行判断 |
$ |
前面的规则位于字符串末端 |
\A |
前面规则的开始位置 |
\z |
前面规则的结束位置 |
\Z |
前面规则的结束位置(换行前) |
\b |
匹配一个单词的边界 |
\B |
匹配一个非单词的边界 |
转义匹配语法:
格式 |
语法解释 |
\n |
换行 |
\r |
回车 |
\t |
制表符 |
\v |
垂直制表符 |
\f |
换页 |
\c+大写字母 |
匹配Ctrl-大写字母,比如:\c5-匹配Ctrl + 5 |
“\”+实际字符 |
范围是 \ . * + ? | () {} ^ $ ,例如:\\匹配 \ 因为这些字符已经有意义了,所以我们需要用转义字符才能使用它。 |
在C#中使用正则表达式
需要用Regex类(隶属于System.Text.RegularExpressions命名空间),它就是用来构造和使用正则表达式的类,其常用的类成员包括:IsMatch()、Replace()、Splite()和Match类。
IsMatch()方法
该方法用于测试一个字符串是否满足指定的正则表达式,返回bool值,满足则返回true,否则返回false 。
示例:匹配一个字符串是否是重庆地区的座机号码
正则表达式:023\d{8}\z
//正则表达式 string RegeTest = @"023\d{8}\z"; //两个测试电话号码 string testPhone = "01089562341"; string testPhone2 = "02381818181"; //第一个参数是被检测的字符串,第二个参数是正则表达式 bool isCQ = Regex.IsMatch(testPhone, RegeTest); Console.WriteLine("第一个是否为重庆座机号:"+isCQ); isCQ = Regex.IsMatch(testPhone2, RegeTest); Console.WriteLine("第二个是否为重庆座机号:" + isCQ);
Replace()方法
替换字符串中,能够被正则表达式匹配到的部分
示例:替换文本中的电子邮件地址
电子邮件地址的正则表达式:[email protected] \w{2,}@\w{1,}\.\w{1,10}
//正则表达式 string RegeTest = @"\w{2,}@\w{1,}\.\w{1,10}"; //邮件地址 string msg = "我厂需要采购钢材20万砘,我们的email是 [email protected]"; if (Regex.IsMatch(msg, RegeTest)) { Console.WriteLine(Regex.Replace(msg, RegeTest, "*********")); //第一个参数是被检测的字符串,第二个参数是正则表达式,第三参数代表替换为该字符串 } else Console.WriteLine("没有电子邮箱地址");
Split()方法
Split方法能够帮助我们将一个字符串分隔为多个部分,按照这个字符串中重复出现的字符来进行分隔。Regex.Split()支持将多个字符作为分隔符。
string names = "小明_A_小花_B_小红_C_小芳_D_小强"; string[] nArr = Regex.Split(names,"_\\w_"); foreach (string str in nArr) { Console.WriteLine(str); }
小练习:
定义多个字符串,其包含有正确的身份证号与错误的身份证号。要求用正则表达式来判断哪些身份证合法,哪些不合法。
判断是否为重庆地区的合法身份证号。500….共18位。
判断是否为正确的手机号。1开头
开发一个简单的正则表达式验证器,输入两个字符串,第一个是正则表达式,第二个是要验证的字符串,然后显示两者是否匹配。
局部类partial
局部类型partial允许我们将一个类、结构体或接口分成几个部分,分别存放在几个不同的.cs文件中。
它适用于以下几种情况:
类比较大,需要区分为几个文件来存放。
一个类型中的部分代码是由代码生成器自动生成的,不宜与我们的代码混合在一起。
需要多个人合作编写一个类。
因此,它只是一种工作方式,而不一个语法概念或功能。
定义方法:
在同一个命名空间中,用partial来定义分布在同一个或不同.cs文件中的同名class,则这些位于不同物理位置的类,在逻辑上属于同一个类。
示例1:
partial class Program { static void Main(string[] args) { test(); } } partial class Program { static void test() { Console.WriteLine("这是另外一个cs文件中的局部类"); } }
示例2:
dog.cs文件中:
partial class dog { public string name { get; set; } }
dog1.cs文件中:
partial class dog { public void bark() { Console.WriteLine("汪汪叫"); }
dog2.cs文件中:
partial class dog { public void eat() { Console.WriteLine("烤鸡翅膀,那个我最爱吃"); } }
在Program.cs文件中:
static void Main(string[] args) { dog d1 = new dog(); d1.name = "小白"; d1.bark(); d1.eat(); }
泛型委托
就是在委托中使用泛型
泛型委托
public delegate T delTest<T>(T i); static void Main(string[] args) { Program p = new Program(); delTest<string> dt1 = new delTest<string>(p.showS); dt1("ssss"); delTest<float> dt2 = new delTest<float>(p.showF); dt2(3.14f); } public string showS(string s1) { Console.WriteLine("ShowSS正在被执行"); return s1; } public float showF(float f1) { Console.WriteLine("ShowFF正在被执行"); return f1; }
委托可以让方法像变量一样被传递
partial class Program { static void Main(string[] args) { //包含可以执行方法的委托实例 Test.delTest del1 = new Test.delTest(showInt); Test t1 = new Test(del1,11); } static void showInt(int i) { Console.WriteLine(i+100); } } class Test { public delegate void delTest(int i); //用委托类型来定义构造函数的传入参数 //应用这里的more就用于接收一个包含了方法的委托实例。 public Test(delTest more, int i) { more(i); } }
原文地址:https://www.cnblogs.com/yigegaozhongsheng/p/9598480.html