System.Reflection
Type类
每一个类都有自己的Type对象
程序集的属性说明
通过遍历这个数组即可获得所有的内部成员-字段(因为权限问题无法获取私有)
获取内部属性
获取内部的方法(也会获取父类继承到的方法)
加载其他的程序集
System.Reflection
Type类
每一个类都有自己的Type对象
程序集的属性说明
通过遍历这个数组即可获得所有的内部成员-字段(因为权限问题无法获取私有)
获取内部属性
获取内部的方法(也会获取父类继承到的方法)
加载其他的程序集
定义一个事件清单,需要的人自己去写,工具人下楼的时候拿着清单去执行相应的任务。
1 创建工具人类(干活的)
2 创建懒人类(派人干活的)
3 运行类中进行初始化,相应的人创建出来
4 工具人类里面定义一个委托
5 懒人将相应的任务委派给工具人下楼执行
也可以移除任务
委托,相当于懒人们订阅了工具人的消息,工具人发消息之后,触发了对应懒人的事件
问题1:+=不要写成=了,不然会覆盖掉之前所有的任务
问题2:工具人没有下楼,但消息发出了,导致出现没有下楼但对应的事件执行了
解决方法:让只有工具人可以消息发布,通过事件的方式解决
通过事件解决以上两个问题:
Lambda表达式用于代替匿名方法
但是要注意:如果lambda表达式的函数体里面有多条语句,则不能省略花括号
可以访问外部变量
容易受到外部变量的影响,导致结果不可控,慎用
匿名方法:不需要定义就可以使用的方法
匿名方法,lambda表达式,一般用于代码量很少的情况
多播委托只能得到调用的最后一个方 法的结果
一般返回类型声明为void
Action action1 = Test1;
action2+=Test2;
action2-=Test1;
也可以把方法移除,也可以多添加几次(多执行几次)
逐个执行,如果中间异常,则中断
使用Func的方式,则只能返回最后一个返回值
返回一个通用的委托类的数组(里面有多少个委托)
调用这些方法(和上面的直接调用方式一样)
1 原始的冒泡排序方法
bool swapped = true;
do{
swapped = false;
for(int i =0;i<sortArray.Length -1;i++){
if(sortArray[i]>sortArray[i+1]){
int temp= sortArray[i];
sortArray[i]=sortArray[i+1];
sortArray[i+1]=temp;
swapped = true;
}
}
}while(swapped);
2 定义一个数组,将其进行排序并打印出来
但是职能对int类型进行排序
3 新建一个员工类,包括员工名字,员工工资
4 创造雇员数组(一系列雇员的信息)
目的是将这个数组进行排序
5 雇员类里加入薪水比较的方法,返回布尔
优点:比较灵活,当前是比较工资Salary,后面可以选择比较其他的数值(比如年龄、工龄等)
6 创建一个新的方法,用于比较任意类型,使用泛型T
7 将原有的冒泡排序算法的代码拷贝到新的排序算法内,并进行修改
8 将数组和比较方法传入新的排序方法并执行
9 验证最后是否排序好了
Action:类型是void(返回值为空),可以0~多个参数
可以无返回值无参数
可以指定参数类型(一个参数)
指定多个参数类型
Action必须没有返回值,可以没有参数
Func 必须要有返回值,可以没有参数,可以0~16个参数
如果是带有参数的类型,则前面指定参数类型,最后一个必须指定返回值类型
委托一个方法的引用,但其实本质还是一个变量
可以被数组存储,也可以被其他方法传递和引用
参数和返回值都一样,可以被同一个类型的委托调用,例如:
用同一个委托指向这两个方法
可以声明一个委托类型的数组
使用for循环可以调用多个方法
把方法当成参数传递过去
委托是一个类型,用于赋值一个方法的引用
1 先定义
2 后使用
定义:delegate void 委托名字(参数); //没有方法体,类型是void
使用:委托名 实例名 = null
可以指向实例方法,也可以指向静态方法
同一类的静态方法可以直接访问
如果需要引用其他类的方法,加上对应路径即可
委托好之后,可以直接用这个变量代替使用这个方法了
委托调用的时候,不能为空,否则会抛出异常
为了避免异常,可以检测委托是否为空
也可以声明一个字符串类型的委托
创建一个委托用于字符串的转换
也可以采用new的方法来传递方法
则一匹配
|
或
重复单个字符,使用{2},只会作用于一个字符
如果需要匹配多个,则可以加一个括号,将多个字符打组
匹配括号
\(
第一位是2,则第二位为0~4,第三位是任意
第一位是2,则第二位是0~5,则第三位是0~1
第一位是0~1,则后面两位任意
替换字符(但不会修改原字符)
限制指定长度的字符串
重复描述字符:
{5,12} 限制5~12个字符
{5} 只有5个字符
{5, } 至少有5个
zz
常用元字符
定位元字符(匹配开始,匹配结束)
IsMatch 判断是否符合,返回布尔值
Match 反馈一个对象
split拆分
\d 数字
补集 \D 除了数字(反义字符)
\w 大小写字母0~9
补集 \W 除了以上这些字符
[abcdefg] 括号内字符都符合,括号外的字符都不符合
可以使用-符号,跨区指定
跨区的补集
普通字符、特殊字符(元字符,规则语法)
《元字符文档》
引入命名空间
Regex.IsMatch 返回一个布尔值
字符串前增加一个@,可以让特殊字符失效
正则表达式,必须增加@,否则会被识别成其他特殊符号
\d 任意数字
\d* 0或者多个数字
\d\d\d\d\d 指定数量数字(5个)
^A 必须以某个字符(A)为开头
$A 必须以A为结尾
例如“验证QQ号
数学算法,文本检索、匹配
1,检索:通过正则表达式,从字符串中获取我们想要的部分
2,匹配:判断给定的字符串是否符合正则表达式的过滤逻辑
检查书写规则:匹配邮箱、手机号、包含数字大小写等等
建议直接查找怎么写即可,不用特别记忆或研究
StringBuilder类(位于System.Text命名空间下)
1、创建StringBuilder对象
StringBuilder sb = new StringBuilder("www.sikiedu.com");
string存储在静态存储区,修改会完全新建一个
stringBuilder存储在堆中,修改的对象是同一个(修改量大、频繁变更的时候使用)
StringBuilder sb = new StringBuilder(20);
创建一个初始容量‘如果不够的话会自动扩容(如果预先得知字符串长度,会比较节省性能)
sb.Capacity(获取字符串长度)
StringBuilder sb = new StringBuilder("www.sikiedu.com",100);
同上:指定初始值,指定初始容量
关于StringBuilder对象创建的时候的内存占用
2、Append()方法,给当前字符串追加一个字符
3、Insert()追加特定格式的字符串
4、Remove()从当前字符串中删除字符
5、Replace()在当前字符串中,用某个字符或者字符串全部替换另一个字符或者字符串
6、ToString()把当前stringBuilder中存储的字符串,提取成一个不可变的字符串
10、Format()方法,格式化字符串 - 静态方法 https://www.cnblogs.com/net-sky/p/10250880.html
https://www.runoob.com/csharp/csharp-string.html
https://docs.microsoft.com/zh-cn/dotnet/api/system.string.format? view=net-5.0
对应格式可以使用多次(方便复用)
让字符串以相应格式输出
日期格式输出
也可以使用ToString来转换(使用率高)
用于表示时间的:
DateTime
DateOnly
TimeOnly
11、IndexOf()方法,取得字符串第一次出现某个给定字符串或者字符的位置
12、IndexOfAny()方法,找到一个字符串里面任意一个字符(模糊匹配)
13、Insert()把一个字符串实例插入到另一个字符串实例的制定索引处
14、Join()合并字符串数组,创建一个新字符串
关于字符串的更多方法
1、CompareTo()方法,比较字符串的内容
2、Replace()用另一个字符或者字符串替换字符串中给定的字符或者字符串
(注意,更换之后,原来处于静态存储区的字符串不变,而是新创建了一个,将变量的引用换成新的)
3、Split()在出现给定字符的地方,把字符串拆分称一个字符串数组
打印出来的不是分割出来的数组内容
而是一个类型
用一个数组容纳分割之后的内容,使用遍历的方式打印出来
4、SubString()在字符串中检索给定位置的子字符串(检索并截取)
5、ToLower()把字符串转换成小写形式
6、ToUpper()把字符串转换成大写形式 7、Trim()删除首尾的空白
7、Trim()删除首尾的空白(一般用于web开发中去掉账号中的无效空格)
以下是静态方法
8、Concat()方法,合并字符串 - 静态方法
9、CopyTo()方法,把字符串中指定的字符复制到一个数组中
10、Format()方法,格式化字符串 - 静态方法 https://www.cnblogs.com/net-sky/p/10250880.html https://www.runoob.com/csharp/csharp-string.html https://docs.microsoft.com/zh-cn/dotnet/api/system.string.format? view=net-5.0
11、IndexOf()方法,取得字符串第一次出现某个给定字符串或者字符的位置
12、IndexOfAny()方法,
13、Insert()把一个字符串实例插入到另一个字符串实例的制定索引处
14、Join()合并字符串数组,创建一个新字符串
System.String类
1、创建字符串 string s = "www.sikiedu.com";
2、获取字符串长度 s.Length(属性)
3、比较字符串是否一样 s=="www.sikiedu.com"
4、字符串连接 s="http://"+s;
5、使用类似索引器的语法来取得字符串中的某个字符 stringName[index] s[0] s[3
字符串是引用类型
字符串是静态的(放置在精
关于string字符串:string创建的字符串实际上是一个不可变的数据类型,一旦对字符 串对象进行了初始化,该字符串就不能改变内容了,上面的示例中实际上是创建了一个新的 字符串,把旧字符串的内容复制到新字符串中。然后把新字符串的引用赋值为字符串的对 象。(重复修改给定的字符串,效率会很低
internal 命名空间内部
如何使用其他命名空间的类?
命名空间可以嵌套(类似文件夹)
常用的命名空间
命名空间部分代码引用自:https://www.runoob.com/csharp/csharp-namespace.html C#常用命名空间 https://www.cnblogs.com/makesense/p/4500955.html
Encoding.UTF8.GetByte(message);