一、介绍css
.net通常指.Net Framework框架。一种平台,一种技术。html
C#是一种编程语言,能够开发基于.net平台的应用。web
.Net Framework是框架是.Net平台不可缺乏的一部分,它提供了一个稳定的环境来保证咱们基于.Net平台开发的各类应用可以正常的运转。正则表达式
二、两种交互模式编程
C/S:要求客户的电脑上必须装一个客户端:QQ、360、快播等。。。windows
B/S:要求客户的电脑上只须要装一个浏览器。api
三、VS的学习数组
1.启动VS浏览器
a.双击图标安全
b.调出cmd,输入devenv
2.VS的设置
主题:工具 - 选项 - 环境 - 常规 - 颜色主题
字体:工具 - 选项 - 环境 - 字体和颜色 - 字体(Consolas)推荐
显示行号:工具 - 选项 - 环境 - 文本编辑器 - C# - 行号
还原默认设置:工具 - 导入和导出设置 - 重置全部设置 - 下一步
建立解决方案:文件 - 新建 - 项目 - Visual C# - windows - 程序
显示解决方案资源管理器:视图 - 解决方案资源管理器
添加项目:解决方案资源管理器 - 解决方案项目 - 添加 - 新建项目
切换项目:解决方案资源管理器 - 解决方案项目 - 属性 - 通用属性 - 启动项目 - 但启动项目修改为当前选中内容
3.VS生成的文件
.sln:解决方案文件,里面包含整个解决方案的信息,能够双击运行
.csproj:项目文件,里面包含着整个项目的信息,能够双击运行
.config:配置文件
.cs:类文件
四、引用命名空间
淘宝 --> 淘宝在线商城项目 --> 顾客类
using 淘宝 --> 淘宝在线商城项目
五、方法或者函数
Main函数是咱们程序的入口,你写的代码若是想被执行的话,必须写在Main函数当中
六、代码书写须要注意的地方
1.代码中出现的全部标点都是英文半角 Shift键 快速切换中文半角和英文半角 Shift键+空格 切换全脚和半角
2.在C#代码中,每行代码的结束,咱们都以分号结束,注意:这个分号是英文半角的分号
3.Console.WriteLine("要打印的内容");
Console.ReadKey(); //暂停当前程序,等待用户按下任意键继续,按下的任意键将显示在咱们的控制台当中
4.解决方案下面的项目不容许重命名,在面向对应调用项目会有影响,可直接移除添加新项目
七、C#中的三种注释符
1.单行注释 //
2.多行注释 /*要注释的内容*/
3.文档注释 ///
八、VS中经常使用的快捷键
Ctrl + K + D 快速对齐代码
Ctrl + Z 撤销
Ctrl + S 保存(必定要常常保存)
Ctrl + J 弹出智能提示
Shift + Home Shift + End
Ctrl + K + C 注释所选代码
Ctrl + K + U 取消所选代码的注释
Alt + Shift + F10 导入命名空间
F1 转到帮助文档
F6 生成解决方案(检查代码是否有错误)
F5 运行代码
折叠冗余代码 #region 和#endregion
快速折叠代码 选中->右键->外侧代码->#region
Ctrl + F5 测试代码
Ctrl + Shift + B 编译修改代码,刷新页面
F2 快速复制
九、变量
存储变量的语法:
变量类型 变量名
变量名=值
"="号:表明赋值的意思,表示把等号右边的值赋值给等号左边的变量
声明而且给变量赋值的简写形式:
变量类型 变量名 = 值
十、数据类型
1.整数类型:int 只能存储整数,不能存储小数
2.小数类型:double 既能存储整数,也能存储小数,小数点后面的位数15~16位
3.金钱类型:decimal 用来存储金钱,值后面须要加一个m
4.字符串类型:stirng 用来存储多个文本,也能够存储空
5.字符类型:char 用来存储单个字符,最多、最少只能有一个字符,不能存储空。
十一、命名规则
1.首先要保证变量的名字要有意义
2.必须以字母、下划线、@符号开头,不能以数字开头
注意:
1.你起的变量名不要与C#中的关键字重复
2.C#中的大小写是敏感的
3.同一个变量不容许重复定义
给变量命名要知足两个命名规则:
1.Camel 骆驼命名规范。要求变量名的首单词的首字母要小写,其他每一个单词的首字母要大写。多用于给变量命名(highSchoolStudent)
2.Pascal 命名规范。要求每一个单词的首字母要大写,其他字母小写。多用于给类和方法命名(HighSchoolStudent)
十二、+号的做用
1.链接:当+号两边有一边是字符串的时候,+号就起到了链接的做用
2.相加:两边是数字的时候
1三、占位符的使用
使用方法:先挖个坑,再填个坑。
使用占位符须要注意几个地方:
一、你挖了几个坑,就应该填几个坑,若是多填了没有效果,少填了抛异常。
二、输出顺序:按照挖坑的顺序进行输出
{0:00}表示保留小数点后两位
1四、异常
异常是指:语法上没有任何错误,只不过在程序运行的期间,因为某些缘由出现了问题,使程序不能正常的运行
1五、转义符
转义符指的就是一个'\'加一个特殊的字符,组成一个特殊意义的字符
\n:表示换行
\":表示一个英文半角的双引号
\t:表示一个tab键的空格
\b:表示一个退格键,放在字符的两边没有效果
\r\n:windows系统不认识\n,只认识\r\n
\\:表示一个\
1六、@符号
1.取消\在字符串中的转义做用
2.将字符串按照原格式输出
1七、算术运算符
+ - * / %
1八、类型转换
隐式类型转换:
咱们要求等号两边参与运算的操做数的类型必须一致,若是不一致,知足下列条件会发生自动类型转换,或者称之为隐式类型转换
两种类型兼容
例如:int和double兼容(都是数字类型)
目标类型大于原类型
例如:double > int 小的转大的
显示类型转换:
1.两种类型相兼容 int --> double
2.大的转小的 double --> (int)
语法
(待转换的类型)要转换的值
1九、Convert类型转换
string str = "123";
int i = Convert.ToInt32(str);
20、算术运算符
++:分为前++和后++,无论是前++仍是后++,最终结果都是变量加1
若是是前++,带着这个值+1去参与运算,若是是后++,先用原值去参与运算,运算完后再+1
--:同上
一元运算符和二元运算符:
对于像++或者--只须要一个操做符就能够完成的运算,咱们称之为一元运算符
+ - * / %须要两个或者两个以上完成运算的操做符,咱们称之为二元运算符
一元运算符的优先级要高于二元运算符
若是在一个表达式中,有一元运算符和二元运算符,我先计算一元运算符
int number = 10;
int result = + ++number;
2一、bool类型
在C#中咱们用bool类型来描述对或者错
bool类型有两个,一个true,一个false
2二、逻辑运算符
&& 逻辑与
| | 逻辑或
! 逻辑非
逻辑运算符链接的表达式叫逻辑表达式
判断闰年:
bool b = year % 400 == 0 || year % 4 == 0 && year % 100 != 0; //逻辑与的优先级要高于逻辑或
建议加括号:
bool b = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
2三、复合赋值运算符
+=:number = number + 数 -=:number = number - 数
*=:number = number * 数 /=:number = number / 数
%=:number = number % 数
2四、结构
顺序结构:程序从Main函数进入,从上到下一行一行的执行,不会落下任何一行
分支结构:if if-else
选择结构:if if-else switch-case
循环结构:while do-while for foreach
2五、if语句
if(判断条件){
要执行的代码;
}
注意:
判断条件中 ==true能够省略,==false不能省略
2六、if-else
if(判断条件){
执行的代码;
}
else{
执行的代码;
}
2七、if else-if
if(判断条件){
执行的代码;
}
else if{
执行的代码;
}
...
else{
执行的代码;
}
注意:
else能够省略
2八、异常捕获
咱们程序中常常会出现各类各样的异常,若是你想要你的程序变的更坚强一些,在你的代码中应该常用try-catch来进行异常捕获。
哪行代码出现异常,你就踹它一脚
语法:
try{
可能会出现异常的代码;
...
}
//try和catch之间不能有其余的代码
catch{
出现异常后要执行的代码;
}
2九、变量的做用域
变量的做用域就是你可以使用这个变量的范围。
变量的做用域通常从声明它的那个括号开始到对应括号的结束,在这个范围内咱们能够访问并使用变量,超过这个范围就访问不到了。
30、捕捉异常的实例
bool b = true;
int number = 0;
Console.WriteLine("请输入一个数字");
try{
number = Convert.ToInt32(Console.ReadLine());
}
catch{
Console.WriteLine("输入的内容不能转换为数字");
b = false;
}
if(b){
Console.WriteLine(number*2);
}
Console.ReadKey();
3一、switch-case
switch(变量或者表达式的值){
case 值1:要执行的代码
break;
case 值2:要执行的代码
break;
...
default :要执行的代码
break;
}
注意:
1.若是有default,则执行default中的语句,若是没有default,则switch-case结构什么都不作
2.case中执行的代码若是同样,能够省略不写
3二、while循环
while(循环条件){
循环体;
}
特色:先判断后执行,有可能一遍循环都不执行
最简单的最经常使用的死循环:
while(true){
}
3三、break
1.能够跳出switch-case结构
2.能够跳出当前循环
3.break一遍不单独使用,而是跟着if判断一块儿使用,表示当知足某些条件的时候,就再也不循环了
3四、do-while循环
do{
循环体;
}while(循环条件)
特色:先循环再判断,最少执行一遍循环体
3五、程序调试
F5:启动
F9:打断点
F10:跨过程执行
F11:单步逐句执行
F12:查看方法
打开监视:调试-窗口-监视
3六、for循环
for(表达式1;表达式2;表达式3){
循环体;
}
表达式1通常为声明循环变量,记录循环的次数(int i = 0;)
表达式2通常为循环条件(i < 10)
表达式3通常为改变循环条件的代码,使用循环条件终有一天再也不成立(i++)
注意:
快捷键以下:
for + 两次tab键(for循环的代码段)
forr + 两次tab键(逆向for循环的代码段)
3七、三元表达式
表达式1:表达式2?表达式3
bool result = 5 > 3 ? true : false;
3八、枚举
[public] enum 枚举名{
值1,
值2,
...
}
将字符串转换成枚举类型:
(要转换的枚举类型)Enum.Parse(typeof(要转换的枚举类型),"要转换的字符串")
全部类型都能转换成string类型,调用Tostring()。
3九、结构
能够帮助咱们一次性声明多个不一样类型的变量,结构不具有面向对象的任何特征
[public] struct 结构名{
成员;//字段
}
//变量在程序运行期间只能存储一个值,而字段能够存储多个值
40、数组
一次性存储多个不一样类型的变量
数组类型[] 数组名 = new 数组类型[数组长度];
4一、冒泡排序
for (int i = 0; i < nums.Length-1; i++)
{
for (int j = 0; j < nums.Length-1-i; j++)
{
if (nums[j] > nums[j+1])
{
int temp = nums[j];
nums[j] = nums[j+1];
nums[j + 1] = temp;
}
}
}
4二、方法
函数就是一堆代码进行重用的一种机制
[public] static 返回值类型 方法名 (参数列表){
方法体:
}
方法写好后,若是想被执行,必须在Main()函数中调用
方法的调用语法:
类名.方法名([参数]);
在某些环境下,类名是能够省略的,若是你写的方法跟Main()函数在同一个类中,这个时候类名能够省略
4三、return
1.在方法中返回要返回的值
2.当即结束本次方法
4四、方法的调用
咱们在Main()函数中,调用Test()函数,咱们管Main()函数称之为调用者,管Test()函数称之为被调用者
若是被调用者想获得调用者的值:传递参数和使用静态字段来模拟全局变量
若是调用者想获得被调用者的值:返回值
4五、方法调用的实例
static void Main(string[] args)
{
int mx = max(10,20);
Console.WriteLine(mx);
Console.ReadKey();
}public static int max(int a,int b)
{
int i = a > b ? a : b;
return i;
}
4六、out、ref、params
1.out参数:Test函数使用out参数返回多个不一样类型的值给Main函数进行调用
2.ref参数:Main函数中进行赋值,Test函数使用ref调用Main函数中赋的值
3.params可变参数:将实参列表中可变参数数组类型一致的元素都当作数组的类型去处理
注意:params可变参数必须是形参列表中的最后一个元素
4七、方法的重载
方法的重载指的就是方法的名称相同,可是参数不一样
1.若是参数的类型相同,参数的个数就不能相同
2.若是参数的个数相同,参数的类型就不能相同
方法的重载跟返回值没有关系
4八、方法的递归
方法本身调用本身
注意:调用时进入死循环,使用static声明变量
4九、面向对象
找个对象帮你作事儿
例如:把大象塞进冰箱里,咱们把冰箱做为对象
1.冰箱门能够被打开
2.大象能够被塞进冰箱里
3.冰箱门能够关闭
50、类
[public] class 类名{
字段;
属性;
方法;
}
写好一个类后,咱们须要建立这个类的对象,那么咱们管建立这个类的对象过程称之为类的实例化,使用关键字new
this:表示当前这个类的对象
例如:Person p = new Person() 中 p.属性 等于 this.属性
1.类是不占内存的,而对象是占内存的
2.当咱们建立好一个类的对象后,须要给这个对象的每一个属性去赋值,咱们称之为类的初始化
5一、属性
属性的做用是保护字段、对字段的赋值和取值进行限定
属性的本质方法有两个,一个是get(),一个是set()
对属性进行赋值调用set(),对属性进行取值调用get()
既有get()也有set()称之为可读可写属性
只有get()没有set()称之为只读属性
没有get()只有set()称之为只写属性
注意:
快速封装属性->选中该行右键-重构-封装字段-回车
5二、访问修饰符
public:公开的公共的,在哪里均可以访问
private:私有的,只有在当前类的内部才能访问,出了这个类就访问不到了
protected:能够在当前类的内部以及该类的子类中访问
Internal:只能在当前项目中访问。在同一个项目中,在Internal和public的权限是同样的
可以修饰类的访问修饰符只有两个:public和protected
5三、静态和非静态的区别
1.静态成员必须用类名调用,而实例成员使用对象名调用
2.静态函数中,只能访问静态成员,不容许访问实例成员
3.实例函数中,既能够访问静态成员,也能够访问实例成员
静态类在整个项目中,资源共享
5四、构造函数
帮助咱们初始化对象给每一个属性赋值
Person(string name,int age){
this.Name = name;
this.Age = age;
}
Person p = new Person("张三",30) //省略了p.属性
1.构造函数没有void和返回值
2.构造函数名称必须和类名同样
5五、new关键字
1.在内存中开辟一块空间
2.在开辟的空间中建立对象
3.调用对象的构造函数初始化对象
5六、this关键字
1.表明当前类的对象
2.在类中显示的调用本类的构造函数 :this()构析函数
5七、命名空间
能够认为类是属于命名空间的,当项目中没有这个命名空间须要咱们手动导入这个类的命名空间。
方法:用鼠标点或者alt+shift+F10
5八、在一个项目中引用另外一个项目的类
1.添加引用
2.引用命名空间
5九、值类型和引用类型
值类型咱们称之为值的传递,引用类型称之为引用传递
值类型:int、double、bool、char、decimal、struct、enum
引用类型:string、自定义类、数组
值类型存储在内存的栈中,引用类型存储在内存的堆中
60、字符串
1.字符串的不可变性,当你给一个字符串从新赋值后,老值并无销毁,而是从新开辟了一块空间存储新值。当程序结束后,GC扫描整个内存,若是发现有的空间没有被指向就当即把它销毁
2.咱们能够将字符串看做一个char类型的只读的数组
6一、字符串提供的各类方法
1.Length:获取当前字符串中字符的个数
2.ToUpper():将字符串转换成大写形式
3.ToLower():将字符串转换成小写形式
4.Equals():比较两个字符串
5.Split():分割字符串,返回字符串类型的数组
6.Substring():截取字符串
7.IndexOf():判断某个字符串第一次出现的位置,若是没有返回-1,有返回1
8.Replace():将字符串中某个字符串替换成一个新的字符串
9.Trim():去掉字符串中先后的空格
10.string.IsNullOrEmpty():判断一个字符串是否为空或者null
6二、继承
1.咱们能够将一些类中重复的成员,单独封装到一个类中做为父类
2.子类继承了父类的属性和方法,但子类没有继承父类的私有字段
3.子类没有继承父类的构造函数,但子类会默认调用父类的无参构造函数,建立父类对象让子类成为父类的成员
6三、new关键字
1.建立对象
2.隐藏从父类那里继承过来的同名成员,隐藏的后果就是子类调用不到父类的成员
6四、里氏转换
1.子类能够赋值给父类
2.若是父类中装的子类的对象,那么能够讲这个父类强转为子类对象
6五、ArrayList集合
ArrayList list = new ArrayList();
//添加单个元素
list.Add("asd");
list.Add(123);
//添加集合
list.AddRange(new int[] {1,2,3,4,5});
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
Console.ReadKey();//ArrayList的长度问题:每次集合中元素count的个数超过包含元素capcaty的个数,集合会向内存中申请多开辟一倍的空间,来保证集合的长度够用
6六、foreach循环
int[] nums = { 1, 2, 5, 7, 9, 6, 3 };
foreach (var item in nums)
{
Console.WriteLine(item);
}
Console.ReadKey();//foreach循环比for循环效率高
6七、Var
var在代码中要有明确的赋值,例如:var a = 0;(正确) var a;(错误)
C#是一门强类型语言,须要对每一个变量有明确的定义
JS是一门弱类型语言
6八、编码格式
ASC 128
ASCII 256
GB2312 简体字
Big5 繁体字
uncode 编码全,解析慢
UTF-8 web
产生乱码的缘由是:保存文件所采用的编码,跟你打开这么文件所采用的编码格式不同
6九、绝对路径和相对路径
绝对路径:经过给定的这个路径,能在我电脑中找到这个文件
相对路径:文件相对于应用程序的路径
结论:咱们在开发中应尽可能去使用相对路径
70、装箱、拆箱
装箱:就是将值类型转换为引用类型
拆箱:将引用类型转换为值类型
看两种类型是否发生了装箱或者拆箱,要看这两种类型是否存在继承关系
咱们应该尽可能避免在代码中发生装箱和拆箱
7一、泛型
List<int> list = new List<int>();
List和ArrayList区别:肯定了集合中元素的类型,使用集合不会发生装箱和拆箱的操做
7二、键值对
Dictionary<int,string> dic = new Dictionary<int,string>();
dic.Add(1,"张三");
dic[2] = "李四";
foreach(KeyValuePair<int,string> kv in dic){
Console.writeLine("{0}---{1}",kv.Key,kv.Value);
}
7三、多态性
多态是一个类有多种不一样的表现形式
父类的方法为虚方法,使用关键字viatual,此方法在子类中能够重写(使用关键字override)
7四、抽象类
1.抽象成员必须标记为abstract,而且不能有任何实现
2.抽象类不能被实例化
3.若是父类中的方法有默认的实现,而且父类须要被实例化,能够考虑将父类定义为一个普通类,用虚方法实现多态
4.若是父类中的方法有默认的实现,而且父类不须要被实例化,能够将该类定义为抽象类
7五、序列化和反序列化
1.就是将对象转换为二进制
2.就是将二进制转换为对象
做用:传输数据
序列化:将这个类标记为能够被序列化的
7六、接口
1.接口是一种规范,只要一个类继承了一个接口,这个类就必须实现这个接口中全部的成员
2.接口不能被实例化,也就是说接口不能new(不能建立对象)
3.接口中的成员不能加"访问修饰符",接口中的成员访问修饰符为public,不能修改
4.接口中只能有方法、属性、索引器、事件,不能有字段和构造函数
5.一个类能够同时继承一个类并实现多个接口,若是一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA前面
Class MyClass:A,IA{},由于类是单继承的
实现接口的目的:解决方法的重名
7七、GUID
Guid.NewGuid().ToString();
7八、MD5加密
public static string GetMD5(string str)
{
MD5 md5 = MD5.Create();
byte[] buffer = Encoding.Default.GetBytes(str);
byte[] MD5Buffer = md5.ComputeHash(buffer);
//return Encoding.GetEncoding("GBK").GetString(MD5Buffer);
string strNew = "";
for (int i = 0; i < MD5Buffer.Length; i++)
{
strNew += MD5Buffer[i].ToString();
}return strNew;
}
7九、WinForm介绍
winform应用程序是一种智能客户端技术,咱们可使用winform应用程序帮助咱们得到信息或者传输信息等
80、属性和事件
Name:在后台得到前台的控件对象,须要使用Name属性
Visible:指示一个控件是否可见
Enabled:指示一个控件是否可用
事件:发生一件事情(注册事件、触发事件)
8一、Main函数
在Main函数当中建立的窗体对象,咱们称之为这个窗体应用程序的主窗体
也就意味着,当你的主窗体关闭后,整个应用程序就关闭了
8二、TextBox控件
WordWrap:指示文本框是否换行
PasswordChar:让文本框显示一个单一的字符
ScollBars:是否显示滚动条
事件:TextChanged 当文本框中内容发生变化时触发这个事件
8三、Timer定时器
在指定时间的间隔内作一件事
8四、单选和多选
checked:指示这个控件是否处于选中状态
默认状况下,在一个窗体中,全部的单选按钮只容许选中一个,可使用groupbox进行分组
8五、Mdi窗体的设置
1.首先肯定一个父窗体。将IsMdiContainer设置为true
2.建立子窗体,而且设置它们的父窗体
获取指定文件的路径:pictureBox1.Image = Image.FromFile(@"C:\Users\CHD\Desktop\图片\1.jpg");
获取文件夹的路径:string[] path = Directory.GetFiles(@"C:\Users\CHD\Desktop\图片");
设置图片在pictureBos中的布局:picture1.SizeMode = PictureBoxSizeMode.StretchImage;
8六、Directory
Directory 操做文件夹
CreateDirectory 建立文件夹
Delete 删除文件夹
Move 剪切文件夹
Exist 判断是否存在
GetFiles 得到指定的目录下全部文件的全路径
GetDirectory 得到指定目录下全部文件夹的全路径
8七、WebBrowser浏览器控件
url
8八、ComboBox下拉框控件
DropDownStyle:控制下拉框的的外观样式
名字:cbo+...
案例:日期选择器
8九、进程
咱们能够把计算机中每个运行的应用程序都当作一个进程,而一个进程又由多个线程组成的
90、线程
前台线程:只有全部的前台线程都关闭才能完成程序关闭
后台线程:只有全部的前台线程结束,后台线程自动结束
Start()启动线程,告诉CPU能够被执行了,具体何时执行由CPU决定
将线程设置为后台线程:th.IsBackground = true;
页面加载时取消跨线程的访问:Control.CheckForIllegalCrossThreadCalls = false;
解决建立窗口句柄时出错:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//当你关闭窗体时候,判断线程是否为null
if (th != null)
{
//结束这个线程
th.Abort();
}
}
9一、GDI+
GDI+是一种绘图装置接口,可将应用程序和绘图硬件分隔,让咱们可以编写和装置无关的应用程序,它可让咱们不需注意特定显示装置的详细数据,即可在屏幕或打印机显示信息。
咱们能够呼叫GDI+类别提供的方法,而后这么方法会适当的呼叫特定的装置驱动程序,完成绘图。
9二、绘图
//建立GDI对象
Graphics g = this.CreateGraphics();
//建立画笔对象
Pen pen = new Pen(Brushes.Red);
9三、HTML
超文本标记语言
在HTML中存在着大量的标签,咱们用HTML提供的标签,将要显示在网页中的内容包含起来,构成了咱们的网页
CSS:控制网页内容显示的效果
HTML+CSS = 静态网页
9四、HTML中的标签
p标签:段落标签
 :空格
h#:标题标签
<!--要注释的内容-->:注释符
<img/>:图片的标签,用来显示图片
src:表示要显示的图片的路径
height:图片的高度
width:图片的宽度
alt:当图片因为某些缘由显示失败的时候所显示的文本
title:当光标移动到图片上的时候显示的文本
<hr/>:分割线
<font></font>:字体标签 size = 1~7 7最大 Color:颜色 face:字体系列
a标签:超连接 href表示要连接到的地址 target:打开新网页的方式 _blank表示打开一个新网页 _self表示在当前页面进行跳转
9五、写入CSS的三种样式
内联样式表:在标签内设置元素的样式
嵌入样式表:须要在head标签内写<style tyle="text/css"></style>
外部样式表:link
9六、文件操做
File 操做文件,静态类,对文件总体操做(拷贝、删除、剪切)
Directory 操做目录(文件夹),静态类
Path 对文件或目录的路径进行操做
FileStream 文件流,抽象类
StreamReader 快速读取文本文件
StreamWriter 快速写入文本文件
目录和文件操做的命名控件 System.IO
string ChangeExtension(string path, string extension) 修改文件的后缀,支持字符串层面
string Combine(string path1, string path2) 将两个路径合并一个路径
string GetDirectoryName(string path) 获得文件的路径名
string GetExtension(string path) 获得文件的扩展名
string GetFileName(string path) 获得文件路径的文件名部分
string GetFileNameWithoutExtension(string path) 获得去除扩展名的文件名
string GetFullPath(string path) 获得文件的全路径,可根据相对路径得到绝对路径
9七、单例模式
1.将构造函数私有化
2.提供一个静态方法,返回一个对象
3.建立一个单例
9八、XML可扩展的标记语言
XML:存储数据
注意:
XML是严格区分大小写的
XML标签也是成对出现的
XML文档有且只有一个根节点
9九、委托
1.为何要使用委托?
将一个方法做为参数传递给另一个方法
2.委托概念
声明一个委托类型
委托所指向的函数必须跟委托具备一样的签名
3.匿名函数
没有名字的函数
4.练习:使用委托求数组的最大值
5.练习:使用委托求任意数组的最大值
6.泛型委托
7.多播委托
8.Lamda表达式
public delegate void DelOne();
DelOne del = () => { }; //delegate(){};
9.使用委托来实现窗体传值
进阶知识
一、C#的语言规范
VS安装目录:D:\Program Files\VS2012\VC#\Specifications\2052\CSharp Language Specification.docx
二、VS编译.exe文件
1.先编写一个.cs文件
2.经过csc编译器将.cs文件编译成"伪exe" -> "程序集"(微软中间语言IL)
3.运行"exe文件"(将"伪exe"文件经过"即时编译"[jit -> just in time]) -> 机器码
三、变量的命名
首先咱们要保证的就是变量的名称必定要有意义(就是咱们看到了变量的名字,就知道变量在这段程序中的做用)
Camel:多余用给变量或者字段命名,第一个单词的首字母小写,其他每一个单词的首字母大写。
咱们给字段命名,前面必须加下划线。
_highSchoolStudent
Pascal:要求咱们每一个单词的首字母都要大写,其他每一个单词的首字母小写。
HighSchoolStudent
int max= GetMax();
int min= GetMin();
四、面向对象复习
类决定了对象将要拥有的属性和行为。
封装:
--->减小了大量的冗余代码
--->封装将一坨很难理解的功能封装起来,可是对外提供了一个很简单的使用接口。咱们会使用就OK。
继承:
--->减小了类中的冗余代码
--->让类与类产生了关系,为多态打下了基础。
特性:
单根性:一个子类只能有一个父类
传递性:爷爷类 爹类 儿子类
里氏转换:
一、子类能够赋值给父类
二、若是父类中装的是子类对象,则能够将这个父类转换为对应的子类对象
---->关键字
一、is:返回bool类型,指示是否能够作这个转换
二、as:若是转换成功,则返回对象,不然返回null
做用:咱们能够将全部的子类都当作是父类来看,针对父类进行编程,写出通用的代码,适应需求的不断改变。
多态:
--->虚方法
virtual override
--->抽象类
abstract override
--->接口
interface
五、正则表达式
正则表达式:是一个模板,咱们可使用这个模板,去一坨字符串中找到咱们想要的数据。
注意:正则表达式是操做字符串的。
组成:限定符,元字符,经常使用的表达式"^[0-9]{6}$" 彻底匹配以^开头,以$结尾
"^(1[0-9]|2[0-5])$" 输入10~25之间的数字(1后面只能输入0~9,2后面只能输入0~5)
"^\\d{11}$" 或 @"^\d{11}$" 验证11位手机号码
"^(z|food)$" 只匹配z和food为true,其他的为false
@"^([1-9]\d{14}|[1-9]\d{16}[0-9xX])$" 验证身份证号码
Regex.IsMatch(); //判断给定的字符串是否匹配某个正则表达式
Regex.Match(); //从给定的字符串中按照正则表达式提取一个匹配的字符串
Regex.Matches(); //从给定的字符串中按照正则表达式提取全部匹配的字符串
Regex.Replace(); //替换正则表达式匹配的字符串为另一个字符串
六、委托与事件
委托的做用:占位,在不知道未来要执行的方法的具体代码的时,能够先用一个委托变量来代替方法调用(委托的返回值,参数列表要肯定),在实际调用以前,须要为委托赋值,不然为null。
事件的做用:事件的做用和委托变量同样,只是功能上比委托变量有更多的限制
1.只能经过+=或-=来绑定方法(事件处理程序)
2.只能在类内部调用(触发)事件
在C#中咱们常常看到:
private void button1_Click(object sender,EventArgs e){
......
}
上面是一个按钮的点击事件:
1.对象:button
2.事件名:click
3.参数:object sender其实就是button,EventArgs e是事件须要的资源数据
七、反射
经过类型元数据来获取对象的一些相关信息,而且能够实例化对象调用方法等,这个就叫作反射
VS的智能提示就是经过反射获取类的属性、方法等,还有反编译工具也是经过反射实现
反射就是动态获取程序集的元数据的功能
Type类实现反射的一个重要的类,经过它咱们能够得到类中的全部信息,包括方法、属性等。能够动态调用类的属性、方法
反射就是直接经过.dll来建立对象、调用成员
八、HTTP协议
输入地址,开始向服务器发送请求,固然发送的数据必须按照HTTP协议运行组织。
1.请求报文:浏览器向服务器发送请求数据,按照http协议进行组织(HTTP请求)
请求头
请求行 (Request-Line) GET / HTTP/1.1 请求的方式,请求的页面地址,HTTP协议的版本
实体头 Accept application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */* 浏览器告诉服务器浏览器能处理的数据类型
Accept-Encoding gzip, deflate 浏览器支持的压缩方式
Accept-Language zh-CN 浏览器语言版本(服务器将数据压缩完给浏览器,浏览器再解压缩获得数据)
Connection Keep-Alive 保持长链接(是HTTP协议的一种优化方式)
Host localhost:6159 服务器的地址
UA-CPU AMD64 CPU
User-Agent Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) 浏览器和操做系统版本CRLF(头部结束标签)
请求体
HTTP数据体
2.响应报文:服务器处理完成后,会将处理的结果返回给浏览器
响应头
响应行 (Status-Line) HTTP/1.1 200 OK 所使用的协议和响应状态码
实体头 Cache-Control private
Content-Encoding gzip
Content-Length 304 响应报文体的长度
Content-Type text/html; charset=utf-8 服务器返回的数据类型
Date Sun, 30 Sep 2018 06:10:43 GMT
Server Microsoft-IIS/8.0
Vary Accept-Encoding
X-AspNet-Version 4.0.30319
X-Powered-By ASP.NET
X-SourceFiles =?UTF-8?B?RDpcV29ya0xpc3RcZGVtb1xXZWJTaXRlXGRlZmF1bHQuYXNweA==?=CRLF(头部结束标签)
响应体
HTTP数据体
九、IIS处理程序及读取模板文件
IIS的安装:
先装IIS的话,后面装Net Framework的时候会自动注册、处理aspx和ashx等的处理扩展程序
先装Net Framework,后装IIS
扩展程序注册再命令:aspnet_regiis -i
1.开启cmd命令窗口(用管理员帐户打开)C:\Windows\System32\cmd.exe
2.定位到目录:cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
3.在vs的命令提示符程序中注册一下:aspnet_regiis -i
注意:
浏览器发送http://localhost/First.ashx给服务器,IIS会根据请求的文件类型进行判断,若是发现浏览器请求的是动态文件(ashx),IIS是处理不了的,会将请求的文件交给.netframework来执行。IIS是经过aspnet_isapi.dll来把请求的动态文件交给.netframework,再返回给浏览器
十、get post请求
(1)若是表单是以Get方式将数据发送到服务器,那么会将用户在表单中输入的数据放在浏览器的地址栏中发送到服务端
格式:http://localhost:2454/RrequestMethod/AddInfo.ashx?/txtName=itcast&txtPwd=123
以表单元素name属性的值=用户输入的值 & 以表单元素name属性的值=用户输入的值
在AddInfo.ashx中怎样接收数据?
在服务端接收数据string userName=context.Request.QueryString["txtName"];//接收的是表单元素name属性的值
string userPwd = context.Request.QueryString["txtPwd"];
(2)若是数据是以post提交,那么表单中的数据所有都放在请求报文的请求体中,格式以下:
在服务端接收数据string userName=context.Request.Form["txtName"];
string userPwd = context.Request.Form["txtPwd"];
(3)表单在提交时究竟是Get仍是Post?
通常状况用Post
Post提交比Get提交更安全
Post发送的数据比Get大(文件)
搜索用Get
(4)除了将form标签中的method属性设置为post或get之外,是否还有其余的方式,表示Get请求或Post请求?
在浏览器地址中直接输入地址,敲回车,也是向服务器发送Get请求
Post只有将表单中的method改为Post这一种请求
十一、Http协议无状态性
Http协议的无状态性。第二次请求没法获取第一次请求的处理结果。(后续请求没法获取以前请求的计算的结果)
提交表单时,只提交表单元素的Value属性的值,<div>,<span>没法进行提交
自增:
int num = convert.ToInt32(context.Request.Form["textNum"]);
num++;
十二、Windows下使用Memcache
下载Memcache:http://code.jellycan.com/Memcache/
将服务程序拷贝到一个磁盘上的目录
安装服务cmd-->Memcache.exe -d install 打开服务监视窗口,能够查看服务是否启动
启动服务cmd-->Memcache.exe -d start (restart重启,stop关闭服务)
卸载服务:Memcached.exe -d uninstall(先关闭服务)
检查服务是否启动:链接到Memcache控制台-->telnet ServerIP 11211 输入命令:stats检查当前服务状态
13.三层架构
三层分为:UI层、业务逻辑层、数据访问层
1.UI层引用:业务逻辑层(BLL)、模型层(Model)、通用层(Common)
2.业务逻辑层引用:数据访问层(DAL)、模型层(Model)、通用层(Common)
3.数据访问层引用:模型层(Model)、通用层(Common)
14.版本控制器
1.项目经理:搭建基本框架,建立仓储,上传最原始的代码
2.员工:获取最新的代码,完成后续开发
Update:将服务器代码更新本地代码
Commit:将本地代码更新到服务器代码
恢复历史版本:右键文件 -> show log -> 在指定版本上右键 ->revert
对比:右键文件 -> show log -> 在指定版本上右键 -> compare with working copy
注意事项:
1.工做初次打开解决方案时应向服务器请求最新代码
2.工做结束时,保证解决方案能编译经过,而后向服务器签入最新代码
3.不要长时间签出项目或解决方案,当项目添加新项后未编辑任何程序代码时,应当即签入项目,以便其余成员可操做该项目
4.不要签出整个目录。而且除非特别必要,不该同时签出过多的项
5.某工做步骤完成后,应编译整个项目,以检验当前工做。若是不出编译错误,应尽快签入这部分代码
6.不要不通过编译而签入可能不经过的代码,这将影响全部成员的进度
7.依赖项也须要添加到版本库
8.编译出来的文件不该该加入版本控制