标签:支持 操作文件 需要 处理程序 导致 子类 自己的 gate 表达
异常_正则表达式
异常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()方法
替换字符串中,能够被正则表达式匹配到的部分
示例:替换文本中的电子邮件地址
电子邮件地址的正则表达式:aa550@163.com \w{2,}@\w{1,}\.\w{1,10}
//正则表达式
string RegeTest = @"\w{2,}@\w{1,}\.\w{1,10}";
//邮件地址
string msg = "我厂需要采购钢材20万砘,我们的email是 tom@gmail.com";
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 i);
static void Main(string[] args)
{
Program p = new Program();
delTeststring> dt1 = new delTeststring>(p.showS);
dt1("ssss");
delTestfloat> dt2 = new delTestfloat>(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);
}
}
C#面向对象10_异常_正则表达式
标签:支持 操作文件 需要 处理程序 导致 子类 自己的 gate 表达
原文地址:https://www.cnblogs.com/yigegaozhongsheng/p/9598480.html