.NET 笔记

 1、介绍

.net一般指.Net Framework框架。一种平台,一种技术。

C#是一种编程语言,可以开发基于.net平台的应用。

.Net Framework是框架是.Net平台不可缺少的一部分,它提供了一个稳定的环境来保证我们基于.Net平台开发的各种应用能够正常的运转。

2、两种交互模式

C/S:要求客户的电脑上必须装一个客户端:QQ、360、快播等。。。

B/S:要求客户的电脑上只需要装一个浏览器。

3、VS的学习

1.启动VS

a.双击图标

b.调出cmd,输入devenv

2.VS的设置

主题:工具 - 选项 - 环境 - 常规 - 颜色主题

字体:工具 - 选项 - 环境 - 字体和颜色 - 字体(Consolas)推荐

显示行号:工具 - 选项 - 环境 - 文本编辑器 - C# - 行号

还原默认设置:工具 - 导入和导出设置 - 重置所有设置 - 下一步 

创建解决方案:文件 - 新建 - 项目 - Visual C# - windows - 程序

显示解决方案资源管理器:视图 - 解决方案资源管理器 

添加项目:解决方案资源管理器 - 解决方案项目 - 添加 - 新建项目

切换项目:解决方案资源管理器 - 解决方案项目 - 属性 - 通用属性 - 启动项目 - 但启动项目修改成当前选中内容

3.VS生成的文件

.sln:解决方案文件,里面包含整个解决方案的信息,可以双击运行

.csproj:项目文件,里面包含着整个项目的信息,可以双击运行

.config:配置文件

.cs:类文件

4、引用命名空间

淘宝 --> 淘宝在线商城项目 --> 顾客类

using  淘宝 --> 淘宝在线商城项目

5、方法或者函数

Main函数是我们程序的入口,你写的代码如果想被执行的话,必须写在Main函数当中

6、代码书写需要注意的地方

1.代码中出现的所有标点都是英文半角  Shift键  快速切换中文半角和英文半角  Shift键+空格  切换全脚和半角

2.在C#代码中,每行代码的结束,我们都以分号结束,注意:这个分号是英文半角的分号

3.Console.WriteLine("要打印的内容");

   Console.ReadKey();  //暂停当前程序,等待用户按下任意键继续,按下的任意键将显示在我们的控制台当中

4.解决方案下面的项目不允许重命名,在面向对应调用项目会有影响,可直接移除添加新项目

7、C#中的三种注释符

1.单行注释  //  

2.多行注释  /*要注释的内容*/

3.文档注释  ///

8、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  快速复制

9、变量

存储变量的语法:

变量类型 变量名

变量名=值

"="号:代表赋值的意思,表示把等号右边的值赋值给等号左边的变量

声明并且给变量赋值的简写形式:

变量类型 变量名 = 值

10、数据类型

1.整数类型:int  只能存储整数,不能存储小数

2.小数类型:double  既能存储整数,也能存储小数,小数点后面的位数15~16位

3.金钱类型:decimal  用来存储金钱,值后面需要加一个m

4.字符串类型:stirng  用来存储多个文本,也可以存储空

5.字符类型:char  用来存储单个字符,最多、最少只能有一个字符,不能存储空。

11、命名规则

1.首先要保证变量的名字要有意义

2.必须以字母、下划线、@符号开头,不能以数字开头

注意:

1.你起的变量名不要与C#中的关键字重复

2.C#中的大小写是敏感的

3.同一个变量不允许重复定义

给变量命名要满足两个命名规则:

1.Camel 骆驼命名规范。要求变量名的首单词的首字母要小写,其余每个单词的首字母要大写。多用于给变量命名(highSchoolStudent)

2.Pascal 命名规范。要求每个单词的首字母要大写,其余字母小写。多用于给类和方法命名(HighSchoolStudent)

12、+号的作用

1.连接:当+号两边有一边是字符串的时候,+号就起到了连接的作用

2.相加:两边是数字的时候

13、占位符的使用

使用方法:先挖个坑,再填个坑。

使用占位符需要注意几个地方:

1、你挖了几个坑,就应该填几个坑,如果多填了没有效果,少填了抛异常。

2、输出顺序:按照挖坑的顺序进行输出

{0:00}表示保留小数点后两位

14、异常

异常是指:语法上没有任何错误,只不过在程序运行的期间,由于某些原因出现了问题,使程序不能正常的运行

15、转义符

转义符指的就是一个'\'加一个特殊的字符,组成一个特殊意义的字符

\n:表示换行

\":表示一个英文半角的双引号

\t:表示一个tab键的空格

\b:表示一个退格键,放在字符的两边没有效果

\r\n:windows系统不认识\n,只认识\r\n

\\:表示一个\

16、@符号

1.取消\在字符串中的转义作用

2.将字符串按照原格式输出

17、算术运算符

+  -  *  /  %

18、类型转换

隐式类型转换:

我们要求等号两边参与运算的操作数的类型必须一致,如果不一致,满足下列条件会发生自动类型转换,或者称之为隐式类型转换

两种类型兼容

例如:int和double兼容(都是数字类型)

目标类型大于原类型

例如:double > int 小的转大的

显示类型转换:

1.两种类型相兼容  int --> double

2.大的转小的    double --> (int)

语法

(待转换的类型)要转换的值

19、Convert类型转换

string str = "123";

int i = Convert.ToInt32(str);

20、算术运算符

++:分为前++和后++,不管是前++还是后++,最终结果都是变量加1

如果是前++,带着这个值+1去参与运算,如果是后++,先用原值去参与运算,运算完后再+1

--:同上

一元运算符和二元运算符:

对于像++或者--只需要一个操作符就可以完成的运算,我们称之为一元运算符

+ - * / %需要两个或者两个以上完成运算的操作符,我们称之为二元运算符

一元运算符的优先级要高于二元运算符

如果在一个表达式中,有一元运算符和二元运算符,我先计算一元运算符

int number = 10;

int result = +  ++number;

21、bool类型

在C#中我们用bool类型来描述对或者错

bool类型有两个,一个true,一个false

22、逻辑运算符

&&  逻辑与

| |   逻辑或

!     逻辑非

逻辑运算符连接的表达式叫逻辑表达式

判断闰年:

bool b = year % 400 == 0 || year % 4 == 0 && year % 100 != 0;  //逻辑与的优先级要高于逻辑或

建议加括号:

bool b = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);

23、复合赋值运算符

+=:number = number  + 数  -=:number = number  - 数

*=:number = number  * 数  /=:number = number  / 数

%=:number = number % 数

24、结构

顺序结构:程序从Main函数进入,从上到下一行一行的执行,不会落下任何一行

分支结构:if if-else

选择结构:if if-else switch-case

循环结构:while do-while for foreach

25、if语句

if(判断条件){

  要执行的代码;

}

注意:

判断条件中 ==true可以省略,==false不能省略

26、if-else

if(判断条件){

  执行的代码;

}

else{

  执行的代码;

}

27、if else-if

if(判断条件){

  执行的代码;

}

else if{

  执行的代码;

}

...

else{

  执行的代码;

}

注意:

else可以省略

28、异常捕获

我们程序中经常会出现各种各样的异常,如果你想要你的程序变的更坚强一些,在你的代码中应该经常使用try-catch来进行异常捕获。

哪行代码出现异常,你就踹它一脚

语法:

try{

  可能会出现异常的代码;

  ...

}

//try和catch之间不能有其他的代码

catch{

  出现异常后要执行的代码;

}

29、变量的作用域

变量的作用域就是你能够使用这个变量的范围。

变量的作用域一般从声明它的那个括号开始到对应括号的结束,在这个范围内我们可以访问并使用变量,超过这个范围就访问不到了。

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();

31、switch-case

switch(变量或者表达式的值){

case 值1:要执行的代码

break;

case 值2:要执行的代码

break;

...

default :要执行的代码

break;

}

注意:

1.如果有default,则执行default中的语句,如果没有default,则switch-case结构什么都不做

2.case中执行的代码如果一样,可以省略不写

32、while循环

while(循环条件){

  循环体;

}

特点:先判断后执行,有可能一遍循环都不执行

最简单的最常用的死循环:

while(true){

}

33、break

1.可以跳出switch-case结构

2.可以跳出当前循环

3.break一遍不单独使用,而是跟着if判断一起使用,表示当满足某些条件的时候,就不再循环了

34、do-while循环

do{

  循环体;

}while(循环条件)

特点:先循环再判断,最少执行一遍循环体

35、程序调试

F5:启动

F9:打断点

F10:跨过程执行

F11:单步逐句执行

F12:查看方法

打开监视:调试-窗口-监视

36、for循环

for(表达式1;表达式2;表达式3){

  循环体;

}

表达式1一般为声明循环变量,记录循环的次数(int i = 0;)

表达式2一般为循环条件(i < 10)

表达式3一般为改变循环条件的代码,使用循环条件终有一天不再成立(i++)

注意:

快捷键如下:

for  + 两次tab键(for循环的代码段)

forr + 两次tab键(逆向for循环的代码段)

37、三元表达式

表达式1:表达式2?表达式3

bool result = 5 > 3 ? true : false;

38、枚举

[public] enum 枚举名{

  值1,

  值2,

  ...

}

将字符串转换成枚举类型:

(要转换的枚举类型)Enum.Parse(typeof(要转换的枚举类型),"要转换的字符串")

所有类型都能转换成string类型,调用Tostring()。

39、结构

可以帮助我们一次性声明多个不同类型的变量,结构不具备面向对象的任何特征

[public]  struct  结构名{

  成员;//字段

}

//变量在程序运行期间只能存储一个值,而字段可以存储多个值

40、数组

一次性存储多个不同类型的变量

数组类型[]  数组名 = new  数组类型[数组长度];

41、冒泡排序

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;
}
}
}

42、方法

函数就是一堆代码进行重用的一种机制

[public]  static  返回值类型  方法名 (参数列表){

  方法体:

}

方法写好后,如果想被执行,必须在Main()函数中调用

方法的调用语法:

类名.方法名([参数]);

在某些环境下,类名是可以省略的,如果你写的方法跟Main()函数在同一个类中,这个时候类名可以省略

43、return

1.在方法中返回要返回的值

2.立即结束本次方法

44、方法的调用

我们在Main()函数中,调用Test()函数,我们管Main()函数称之为调用者,管Test()函数称之为被调用者

如果被调用者想得到调用者的值:传递参数和使用静态字段来模拟全局变量

如果调用者想得到被调用者的值:返回值

45、方法调用的实例

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;
}

46、out、ref、params

1.out参数:Test函数使用out参数返回多个不同类型的值给Main函数进行调用

2.ref参数:Main函数中进行赋值,Test函数使用ref调用Main函数中赋的值

3.params可变参数:将实参列表中可变参数数组类型一致的元素都当做数组的类型去处理

注意:params可变参数必须是形参列表中的最后一个元素

47、方法的重载

方法的重载指的就是方法的名称相同,但是参数不同

1.如果参数的类型相同,参数的个数就不能相同

2.如果参数的个数相同,参数的类型就不能相同

方法的重载跟返回值没有关系

48、方法的递归

方法自己调用自己

注意:调用时进入死循环,使用static声明变量

49、面向对象

找个对象帮你做事儿

例如:把大象塞进冰箱里,我们把冰箱作为对象

1.冰箱门可以被打开

2.大象可以被塞进冰箱里

3.冰箱门可以关闭

50、类

[public] class 类名{

  字段;

  属性;

  方法;

}

写好一个类后,我们需要创建这个类的对象,那么我们管创建这个类的对象过程称之为类的实例化,使用关键字new

this:表示当前这个类的对象

例如:Person p = new Person() 中 p.属性 等于 this.属性

1.类是不占内存的,而对象是占内存的

2.当我们创建好一个类的对象后,需要给这个对象的每个属性去赋值,我们称之为类的初始化

 51、属性

属性的作用是保护字段、对字段的赋值和取值进行限定

属性的本质方法有两个,一个是get(),一个是set()

对属性进行赋值调用set(),对属性进行取值调用get()

既有get()也有set()称之为可读可写属性

只有get()没有set()称之为只读属性

没有get()只有set()称之为只写属性

注意:

快速封装属性->选中该行右键-重构-封装字段-回车

52、访问修饰符

public:公开的公共的,在哪里都可以访问

private:私有的,只有在当前类的内部才能访问,出了这个类就访问不到了

protected:可以在当前类的内部以及该类的子类中访问

Internal:只能在当前项目中访问。在同一个项目中,在Internal和public的权限是一样的

能够修饰类的访问修饰符只有两个:public和protected

53、静态和非静态的区别

1.静态成员必须用类名调用,而实例成员使用对象名调用

2.静态函数中,只能访问静态成员,不允许访问实例成员

3.实例函数中,既可以访问静态成员,也可以访问实例成员

静态类在整个项目中,资源共享

54、构造函数

帮助我们初始化对象给每个属性赋值

Person(string name,int age){

this.Name = name;

this.Age = age;

}

Person p = new Person("张三",30)  //省略了p.属性

1.构造函数没有void和返回值

2.构造函数名称必须和类名一样

55、new关键字

1.在内存中开辟一块空间

2.在开辟的空间中创建对象

3.调用对象的构造函数初始化对象

56、this关键字

1.代表当前类的对象

2.在类中显示的调用本类的构造函数  :this()构析函数

57、命名空间

可以认为类是属于命名空间的,当项目中没有这个命名空间需要我们手动导入这个类的命名空间。

方法:用鼠标点或者alt+shift+F10

58、在一个项目中引用另一个项目的类

1.添加引用

2.引用命名空间

59、值类型和引用类型

值类型我们称之为值的传递,引用类型称之为引用传递

值类型:int、double、bool、char、decimal、struct、enum

引用类型:string、自定义类、数组

值类型存储在内存的栈中,引用类型存储在内存的堆中

 60、字符串

1.字符串的不可变性,当你给一个字符串重新赋值后,老值并没有销毁,而是重新开辟了一块空间存储新值。当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向就立即把它销毁

2.我们可以将字符串看作一个char类型的只读的数组

61、字符串提供的各种方法

1.Length:获取当前字符串中字符的个数

2.ToUpper():将字符串转换成大写形式

3.ToLower():将字符串转换成小写形式

4.Equals():比较两个字符串

5.Split():分割字符串,返回字符串类型的数组

6.Substring():截取字符串

7.IndexOf():判断某个字符串第一次出现的位置,如果没有返回-1,有返回1

8.Replace():将字符串中某个字符串替换成一个新的字符串

9.Trim():去掉字符串中前后的空格

10.string.IsNullOrEmpty():判断一个字符串是否为空或者null

62、继承

1.我们可以将一些类中重复的成员,单独封装到一个类中作为父类

2.子类继承了父类的属性和方法,但子类没有继承父类的私有字段

3.子类没有继承父类的构造函数,但子类会默认调用父类的无参构造函数,创建父类对象让子类成为父类的成员

63、new关键字

1.创建对象

2.隐藏从父类那里继承过来的同名成员,隐藏的后果就是子类调用不到父类的成员

64、里氏转换

1.子类可以赋值给父类

2.如果父类中装的子类的对象,那么可以讲这个父类强转为子类对象

65、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的个数,集合会向内存中申请多开辟一倍的空间,来保证集合的长度够用

66、foreach循环

int[] nums = { 1, 2, 5, 7, 9, 6, 3 };
foreach (var item in nums)
{
Console.WriteLine(item);
}
Console.ReadKey();

//foreach循环比for循环效率高

67、Var

var在代码中要有明确的赋值,例如:var a = 0;(正确) var a;(错误)

C#是一门强类型语言,需要对每个变量有明确的定义

JS是一门弱类型语言

68、编码格式

ASC 128

ASCII 256

GB2312 简体字

Big5 繁体字

uncode 编码全,解析慢

UTF-8 web

产生乱码的原因是:保存文件所采用的编码,跟你打开这么文件所采用的编码格式不一样 

69、绝对路径和相对路径

绝对路径:通过给定的这个路径,能在我电脑中找到这个文件

相对路径:文件相对于应用程序的路径

结论:我们在开发中应尽量去使用相对路径

70、装箱、拆箱

装箱:就是将值类型转换为引用类型

拆箱:将引用类型转换为值类型

看两种类型是否发生了装箱或者拆箱,要看这两种类型是否存在继承关系

我们应该尽量避免在代码中发生装箱和拆箱

71、泛型

List<int> list = new List<int>();

List和ArrayList区别:确定了集合中元素的类型,使用集合不会发生装箱和拆箱的操作

72、键值对

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);

}

73、多态性

多态是一个类有多种不同的表现形式

父类的方法为虚方法,使用关键字viatual,此方法在子类中可以重写(使用关键字override)

74、抽象类

1.抽象成员必须标记为abstract,并且不能有任何实现

2.抽象类不能被实例化

3.如果父类中的方法有默认的实现,并且父类需要被实例化,可以考虑将父类定义为一个普通类,用虚方法实现多态

4.如果父类中的方法有默认的实现,并且父类不需要被实例化,可以将该类定义为抽象类

75、序列化和反序列化

1.就是将对象转换为二进制

2.就是将二进制转换为对象

作用:传输数据

序列化:将这个类标记为可以被序列化的

76、接口

1.接口是一种规范,只要一个类继承了一个接口,这个类就必须实现这个接口中所有的成员

2.接口不能被实例化,也就是说接口不能new(不能创建对象)

3.接口中的成员不能加"访问修饰符",接口中的成员访问修饰符为public,不能修改

4.接口中只能有方法、属性、索引器、事件,不能有字段和构造函数

5.一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA前面

Class MyClass:A,IA{},因为类是单继承的

实现接口的目的:解决方法的重名

77、GUID

Guid.NewGuid().ToString();

78、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;

}

79、WinForm介绍

winform应用程序是一种智能客户端技术,我们可以使用winform应用程序帮助我们获得信息或者传输信息等

80、属性和事件

Name:在后台获得前台的控件对象,需要使用Name属性

Visible:指示一个控件是否可见

Enabled:指示一个控件是否可用

事件:发生一件事情(注册事件、触发事件)

81、Main函数

在Main函数当中创建的窗体对象,我们称之为这个窗体应用程序的主窗体

也就意味着,当你的主窗体关闭后,整个应用程序就关闭了

82、TextBox控件

WordWrap:指示文本框是否换行

PasswordChar:让文本框显示一个单一的字符

ScollBars:是否显示滚动条

事件:TextChanged  当文本框中内容发生变化时触发这个事件

83、Timer定时器

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

84、单选和多选

checked:指示这个控件是否处于选中状态

默认情况下,在一个窗体中,所有的单选按钮只允许选中一个,可以使用groupbox进行分组

85、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;

86、Directory

Directory  操作文件夹

CreateDirectory  创建文件夹

Delete  删除文件夹

Move  剪切文件夹

Exist  判断是否存在

GetFiles  获得指定的目录下所有文件的全路径

GetDirectory  获得指定目录下所有文件夹的全路径

87、WebBrowser浏览器控件

url

88、ComboBox下拉框控件

DropDownStyle:控制下拉框的的外观样式

名字:cbo+...

案例:日期选择器

89、进程

我们可以把计算机中每一个运行的应用程序都当做一个进程,而一个进程又由多个线程组成的

90、线程

前台线程:只有所有的前台线程都关闭才能完成程序关闭

后台线程:只有所有的前台线程结束,后台线程自动结束

Start()启动线程,告诉CPU可以被执行了,具体什么时候执行由CPU决定

将线程设置为后台线程:th.IsBackground = true;

页面加载时取消跨线程的访问:Control.CheckForIllegalCrossThreadCalls = false;

解决创建窗口句柄时出错:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//当你关闭窗体时候,判断线程是否为null
if (th != null)
{
//结束这个线程
th.Abort();
}
}

91、GDI+

GDI+是一种绘图装置接口,可将应用程序和绘图硬件分隔,让我们能够编写和装置无关的应用程序,它可以让我们不需注意特定显示装置的详细数据,便可在屏幕或打印机显示信息。

我们可以呼叫GDI+类别提供的方法,然后这么方法会适当的呼叫特定的装置驱动程序,完成绘图。

92、绘图

//创建GDI对象
Graphics g = this.CreateGraphics();
//创建画笔对象
Pen pen = new Pen(Brushes.Red);

93、HTML

超文本标记语言

在HTML中存在着大量的标签,我们用HTML提供的标签,将要显示在网页中的内容包含起来,构成了我们的网页

CSS:控制网页内容显示的效果

HTML+CSS = 静态网页

94、HTML中的标签

p标签:段落标签

&nbsp:空格

h#:标题标签

<!--要注释的内容-->:注释符

<img/>:图片的标签,用来显示图片

src:表示要显示的图片的路径

height:图片的高度

width:图片的宽度

alt:当图片由于某些原因显示失败的时候所显示的文本

title:当光标移动到图片上的时候显示的文本

<hr/>:分割线

<font></font>:字体标签 size = 1~7 7最大 Color:颜色 face:字体系列

a标签:超链接 href表示要链接到的地址 target:打开新网页的方式 _blank表示打开一个新网页 _self表示在当前页面进行跳转

95、写入CSS的三种样式

内联样式表:在标签内设置元素的样式

嵌入样式表:需要在head标签内写<style tyle="text/css"></style>

外部样式表:link

96、文件操作

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)  得到文件的全路径,可根据相对路径获得绝对路径

97、单例模式

1.将构造函数私有化

2.提供一个静态方法,返回一个对象

3.创建一个单例

98、XML可扩展的标记语言

XML:存储数据

注意:

XML是严格区分大小写的

XML标签也是成对出现的

XML文档有且只有一个根节点

99、委托

1.为什么要使用委托?

将一个方法作为参数传递给另外一个方法

2.委托概念

声明一个委托类型

委托所指向的函数必须跟委托具有同样的签名

3.匿名函数

没有名字的函数

4.练习:使用委托求数组的最大值

5.练习:使用委托求任意数组的最大值

6.泛型委托

7.多播委托

8.Lamda表达式

 public delegate void DelOne();

DelOne del = () => { }; //delegate(){};

9.使用委托来实现窗体传值

 

进阶知识

1、C#的语言规范

VS安装目录:D:\Program Files\VS2012\VC#\Specifications\2052\CSharp Language Specification.docx

2、VS编译.exe文件

1.先编写一个.cs文件

2.通过csc编译器将.cs文件编译成"伪exe" -> "程序集"(微软中间语言IL)

3.运行"exe文件"(将"伪exe"文件通过"即时编译"[jit -> just in time]) -> 机器码

3、变量的命名

首先我们要保证的就是变量的名称一定要有意义(就是我们看到了变量的名字,就知道变量在这段程序中的作用)
Camel:多余用给变量或者字段命名,第一个单词的首字母小写,其余每个单词的首字母大写。
我们给字段命名,前面必须加下划线。
_highSchoolStudent
Pascal:要求我们每个单词的首字母都要大写,其余每个单词的首字母小写。
HighSchoolStudent

int max= GetMax();
int min= GetMin();

4、面向对象复习

类决定了对象将要拥有的属性和行为。
封装:
--->减少了大量的冗余代码
--->封装将一坨很难理解的功能封装起来,但是对外提供了一个很简单的使用接口。我们会使用就OK。
继承:
--->减少了类中的冗余代码
--->让类与类产生了关系,为多态打下了基础。
特性:
单根性:一个子类只能有一个父类
传递性:爷爷类 爹类 儿子类
里氏转换:
1、子类可以赋值给父类
2、如果父类中装的是子类对象,则可以将这个父类转换为对应的子类对象
---->关键字
1、is:返回bool类型,指示是否可以做这个转换
2、as:如果转换成功,则返回对象,否则返回null
作用:我们可以将所有的子类都当做是父类来看,针对父类进行编程,写出通用的代码,适应需求的不断改变。
多态:
--->虚方法
virtual override
--->抽象类
abstract override
--->接口
interface

5、正则表达式

正则表达式:是一个模板,我们可以使用这个模板,去一坨字符串中找到我们想要的数据。
注意:正则表达式是操作字符串的。
组成:限定符,元字符,常用的表达式

 "^[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(); //替换正则表达式匹配的字符串为另外一个字符串

6、委托与事件

委托的作用:占位,在不知道将来要执行的方法的具体代码的时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定),在实际调用之前,需要为委托赋值,否则为null。

事件的作用:事件的作用和委托变量一样,只是功能上比委托变量有更多的限制

1.只能通过+=或-=来绑定方法(事件处理程序)

2.只能在类内部调用(触发)事件

在C#中我们经常看到:

private void button1_Click(object sender,EventArgs e){

......

}

上面是一个按钮的点击事件:

1.对象:button

2.事件名:click

3.参数:object sender其实就是button,EventArgs e是事件需要的资源数据

7、反射

通过类型元数据来获取对象的一些相关信息,并且可以实例化对象调用方法等,这个就叫做反射

VS的智能提示就是通过反射获取类的属性、方法等,还有反编译工具也是通过反射实现

反射就是动态获取程序集的元数据的功能

Type类实现反射的一个重要的类,通过它我们可以获得类中的所有信息,包括方法、属性等。可以动态调用类的属性、方法

反射就是直接通过.dll来创建对象、调用成员

8、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数据体

9、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,再返回给浏览器

10、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这一种请求

11、Http协议无状态性

Http协议的无状态性。第二次请求无法获取第一次请求的处理结果。(后续请求无法获取之前请求的计算的结果)

提交表单时,只提交表单元素的Value属性的值,<div>,<span>无法进行提交

自增:

int num = convert.ToInt32(context.Request.Form["textNum"]);

num++;

12、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.编译出来的文件不应该加入版本控制

 

转载于:https://www.cnblogs.com/songhe123/p/9597170.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值