C#基础语法补充
[学习笔记]前接:https://www.cnblogs.com/aland-1415/p/7360509.html
一、异常处理
1、格式
try{ } catch{ } catch{ } ... finally{ } 抛出异常: Catch(Exception e){ ... Throw e; }
2、C#中的异常类主要直接或间接地派生于System.Exception类的。
System.ApplicationException 支持由应用程序生成的异常; System.SystemException 所有预定义的系统异常基类,包含以下所有的类: System.IO.IOException I/O异常; System.IndexOutOfRangeException 方法指向超出范围的数组索引时生成的错误; System.ArrayTypeMismatchException 数组类型不匹配异常; System.NullReferenceException 处理依从一个空对象时生成的错误; System.DivideByZeroException 处理当除以0时生成的错误; System.InvalidCastException 处理类型转换期间生成的错误; System.OutOfMemoryException 处理空闲内存不足错误; System.StackOverflowException 处理栈溢出生成的错误;
二、文件的读写
1、一般文件读写
FileStream<object_name>=newFileStream(<fileName>,<FileMode Enumerator>,<FileAccess Enumerator>,<FileShare Enumerator>);
FileMode 参数有Append,Create,CreateNew(如果文件存在则抛异常),Open(如果文件不存在则抛异常),OpenOrCreate,Truncate(文件不存在抛异常,打开文件会重新写入,但会保留文件的初始创建日期);
FileAccess 参数有Read,ReadWrite,Write;
FileShare 参数有Inheritable,None,Read,ReadWrite,Write,Delete;
2、System.IO 命名空间中常用非抽象类:
BinaryReader 二进制流读取数据;
BinaryWriter 二进抽格式写入数据;
BufferedStream 字节流的临时存储;
Directory 有助于操作目录结构;
DirectoryInfo 对目录执行操作;
DriveInfo 驱动器信息;
File 有助于处理文件;
FileInfo 对文件执行操作;
FileStream 用于对文件中任何位置的读写;
MemoryStream 用于随机访问存储在内存中的数据流;
Path 对路径信息执行操作;
StreamReader 从字节流中读取字符;
StreamWriter 向一个流中写入字符;
StringReader 读取字符串缓冲区;
StringWriter 写入字符串缓冲区;
3、例:
FileString fs = new FileStream("fileName",FileMode.Append,FileAccess.Write);
StreamWriter sw = new StreamWriter(fs); sw.WriteLine("Hello!"); sw.Close(); fs.Close();
三、正则表达式
1、匹配规则
[character_group] 取其中一个字符,也可用-号来确定一个范围; \w 任何单词字符; \W 任何非单词字符; \s 任何空白字符; \S 任何非空白字符; \d 十进制数字; \D 非十进制数字 \p{name} 与name指定的Unicode通用类别或命名块中的任何单个字符匹配 \P{name} 与不在name指定的Unicode通用类别或命名 ^ 从字符串或一行的开头处开始匹配,如果是在[ ] 内则表示“非” $ 从字符串或行的结尾处开始匹配; \A 匹配必须出现在字符串的开头; \Z 匹配必须出现在字符串的末尾,用法同$; \G 匹配必须出现在上一个匹配结束的地方; \b 匹配一个单词边界; \B 匹配非单词边界; * 贪婪匹配{0,∞} + 贪婪匹配{1,∞} ? 贪婪匹配{0,1} {n} 匹配一个元素n次; {n,} 贪婪匹配一个元素n次以上; {n,m}贪婪匹配一个元素至少n次,最多m次 (以上限定符后跟一个?就表示非贪婪匹配,即尽可能少的匹配) (subexpression) 捕获匹配子表达式,并将其分配到一个从零开始的序号中; (?<name>subexpression) 将匹配的子表达式捕获到一个命名组中; \number 反向引用。匹配编号子表达式的值; \k<name> 命名反向引用。匹配命名表达式的值; $number 按组number替换匹配的字符串; ${name} 按命名组name匹配子字符串; $$ 替换$字符; $& 替换整个匹配项的一个副本; $` 替换匹配前的输入字符串所有文本; $' 替换匹配后的输入字符串的所有文本; $+ 替换最后捕获的组; $_ 替换整个输入字符串; (?imnsx-imnsx) 在模式中间对诸如不区分大小写这样的选项进行设置或禁用; (?#注释) 内联注释;
2、Regex类(用于表示一个正则表达式);
public bool IsMatch(string input) 指示Regex构造函数中指定的正则表达式是否在指定输入字符串中找到匹配; public bool IsMatch(string input,int startat) 指示Regex构造函数中指定的正则表达式是否在指定输入字符串中找到匹配,从字符串中指定的开始位置开始; public static bool IsMatch(string input,string pattern) 指示指定的正则表达式是否在指定的输入字符串中找到匹配项; public MatchCollection Matches(string input) 在指定的输入字符串中搜索正则表达式的所有匹配项; public string Replace(string input,string replacement) 在指定输入字符串中把所有匹配正则表达式模式的所有匹配字符串替换为指定的替换字符串; public string[] Split(string input) 把输入字符串分割为子字符串组;
四、多线程(System.Threading.Thread)
1、System.Threading.Thread 类属性:
CurrentContext 获取线程正在其中执行的上下文;
CurrentCulture 获取或设置当前线程的区域性;
CurrentPrinciple 获取或设置线程的当前负责人;
CurrentThread 获取当前正在运行的线程;
CurrentUICulture 获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定资源;
ExecutionContext 获取一个ExecutionContext对象;
IsAlive 获取当前线程的执行状态;
IsBackground 判断线程是否为后台运行;
IsThreadPoolThread 获取一个值,该值指示线程是否属于托管线程池
ManagedThreadld 获取当前托管线程的唯一标识符;
Name 获取或设置线程名称;
Priority 获取线程调试优先级值;
ThreadState 获取线程当前状态;
2、System.Threading.Thread方法:
Start() 开启线程;
Sleep() 暂停线程;
Abort() 销毁线程
Interrupt() 中断处于WaitSpleepJoin线程状态线程;
Join() 在继续执行标准的COM和SendMessage消息处理期间,阻塞调用线程,直到某个线程终止为止;
BeginCritical
五、事件(event)
1、事件使用“发布-订阅(publisher-subscriber)模型
发布器:是一个包含事件和委托定义的对象,事件和委托之间的联系也定义在这个对象中。发布器类的对象调用这个事件,并通知其他对象;
订阅器:是一个接受事件并提供事件处理程序的对象。在发布器类中委托调用订阅器类中的方法
2、声明事件:
public delegate void BoilerLogHandler(string status); public event BoilerLogHandler BoilerEventLog;
相当于把BoilerEventLog这个事件绑定在delegate上了,它既是一个委托BoilerEventLog(string a)也是一个事件BoilerEventLog;
六、补充内容
1、特性(Attribute)
用于在运行时传递各种元素的行为信息的声明性标签,通过放置在它所应用的元素前面的[]号来描述;
AttributeUsage
Conditional
Obsolete
2、属性(property)
即set,get方法,且两个方法都没参数也没有小括号,使可以访问和修改private属性;
抽象类也可以拥有抽象属性,这些属性在子类中应被实现;
例:
public abstract int A { set; get; }
3、索引器(indexer)
允许一个对象可以像数组一样被索引,可以使用[]来访问类的实例;
一维索引器语法:
elementType this[int index] { get { //返回index指定的值 } set { //设置index指定的值 } }
索引器可以被重载,且可以是不同类型的多维参数;
4、委托(delegate)
声明委托(相当于新建一个类): delegate <return type> <delegate-name> <parameter list>;
一旦声明了委托类型,委托对象必须使用new来创建,创建时的参数是一个具有相同类型参数和返回数据类型的方法名,然后可用这个new的名字来代替这个方法进行使用;
多播:委托对象可使用“+”运算符进行合并,但只有相同类型的委托可合并,“-”可用于从合并的委托中移除组件;多播可以完成一次调用多个方法的目的;
一个类中的多个方法可只新建一个委托对象,其他方法用“+”进行合并;
5、匿名方法
没有名称中有主体,匿名方法不需要指定返回类型,通过delegate关键字创建委托实例来声明
delegate void NumberChange(int n); NumberChange nc = delegate(int x) //匿名委托实例 { Console.WriteLine(" "); }
6、泛型(Generic)
通过使用System.Collections.Generic后可使用泛型
使用时在类名后加一个<name>来代替一种数据类型,在要具体实例一种数据时将name换成相应的数据名即可;
泛型委托: delegate T NumberChange<T>(T x);