1.面向对象是一种分析问题的方式,指的是编程的方式跟我们生活中思维的方式是一样的
2.最常见的面向对象的高级语言:C#,java
3.面向过程:是把一个任务分解成有顺序的几个步骤,然后按步骤一步步去执行,注重方法,没有类和对象的概念。
4.C语言编程就是面向过程的
5.程序集:就是平常所说的dll,exe文件,一些相关的类的物理存储文件
6.命名空间(逻辑上的):在逻辑上分成一些单元,每个单元起个名字,这个名字就是命名空间的名字,是类的逻辑组 织方式。
7.变量作用域: 类的成员变量可以不用初始化就可以使用,因为它们都会有一个默认值。int 默认值0,string或者引用类型默认值是null,bool默认值是false。
8.局部变量(方法内部声明的变量)必须初始化(赋值)后才能使用。
9.面向对象三大特性:封装、继承、多态
10.访问修饰符: public:任何地方 private:当前类内部 internal:当前程序集内 protected:当前类以及子类内部 protected internal:当前程序集内 或者 当前类以及子类内部 类的默
认访问修饰符是internal 类成员默认访问修饰符是private 子类的访问级别不能高于父类的访问级别
11.is :判断对象是否是某个类型,如果是返回true,否则返回false。
12.类型转换:隐式转换、显式转换
隐式转换:直接把子类赋给父类(继承链的上边的类)
显示转换:继承链上边的类转换成下边的类,
(1)下边的类 变量 =(下边的类)对象
(2) as 转换,转换失败会返回null,尽量用as进行显式转换,一般as转换完之后要判断是否为null
13.多态的实现(1)前提必须得继承
虚方法:关键字:virtual,override重写父类的方法
多态本质:表面上执行的父类的方法,实际上执行的是子类的方法,用抽象来封装变化,减少if else,switch等代码
源代码经过生成之后(第一次编译)变成dll、exe文件,这个文件里边是中间IL语言
CLR(共同语言运行时)来运行我们的.NET程序(IL),把IL语言编译成机器语言(汇编语言-黑客)(第二次编译),cpu直接执行汇编语言(mov )
CLR将内存分成:线程栈、堆(GC堆,大对象堆,加载堆)
GC堆(小对象堆):存储小于8500000字节的对象。GC:垃圾回收器,如果对象没有了引用(Person p=new Person(); p=null; ),GC就会回收对象。
大对象堆:存储大于8500000字节的对象。
加载堆:存的是程序集里边类的信息。
类型信息表:类名、方法表、父类名(指针,指向父类的类型信息表)
每个类型都有自己的类型信息表
方法表:按顺序进行存储的,父类的虚方法,自己的虚方法,自己的构造函数,类的静态方法,自己的实例方法,存的只是方法名,
方法槽表:方法的具体实现。
如果调用的是非虚方法,最终调用声明对象类型的方法表,如果调用的是虚方法,那么调用对象的类型指针对应的类型信息表里的方法表。
当调用非虚方法时会调用声明类型的方法表(person方法表)
当调用虚方法时调用的是实例对象内部类型指针指向的类型的方法表
多态本质:实际上调用的方法表不一样
引用类型的变量分布在栈和(gc)堆上,堆上存的是具体的值,栈上寸的是堆的一个地址。
值类型变量存在声明它的地方。(有可能存在栈上,也有可能存在堆上)。
栈存的大小固定数据。
线程:一个代码的执行流,一个线程会对应一个方法,方法执行完之后,线程的生命周期也就结束了。
14.多态的实现(2)、抽象类
1、class前加abstract关键字,就是抽象类
2、父类里边声明抽象方法,子类进行override进行实现。
3、子类必须实现父类的抽象成员。
4、抽象成员光说不做。
5、不能进行实例化对象,只能用来被继承。
15.值传递和引用传递:
值传递:copy了一份栈内存存的值给形参。传递的是值
声明一个引用类型的变量,首先在栈上开辟一个内存
引用传递:传递的是实参的栈地址, ref、out
out:意义在于使方法拥有多个返回值。传递之前可以不用赋值,必须在方法内部必须进行赋值和初始化。首先传递之前必须得赋值,主要是为了修改。
ref:更侧重于修改。传递之前必须要赋值(初始化),方法内部可以进行修改。在方法内部必须进行赋值。主要是为了赋值,目的是变相增加方法的返回值。
16.接口:(多态实现的第三种方式)
1、以大写 “I开头+动词+able” 来命名,顾名思义:具有什么行为的能力
2、接口成员不能加访问修饰符,默认访问修饰符:public
3、接口成员(方法、属性、索引器)编译之后都是方法。
4、方法是不能实现的。
5、方法经过编译之后本质上是一个抽象方法(虚方法)。
6、定义了一组没有实现的方法。
7、就是用来被实现的(光说不做)。
8、应该说类实现了某个接口,不能说继承了某个接口,但本质上还是继承。
9、只要类实现了某个接口,就必须实现接口里边全部的方法。
10、接口就相当于一个规范,实现了接口就相当于你要遵守这个规范,你就具有了某种能力。
11、一个类即继承父类又实现接口,父类要写在前边,接口要写在后边
12、一个类只能继承一个父类,但是可以实现多个接口。
13、实现接口的合理性:类继承其实是 is a的关系,接口 can do 能实现这个行为吗?
17.接口和抽象类有什么区别:
(1)、抽象类适用于同一系列的类(也就是有继承关系的),并且有需要继承的成员。
(2)、接口适用于不同系列的类但具有相同的动作(行为)。
(3)、接口还解决了类单继承的问题。
18.静态类:
1、static关键字,静态类里必须包含静态成员。
2、与静态成员相对的是实例成员。(静态成员:静态的字段、属性、方法)
3、实例成员依赖具体的实例(对象),属于实例的,只有创建对象的情况下才能访问。
4、静态成员是属于所有实例的,所有实例共享的。
5、使用场景:
(1)、一个类里没有数据(没有字段、属性),只有方法,一般这样的类声明成静态类(工具类:Math)。
(2)、单个实例的类一般也声明成静态类。
(3)、如果一个方法里边操作的是针对某一个具体的对象,不能声明成静态方法,反过来,如果方法内部不涉及到 具体的对象,可以声明为静态方法。
6、编译器会自动增加一个静态构造函数,而且静态成员的初始化会放在静态构造函数里边。
注:反编译工具里的c#代码是根据IL代码生成的,跟我咱们原生c#代码是有区别的。
7、静态构造函数执行的时间:
(1)、静态构造函数在实例构造函数前执行。
(2)、创建第一个实体对象的时候会自动调用或者调用任何一个静态成员的时候会自动调用。
(3)、静态构造函数只会调用一次。
19.三层架构:(完善ef(委托、泛型、ef查询)-MVC-搭建OA架构)
1、架构:相当于系统的设计的“一张蓝图”,对系统的一个抽象,与具体的语言(c#、java)无关。
2、模式:(gof23种设计模式),特定领域解决特定问题的一种方式、思想。
3、框架:用一种特定的语言来实现一种模式、思想。(jquery、asp.net MVC、EF(net 对ORM的实现))。
4、三层:
(1)、首次是一种逻辑分层(layer),相对于物理分层(tier)。
(2)、表现层(UI层)、业务逻辑层(BLL)、数据访问层(DAL)。
(3)、分层就相当于是分工一样,一件事由不同的人来干。
(4)、根据项目大小,小的项目分层会影响效率,大的项目会提交效率,并不是所有的项目都适合分层。
(5)、分工的好处: 缩短周期、职责分离(哪出了问题找具体负责的人)
(6)、其它的分层都是在三层的基础上发展而来的。
20.写三层步骤:
案例:实现年龄增长一岁的功能。
(1)、分析功能
(2)、根据功能写出sql语句 "update [dbo].[UserDemo] set Age=Age+1 where id=1" sql 语句里变化的部分可以当作参数。
(3) 、在数据访问层编写执行sql语句的方法。在数据访问层加一个和表名同名的一个类,加"Dal"后缀,以后所有对这个表的操作都放到这个类里。
(4)、编写业务逻辑方法;
在业务逻辑层添加一个和表名同名的类,加“Bll”后缀,以后所有对这个表的业务操作都放到这个类里。
方法的返回值是根据ui层来决定
(5)、在ui层写调用业务逻辑层的方法(aspx、jsp、winform) 在表现层不能直接调用Dal层。
总结:先写dal层,再写bll层、最后再写ui层
调用关系:ui层调用bll层,bll层调用dal层
强依赖关系(很强的耦合度):ui层依赖于bll层,bll层依赖于dal层
每个层建一个类库(除了UI层)
21.EF:
1、是一个框架,是 .net 对orm的一个实现。
2、orm是表实体对象与表的相互转换。表实体对象:model类
3、model->表:增、删、修改表->model:查询
4、orm本质:替你写sql语句。
5、三种实现方式:databasefirst(数据库先行,先要建数据库,再生成实体类)、modelfirst(实体类先行,先建实体类,再生成数据库)、codefirst
6、要在efdal里边添加对ef的引用,ef在解决方案根目录下package文件夹下
7、委托复习:
(1)、是一种数据类型,存的是方法,在哪能声明类就能声明委托。
(2)、声明委托就是声明一个方法签名(返回值+参数)
(3)、声明委托:delegate+返回值+委托名+(参数列表)
(4)、 MyDelegate a = new MyDelegate(fun1);//标准的声明委托变量的方式,c#1.0声明方式
(5)、delegate关键字加上参数列表再加上方法体=匿名函数。
(6)、匿名函数就是为了给委托变量进行赋值的。
(7)、匿名函数在方法体内部推断返回值的类型。
(8)、lamabda表达语句:方法体内部有多条语句叫做lamabda表达语句
(9)、方法体内部只有一条语句就叫做lambda表达式
(10)、lamabda如何简写匿名函数呢?delegate关键字去掉,参数列表保存下来,然后加上 =>(gose to),最后再加上方法体。
8、泛型复习:
(1)、T就相当于类型占位符。
(2)、在使用的时候把T换成具体的数据类型。
(3)、Action非泛型版本委托是一个没有参数没有返回值的委托。
(4)、Action泛型版本委托是一个没有返回值但是可以最多有16个参数的委托。
(5)、Func泛型版本的委托是一个有返回值最多可以有16个参数的委托。
22.ef执行过程:
(1)、创建上下文之后,上下文就开始跟踪我们的实体
(2)、跟踪所有附加到上下文的实体。
(3)、查询出来的实体的状态(unchanged)、(new 出来的实体的状态是Detached的、附加之后就变成 unchanged)、添加added、修改Modified、删除Deleted
(4)、添加状态的实体会放到一个添加集合里边、修改状态的实体会放到一个修改的集合里边、删除状态的实体会放到一个删除的集合里。
(5)、在调用SaveChanges之后,会把集合里的所有实体拿到去找映射关系,根据映射关系生成相应的sql语句,最后调用ado.net执行sql语句。
22.大数据表的优化
(1)、当数据量小的时候尽量避免使用延迟加载,使用include
(2)、关闭延迟加载:在属性设置里关闭、在上下文类里进行关闭( this.Configuration.LazyLoadingEnabled = false;)
(3)、大数据量的情况下:分解成单表的查询,然后再组装数据,一般用延迟加载,尽量不要使用include。
(4)、在开启延迟加载的情况下用include一次性读取数据。
(5)、ado.net解决大数据表的查询:
使用临时表
1、分别查每个表的数据放到临时表里边。
2、最后对临时表进行链接查询。
(1)、当数据量小的时候尽量避免使用延迟加载,使用include
(2)、关闭延迟加载:在属性设置里关闭、在上下文类里进行关闭( this.Configuration.LazyLoadingEnabled = false;)
(3)、大数据量的情况下:分解成单表的查询,然后再组装数据,一般用延迟加载,尽量不要使用include。
(4)、在开启延迟加载的情况下用include一次性读取数据。
(5)、ado.net解决大数据表的查询:
使用临时表
1、分别查每个表的数据放到临时表里边。
2、最后对临时表进行链接查询。
23.分页、排序
(1)、排序:OrderByDescending,OrderBy ,用lamabda表达式指定排序的列
(2)、分页:先要排序,Skip跳过指定数量的元素,Take取指定数量的元素,
(3)、先where(过滤)再排序最后再分页
24.mvc简介 :mvc一种模式、思想(特定问题的一种解决方案,与平台和语言无关),解决的是表现和逻辑相分离的问题。
asp.net mvc:是mvc思想在.net平台下的实现的框架,只针对web开发
web开发一直在追求表现和逻辑相分离
MVC优点:
(1)、核心是为了分工,也就是分工的好处。
(2)、表现与逻辑相分离
(3)、更好地维护程序
(4)、为了页面更加简洁,节省网络带宽,传输更快,用户体验更好。
25 .控制器向视图传值
(1)、直接把对象通过view的参数传递到视图,视图用 Model来获取。
(2)、用ViewData来传递数据,视图用 ViewData来获取。
(3)、用ViewBag来传递数据,视图用 ViewBag来获取。
26.控制器向视图传值
(1)、直接把对象通过view的参数传递到视图,视图用 Model来获取。
(2)、用ViewData来传递数据,视图用 ViewData来获取。
(3)、用ViewBag来传递数据,视图用 ViewBag来获取。
27.Html辅助方法
(1)、表单:Html.BeginForm() 默认是post请求,然后请求当前的控制器下的action。
(2)、Html辅助方法如果返回字符串不需要加大括号,如果不是返回字符串需要加大括号。
(3)、@Html.TextBox-文本框
@Html.DorpDownList-下拉框
@Html.RadioButton-单选框
@Html.CheckBox-复选框
(4)、生成a标签:@Html.ActionLink("点我", "Test", "Home", new { target="_blank",@class="css"})
总结:在调用辅助方法时,会检查viewdata对象以获得当前显示的值