winForm基础(二)

MD5加密

  1. //创建MD5对象
  2. MD5 md5 = MD5.Create();
  3. //开始加密
  4. //需要将字符处转换成字节数组
  5. byte[] buffer = Encoding.GetEncoding("GBK").GetBytes(str);
  6. //返回一个加密好的字节数组
  7. byte[] MD5Buffer = md5.ComputeHash(buffer);
  8. //将字节数组转换成字符串
  9. //字节数组--->字符串
  10. //1将字节数组中每个元素按照指定的编码格式解析成字符串 //return Encoding.GetEncoding("GBK").GetString(MD5Buffer);
  11. //2直接将数组ToString();
  12. //3将字节数组中的每个元素ToString()
  13. // 189 273 345 我爱你
  14. // 189 273 345
  15. string strNew = "";
  16. for (int i = 0; i < MD5Buffer.Length; i++)
  17. {
  18. // 把十进制转换为16进制
  19. strNew += MD5Buffer[i].ToString("x2");
  20. }
  21. return strNew;

image.png

事件

指发生一件事情。
注册事件:双击控件注册的都是控件默认被选中的那个事件。
触发事件: 当被触发的时候发生的事件
PLUS : 在Main函数当中创建的窗体对象,我们称之为这个窗体应用程序的主窗体。
也就意味着,当你将主窗体关闭后,整个应用程序都关闭了。

TextBox控件

WordWrap:指示文本框是否换行。
PasswordChar:让文本框显示一个单一的字符
ScollBars:是否显示滚动条
事件:TextChanged 当文本框中的内容发生改变的时候触发这个事件。

Timer组件

在指定的时间间隔内做一件指定的事情。

单选和多选

checked:指示这个控件是否处于选中状态。
默认情况下,在一个窗体中,所有的单选按钮只允许选中一个,可以使用groupbox进行分组。

winForm基础(一)

MDI窗体的设计

1、首先确定一个父窗体。 将IsMdiContainer设置为true。
2、创建子窗体,并且设置他们的父窗体。

Directory 操作文件夹

CreateDirectory 创建文件夹
Delete 删除文件夹
Move 剪切文件夹
Exist 判断是否存在
GetFiles 获得指定的目录下所有文件的全路径
GetDirectory 获得指定目录下所有文件夹的全路径

  1. //创建文件夹
  2. Directory.CreateDirectory(@"C:\a");
  3. Console.WriteLine("创建成功");
  4. Console.ReadKey();
  5. //删除文件夹
  6. Directory.Delete(@"C:\a",true);
  7. Console.WriteLine("删除成功");
  8. Console.ReadKey();
  9. //剪切文件夹
  10. Directory.Move(@"c:\a", @"C:\Users\SpringRain\Desktop\new");
  11. Console.WriteLine("剪切成功");
  12. Console.ReadKey();
  13. //获得指定文件夹下所有文件的全路径
  14. string[] path = Directory.GetFiles(@"C:\Users\SpringRain\Desktop\Picture","*.jpg");
  15. for (int i = 0; i < path.Length; i++)
  16. {
  17. Console.WriteLine(path[i]);
  18. }
  19. Console.ReadKey();
  20. //获得指定目录下所有文件夹的全路径
  21. string[] path = Directory.GetDirectories(@"C:\Users\SpringRain\Desktop\new");
  22. for (int i = 0; i < path.Length; i++)
  23. {
  24. Console.WriteLine(path[i]);
  25. }
  26. Console.ReadKey();
  27. //判断指定的文件夹是否存在
  28. if (Directory.Exists(@"C:\a\b"))
  29. {
  30. for (int i = 0; i < 100; i++)
  31. {
  32. Directory.CreateDirectory(@"C:\a\b\" + i);
  33. }
  34. }
  35. Console.WriteLine("OK");
  36. Console.ReadKey();

MessageBox.Show的用法

  1. MessageBox.Show()的各种用法
  2. 【函数】 <整型> MessageBox(<字符串> Text, <字符串> Title, <整型> nTypeMessageBoxIcon);
  3. 【函数说明】 弹出一个消息框。
  4. 【语法】
  5. 参数:
  6. Text <字符串>,消息框的正文;
  7. Title <字符串>,消息框的标题;
  8. nType <整型>,消息框的类型。
  9. 返回值:<整型>,用户在消息框上点击关闭时的选择的按钮。 MessageBoxIcon:对话框上显示的图标样式。
  10. 【说明】全部都是MessageBox.Show();切记
  11. Show("消息内容", "返回值 确定1",MessageBoxButtons.OK,MessageBoxIcon.Question);
  12. Show("消息内容",, "返回值 确定1 取消2",MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
  13. Show("消息内容", "返回值 终止3 重试4 忽略5",MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
  14. Show("消息内容", "返回值 是6 否7 取消2",MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
  15. Show("消息内容", "返回值 是6 否7",MessageBoxButtons.YesNo, MessageBoxIcon.Hand);
  16. Show("消息内容", "返回值 重试4 取消2",MessageBoxButtons.RetryCancel, MessageBoxIcon.Information);
  17. MessageBoxIcon: 所有图标样式
  18. MessageBoxIcon.Question
  19. MessageBoxIcon.Asterisk
  20. MessageBoxIcon.Information
  21. MessageBoxIcon.Error
  22. MessageBoxIcon.Stop
  23. MessageBoxIcon.Hand
  24. MessageBoxIcon.Exclamation
  25. MessageBoxIcon.Warning
  26. MessageBoxIcon.None

打开文件or文件夹

  1. //点击弹出对话框
  2. OpenFileDialog ofd = new OpenFileDialog();
  3. //设置对话框的标题
  4. ofd.Title = "请选择要打开的文本文件哟亲 O(∩_∩)O~";
  5. //设置对话框可以多选
  6. ofd.Multiselect = true;
  7. //设置对话框的初始目录
  8. ofd.InitialDirectory = @"C:\Users\SpringRain\Desktop";
  9. //设置对话框的文件类型
  10. ofd.Filter = "文本文件|*.txt|媒体文件|*.wmv|图片文件|*.jpg|所有文件|*.*";
  11. //展示对话框
  12. ofd.ShowDialog();
  13. //获得在打开对话框中选中文件的路径
  14. string path = ofd.FileName;
  15. if (path == "")
  16. {
  17. return;
  18. }
  19. using (FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
  20. {
  21. byte[] buffer = new byte[1024 * 1024 * 5];
  22. //实际读取到的字节数
  23. int r = fsRead.Read(buffer, 0, buffer.Length);
  24. textBox1.Text = Encoding.Default.GetString(buffer, 0, r);
  25. }
  26. //--------------------------------------------------------------------------
  27. //打开文件夹
  28. string path = null;
  29. FolderBrowserDialog dilog = new FolderBrowserDialog();
  30. dilog.Description = "请选择文件夹";
  31. if (dilog.ShowDialog() == DialogResult.OK || dilog.ShowDialog() == DialogResult.Yes)
  32. {
  33. path = dilog.SelectedPath;
  34. }
  35. if (!string.IsNullOrEmpty(path))
  36. {
  37. System.Diagnostics.Process.Start("Explorer.exe", path);
  38. }
  39. else
  40. {
  41. MessageBox.Show("请选择路径");
  42. }

保存文件

  1. SaveFileDialog sfd = new SaveFileDialog();
  2. sfd.Title = "请选择要保存的路径";
  3. sfd.InitialDirectory = @"C:\Users\SpringRain\Desktop";
  4. sfd.Filter = "文本文件|*.txt|所有文件|*.*";
  5. sfd.ShowDialog();
  6. //获得保存文件的路径
  7. string path = sfd.FileName;
  8. if (path == "")
  9. {
  10. return;
  11. }
  12. using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
  13. {
  14. byte[] buffer = Encoding.Default.GetBytes(textBox1.Text);
  15. fsWrite.Write(buffer, 0, buffer.Length);
  16. }
  17. MessageBox.Show("保存成功");

字体和颜色

  1. //字体
  2. FontDialog fd = new FontDialog();
  3. fd.ShowDialog();
  4. textBox1.Font = fd.Font;
  5. //颜色
  6. ColorDialog cd = new ColorDialog();
  7. cd.ShowDialog();
  8. textBox1.ForeColor = cd.Color;

process进程

  1. 通过进程打开一些应用程序
  2. Process.Start("calc");
  3. Process.Start("mspaint");
  4. Process.Start("notepad");
  5. Process.Start("iexplore", "http://www.baidu.com");
  6. 获得当前程序中所有正在运行的进程
  7. Process[] pros = Process.GetProcesses();
  8. foreach (var item in pros)
  9. {
  10. //不试的不是爷们
  11. //item.Kill();
  12. Console.WriteLine(item);
  13. }
  14. //通过一个进程打开指定的文件
  15. ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\SpringRain\Desktop\1.exe");
  16. //第一:创建进程对象
  17. Process p = new Process();
  18. p.StartInfo = psi;
  19. p.Start();
  20. // p.star

thread线程

前台线程:只有 所有的前台线程都关闭了才能完成程序的关闭。
后线线程:只要所有的前台线程结束,后台线程自动结束。

  1. //创建一个线程去执行这个方法
  2. th = new Thread(Test);
  3. //标记这个线程准备就绪了,可以随时被执行。具体什么时候执行这个线程,
  4. //由cpu决定
  5. //将线程设置为后台线程 默认为前台线程
  6. //是后台线程吗 IsBackground
  7. th.IsBackground = true;
  8. th.Start();
  9. th.Abort();
  10. th.Start();
  11. //取消跨线程的访问
  12. Control.CheckForIllegalCrossThreadCalls = false;

在.Net下,是不允许跨线程的访问。

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. Thread th = new Thread(Test);
  4. th.IsBackground = true;
  5. th.Start("123"); //在这里传参
  6. //Test();
  7. }
  8. //线程传参
  9. private void Test(object s) //必须是object
  10. {
  11. string ss = (string)s;
  12. for (int i = 0; i < 10000; i++)
  13. {
  14. Console.WriteLine(i);
  15. }
  16. }
  1. //url转码
  2. string str = "https://back-u.cos.ap-guangzhou.myqcloud.com/%E7%99%BD%E9%87%91%E3%83%87%E3%82%A3%E3%82%B9%E3%82%B3%20-%20%E4%BA%95%E5%8F%A3%E8%A3%95%E9%A6%99.flac";
  3. str = System.Web.HttpUtility.UrlDecode(str);
  4. Console.WriteLine(str);

HTML和CSS

html

1、首先在桌面上随便的建一个文件。
2、将创建的文件的名称改为.htm /.html
3、开始写基本的框架标签
HTML中的标签

  1. p标签: 段落标签
  2. &nbsp: 空格
  3. h#: 标题标签
  4. <!--要注释的内容-->:注释符
  5. <img/>: 图片标签,用来显示图片。
  6. src: 表示要显示的图片的路径
  7. heigth: 图片的高度 px
  8. width:图片宽度 px
  9. alt:当图片由于某些原因显示失败的时候所显示的文本
  10. title:当光标移动到图片上的时候显示的文本
  11. <hr/>: 分割线
  12. <font></font>: 字体标签 size =1 ~7 7最大 color:颜色 face:字体系列
  13. a标签:超链接 href表示要连接到的地址 target:打开新网页的方式 _blank表示打开一个新网页进行跳转。
  14. _self 表示在当前页面进行跳转。
  15. 实现页面内部的跳转
  16. 实现页面间的跳转
  17. 发送邮件
  18. <b> 定义粗体文本
  19. <i> 定义斜体
  20. <tt> 定义打字机文本(等宽)
  21. <u> 定义下划线文本
  22. <sup><sub> 定义上下标
  23. <s> 定义加删除线的文本

image.png

  1. <html>
  2. <head>
  3. <title> this is my first html </title>
  4. </head>
  5. <body>
  6. <a name="顶端" href="#底端"> 回到底端</a>
  7. <p>aasdddasda</p>
  8. <p>aasdddasda</p>
  9. <h1> 标题1 </h1>
  10. <a href="https://www.xiaodaizhi.com" target="_blank">花纸<a/>
  11. <img src = "https://h.ap-guangzhou.myqcloud.com/wp-content/uploads/2020/07/71089840_p1.jpg" width="800px" height="600px" border = "1" alt="喜欢啊" title="还行"/>
  12. <br/>
  13. <hr/>
  14. 文字size 1 - 7<br/>
  15. <br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  16. <br/>
  17. <br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  18. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  19. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  20. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  21. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  22. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  23. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  24. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  25. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  26. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  27. <br/><br/>啊啊啊啊我是<font size = "7" color = "blue"></font>
  28. <br/>
  29. <a name="底端" href="#顶端"> 回到顶端</a>
  30. </body>
  31. </html>

css

介绍

CSS是Cascading Style Sheet这个几个英文单词的缩写,翻译成中文是“层叠样式表”的意思。CSS能让网页制作者有效的定制、改善网页的效果。CSS是对HTML的补充,网页设计师曾经为无法很好的控制网页的显示效果而倍感苦恼,CSS的出现解决了这个问题。
Css实现了网页内容和页面效果的彻底分离。
Ctrl+j 弹出智能提示的快捷键

CSS的几种设置方式

(你可以通过怎样的方式向HTML页面中写入CSS代码)
有三种方式可以将样式表加入到HTML文档中,每种方式都有自己的优缺点,这三种方式是:
内联样式表(在标签内设置元素的样式)
嵌入样式表(需要在head标签内写)
外部样式表 link
内联样式表缺点:如果要将同样的样式风格设置到网页中所有的段落上,就需要对每个
标签都进行重复的设置。
嵌入样式表缺点:如果要为整个网站定义通用的的样式风格,也就是同样的样式风格要被应用到很多网页时,使用嵌入样式表,则需要在每个标签中都加入同样的代码段。为了解决这个问题,我们可以使用外部样式表

样式规则的选择器

(通过怎样的途径来获得页面上要设置样式的元素)
1)、HTML Selector
2)、Class Selector (需要给要设置样式的元素的class属性赋值)
3)、ID Selector (需要给要设置样式的元素的id属性赋值)
4)、关联选择器 P EM{background-Color:Yellow}
5)、组合选择器
6)、伪元素选择器
伪元素选择器是指对同一个HTML元素的各种状态和其所包括的部分内容的一种定义方式。例如,对于超链接标签()的正常状态(没有任何动作前)、访问过的状态、选中状态、光标移到超链接文本上的状态,对于段落的首字母和首行,都可以使用伪元素选择器来定义。
目前常用的伪元素有以下几种:
A:active 选中超链接时的状态
A:hover 光标移动到超链接上的状态
A:link 超链接的正常状态
A:visited 访问过的超链接状态
P:first-line 段落中的第一行文本
P:first-letter 段落中的第一个字母

CSS当中的样式属性详解

Css当中的属性非常多,大体上可以分为以下几类:字体、背景、文本、位置、布局、边缘、列表。
1)、字体
字体的属性主要包括文字的字体、大小、颜色、显示效果等基本样式,下面是各种字体属性的详细介绍。
Font-family:该属性用于设置字体系列。
Font-size:该属性定义文字的大小,可以使用度量单位来设置字体的大小,也可以使用一个相对的字体大小。还可以使用绝对的大小标记符。
绝对大小的设置为 xx-small、x-small、small、medium、large、x-large、xx-large中的任意一个。Xx-small为最小,xx-large为最大。
font-style
该属性用于定义字体样式为Normal、Italic或者Oblique(斜体)。
text-decoration
该属性用于在文本中条件下划线、上划线、中划线、闪烁效果。
font-weight
该属性用于设置粗体字的磅值
该属性的值有:normal、bold、bolder、lighter、100~900
2)背景
背景包括背景颜色、背景图像、以及背景图像的控制。
Background-color:设置背景色,transparent表示透明的背景色。
Background-image:设置元素的背景图像
Background-repeat:确定背景图像是否以及如何重复。
这个属性的取值no-repeat:表示背景图像只在元素的显示区域中出现一遍。
Repeat:在水平和垂直方向上垂直。
Repeat-x和Repeat-y分别在水平或者垂直方向上重复
Background-attachment:确定背景图像是否跟随内容滚动,
设置为fixed时,表示固定背景图像,为scroll时,表示图像跟随内容的移动而移动。
Background-position:指定背景图像的水平位置和垂直位置。水平位置的取值可以是left、center、right。也可以是数值。
垂直的取值可以是top、center、bottom。也可以是数值。
文档流
3)文本
文本的属性包括:文字间距、对齐方式、上标、下标、排列方式、首行缩进。
Word-spacing:设置单词之间的间距。
Letter-spacing:设置字符之间的间距
Text-align:设置文本的水平对齐方式,取值可以是left、right、center、justfy
Text-indent:设置第一行文本的缩进值
Line-height:设置文本所在行的行高。
文档流
4)位置
位置属性就是制定元素的位置。
Position:设置对象的定位方式。有三种取值:absolute(绝对定位)、relative(相对定位)和static(无特殊定位)默认为static。
Left:设置元素左边的水平位置
Top:设置元素顶部的垂直位置
Width:设置元素显示的宽度
Height:设置元素显示的高度
Z-index:使用定位后,
5、边缘
Margin类用于设置元素的边界与其他元素的空隙大小。
Margin-top:设置元素的上边界和与其他元素之间的空隙大小。
Margin-right:设置元素的右边界与其他元素之间的空隙大小。
Margin-bottom:设置元素的下边界与其他元素之间的空隙大小。
Margin-left:设置元素的左边界与其他元素之间的空隙大小。
Margin:用作上面4个属性的略写。
Padding类属性用于设置元素边界与内部内容之间的空隙大小。
Padding-top:设置元素的上边界与内部内容之间的空隙大小
Padding-right:设置元素的右边界于内部内容之间的空隙大小。
Padding-bottom:设置元素的下边界与内容之间的空隙大小。
Padding-left:设置元素的左边界与内部内容之间的空隙大小。
Padding:用作上面4个属性的略写。
Width类属性用于设置元素边框的宽度。可以使用thin(细)、medium(中)、thick(粗)三个值中的一个。
Border-top-width:指定元素上边框的宽度。
Border-right-width:用于指定元素右边框的宽度
Border-left-width:用于指定元素左边框的宽度
Border-bottom-width:用于指定元素下边框的宽度
Border-width:用作对上面四个属性的略写。
Color属性用于设置元素边框的颜色
Border-top-color
Border-left-color
Border-bottom-color:
Border-right-color:
Border-color:用于上面四个属性的略写
Style类属性用于设置元素边框的样式。可以使之为none、dotted(点线)、dashed(虚线)、solid(实现)、double(双线)、groove(凹槽)、ridge(凸槽)、inset(凹边)、outset(凸边)。
布局:
Display:inline|block|none

基础复习

注释符

单行注释 // 注释单行代码
多行注释 /要注释内容/
文档注释 /// 注释类和方法
HTML <!–要注释的内容–>
CSS /要注释的内容/

命名规范

Camel骆驼命名规范:要求首单词的首字母小写,其余单词首字母大写,变量、字段
int age string name char gender string highSchool
int _chinese
Pascal:类或者方法 GetMax GetSum

面向对象的复习

封装 继承 多态
字段:存储数据,访问修饰符应该设置为private私有的
属性:保护字段,对字段的取值和赋值进行限定。
new关键字:1、在堆中开辟空间 2、在开辟的空间中创建对象 3、调用对象的构造函数
this关键字:1、代表当前类的对象 2、调用自己的构造函数
构造函数:初始化对象,当创建对象的时候,会调用构造函数。
对字段的保护方法:
1、get()
2、set()
3、构造函数
*return:
1、立即结束本次方法
2、在方法中返回要返回的值

继承复习

解决代码的冗余,实现多态,增加了代码的扩展性,便于维护。
1、单根性
2、传递性
子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数。
如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类
那里继承过来的成员。但是父类永远都只能使用自己的成员,而不能使用子类的成员。
子类之间也不能互相使用对方的成员。

里氏转换

1、子类可以赋值给父类
2、如果父类中装的是子类对象,那么可以将这个父类转换为子类对象。

new关键字

1)、创建对象
2)、隐藏从父类那里继承过来的成员

访问修饰符

public:公开的,公共的
private:私有的,只能在当前类的内部访问,类中成员们,如果不加访问修饰符,默认就是private
procteced:受保护的,可以在当前类的内部访问,也可以在该类的子类中访问
internal:在当前项目中都可以访问。
protected internal:
能够修饰类的访问修饰符只有两个,internal和public

常用的关键字

this
1、当前类的对象
2、调用自己的构造函数
base
调用父类的成员
new
1、创建对象
2、隐藏父类的成员
virtual
标记一个方法是虚方法
abstract
抽象的
override
重写
interface
接口
partial
部分类
sealed
密封类:不允许被继承
return
1、在方法中返回要返回的值
2、立即结束本次方法
break
跳出当前循环
continue
结束本次循环,回到循环条件进行判断
static
静态的
struct
结构
enum
枚举
const
常量

字符串和集合

1、字符串的不可变性
2、字符串可以看做是char类型的只读数组

ArrayList
Hashtable
List
Dictionary

装箱或者拆箱

装箱:就是将值类型转换为引用类型
拆箱:就是将引用类型转换为值类型。
值类型:bool int double char struct enum decimal
引用类型:string 数组 集合 interface object 自定义类
拆箱或者装箱的两种类型必须具有继承关系

结构和类的区别

1、类当中写了一个新的构造函数之后,默认的无参数的就被干掉了。
但是在结构中,写了一个新的构造函数之后,默认的那个无参数的还在。
在结构的构造函数当中,必须给所有的字段赋值,这样也就限制了结构中最多
只能有两个构造函数,一个是默认的无参数的构造函数,一个是全参数的构造函数。
2、结构的new关键字只干了一件事儿,就是调用结构的构造函数。
3、结构不能继承于类,而类也不能继承于结构。
结构不具备面向对象的特征。
而类才是面向对象的产物。
4、如果不给结构创建对象的话,不允许调用结构中的非静态方法。

委托、XML

单例模式

1、将构造函数私有化
2、提供一个静态方法,返回一个对象。
3、创建一个单例

正则表达式

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”而“\(”则匹配“(”。
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo能匹配“z”以及“zoo”。等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m} mn均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
. 匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“`(. \n)`”的模式。
(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。
(?:pattern) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“`( )”来组合一个模式的各个部分是很有用。例如“industr(?:y ies)”就是一个比“industry industries`”更简略的表达式。
(?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“`Windows(?=95 98 NT 2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows`”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“`Windows(?!95 98 NT 2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows`”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
(?<=pattern) 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“`(?<=95 98 NT 2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows`”。
(?<!pattern) 反向否定预查,与正向否定预查类拟,只是方向相反。例如“`(?<!95 98 NT 2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows`”。
x|y 匹配x或y。例如,“`z food”能匹配“z”或“food”。“(z f)ood”则匹配“zood”或“food`”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d 匹配一个数字字符。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]。
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个回车符。等价于\x0d和\cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于\x09和\cI。
\v 匹配一个垂直制表符。等价于\x0b和\cK。
\w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。.
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若nm均为八进制数字(0-7),则\nm将匹配八进制转义值nm
\nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值_nm_l。
\un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。

常用正则表达式

用户名 /^[a-z0-9_-]{3,16}$/
密码 /^[a-z0-9_-]{6,18}$/
十六进制值 /^#?([a-f0-9]{6}|[a-f0-9]{3})$/
电子邮箱 /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
/^[a-z\d]+(\.[a-z\d]+)*@(\da-z?)+(\.{1,2}[a-z]+)+$/
URL /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-])\/?$/
IP 地址 /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
HTML 标签 /^<([a-z]+)([^<]+)(?:>(.)<\/\1>|\s+\/>)$/
删除代码\\注释 (?<!http:|\S)//.*$
Unicode编码中的汉字范围 /^[\u2E80-\u9FFF]+$/

XML

XML: 可拓展的标记语言
可以用来购买数据

注意:
XML是严格区分大小写的。
XML标签也是成对出现的。

节点包含元素。XML文件必须且只能有一个根节点。
节点Node
元素Element
通过代码创建XML文档。

//通过代码来创建XML文档
//1、引用命名空间
//2、创建XML文档对象
            XmlDocument doc = new XmlDocument();
//3、创建第一个行描述信息,并且添加到doc文档中
            XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
            doc.AppendChild(dec);
//4、创建根节点
            XmlElement books = doc.CreateElement("Books");
//将根节点添加到文档中
            doc.AppendChild(books);
//5、给根节点Books创建子节点
            XmlElement book1 = doc.CreateElement("Book");
//将book添加到根节点
            books.AppendChild(book1);
//6、给Book1添加子节点
            XmlElement name1 = doc.CreateElement("Name");
            name1.InnerText = "123";
            book1.AppendChild(name1);
            XmlElement price1 = doc.CreateElement("Price");
            price1.InnerText = "10";
            book1.AppendChild(price1);
            XmlElement des1 = doc.CreateElement("Des");
            des1.InnerText = "好看";
            book1.AppendChild(des1);
            XmlElement book2 = doc.CreateElement("Book");
            books.AppendChild(book2);
            XmlElement name2 = doc.CreateElement("Name");
            name2.InnerText = "dddd";
            book2.AppendChild(name2);
            XmlElement price2= doc.CreateElement("Price");
            price2.InnerText = "10";
            book2.AppendChild(price2);
            XmlElement des2 = doc.CreateElement("Des");
            des2.InnerText = "好看";
            book2.AppendChild(des2);
            doc.Save("Books.xml");
            Console.WriteLine("保存成功");

xml使用

//追加XML文档
 XmlDocument doc = new XmlDocument();

 XmlElement books;
if (File.Exists("Books.xml"))

 {
//如果文件存在 加载XML
 doc.Load("Books.xml");

//获得文件的根节点
 books = doc.DocumentElement;
 }
else
 {
//如果文件不存在
//创建第一行
 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);

 doc.AppendChild(dec);
//创建根节点
 books = doc.CreateElement("Books");

 doc.AppendChild(books);
 }
//5、给根节点Books创建子节点
 XmlElement book1 = doc.CreateElement("Book");

//将book添加到根节点
 books.AppendChild(book1);
//6、给Book1添加子节点
 XmlElement name1 = doc.CreateElement("Name");

 name1.InnerText = "c#开发大全";

 book1.AppendChild(name1);
 XmlElement price1 = doc.CreateElement("Price");

 price1.InnerText = "110";

 book1.AppendChild(price1);
 XmlElement des1 = doc.CreateElement("Des");

 des1.InnerText = "看不懂";

 book1.AppendChild(des1);
 doc.Save("Books.xml");

 Console.WriteLine("保存成功");

 Console.ReadKey();
//XmlDocument doc = new XmlDocument();
////加载要读取的XML
//doc.Load("Books.xml");
////获得根节点
//XmlElement books = doc.DocumentElement;
////获得子节点 返回节点的集合
//XmlNodeList xnl = books.ChildNodes;
//foreach (XmlNode item in xnl)
//{
// Console.WriteLine(item.InnerText);
//}
//Console.ReadKey();
//读取带属性的XML文档
//XmlDocument doc = new XmlDocument();
//doc.Load("Order.xml");
//Xpath
//XmlDocument doc = new XmlDocument();
//doc.Load("Order.xml");
//XmlNodeList xnl = doc.SelectNodes("/Order/Items/OrderItem");
//foreach (XmlNode node in xnl)
//{
// Console.WriteLine(node.Attributes["Name"].Value);
// Console.WriteLine(node.Attributes["Count"].Value);
//}
//Console.ReadKey();
//改变属性的值
//XmlDocument doc = new XmlDocument();
//doc.Load("Order.xml");
//XmlNode xn = doc.SelectSingleNode("/Order/Items/OrderItem[@Name='190']");
//xn.Attributes["Count"].Value = "200";
//xn.Attributes["Name"].Value = "颜世伟";
//doc.Save("Order.xml");
//Console.WriteLine("保存成功");
 XmlDocument doc = new XmlDocument();

 doc.Load("Order.xml");

 XmlNode xn = doc.SelectSingleNode("/Order/Items");

 xn.RemoveAll();
 doc.Save("Order.xml");

 Console.WriteLine("删除成功");

 Console.ReadKey();
////获得文档的根节点
//XmlElement order = doc.DocumentElement;
//XmlNodeList xnl = order.ChildNodes;
//foreach (XmlNode item in xnl)
//{
// ////如果不是Items 就continue
// //if (item[])
// //{
// // continue;
// //}
// Console.WriteLine(item.Attributes["Name"].Value);
// Console.WriteLine(item.Attributes["Count"].Value);
//}
 Console.ReadKey();

委托

1.为什么使用委托
将一个方法作为参数传递给另一个方法。
2.委托概念
委托所指向的函数必须跟委托具有相同的签名(参数和返回值)
3.匿名函数
当方法只执行一次的时候,可以使用
//lamda表达式 => goes to 去哪儿
DelSayHi del = (string name) => { Console.WriteLine(“你好” + name); };
4.泛型委托

public delegate int DelCompare<T>(T t1, T t2);
// public delegate int DelCompare(object o1, object o2);
class Program
    {
static void Main(string[] args)
        {
            int[] nums = { 1, 2, 3, 4, 5 };
            int max = GetMax<int>(nums, Compare1);
            Console.WriteLine(max);
string[] names = { "abcdefg", "fdsfds", "fdsfdsfdsfdsfdsfdsfdsfsd" };
string max1 = GetMax<string>(names, (string s1, string s2) =>
            {
                return s1.Length - s2.Length;
            });
            Console.WriteLine(max1);
            Console.ReadKey();
        }
        public static T GetMax<T>(T[] nums, DelCompare<T> del)
        {
            T max = nums[0];
            for (int i = 0; i < nums.Length; i++)
            {
                //要传一个比较的方法
                if (del(max, nums[i]) < 0)
                {
                    max = nums[i];
                }
            }
            return max;
        }


        public static int Compare1(int n1, int n2)
        {
            return n1 - n2;
        }

相关资料

相关加密算法
WPF官方文档
WPF示例源码-github
bass.dll & base.net.dll 用户名和注册码
Email-Address : 2636485450@qq.com
Registration-Key : 2X122636170022
BassNet.Registration(“gozhushi@qq.com”, “2X152429150022”);//注册bass音频库

解决“在证书存储区中找不到清单签名证书”

这个问题似乎以前碰到过,不过记不太清了。
程序重新生成,提示错误:在证书存储区中找不到清单签名证书。
可能是之前部署的程序证书被我删掉了或是证书过期了,结果出现这个问题。解决方案如下:
方案1:右击项目属性—>签名—>为ClickOnce清单签名,将勾掉的选项去掉。
方案2:在签名中创建一个新的签名。
方案3:记事本打开相应的csproj文件,调整节点值。true将true修改为false。
以上解决方案任选其一,我选了方案一,简单嘛。重新生成,问题搞定!
C# 启动外部程序的几种方法
c# winform快捷键实现
WinForm窗口关闭的几种常用方法
C# Winform中 如何进行UrlEncode编码及解码
C#怎么选择文件夹
C#制作简单的本地音乐播放器(二)—— 显示歌词

bass相关

官网:http://www.un4seen.com/
简略使用方法:https://www.lagou.com/lgeduarticle/108311.html
BassFx BASS_FX_TempoCreate方法