泛型
2.0 泛型的好处和原理
泛型:解决代码重用,满足不同类型的参数 可以用相同的方法,接口,或者类
调用的时候 不需要声明类型,由编译器推断出来
但是 类型参数和参数必须匹配
泛型的思想 就是延迟声明
延迟声明:把参数类型的声明推迟到调用的时候声明
架构设计有一句话: 延迟 ,推迟一切可以推迟的东西
System.Collections.Generic.List`1[System.Int32]
___ ` 表示 占位符, 有几个类型参数 就显示几
IL:中间语言
{}叫做code block,代码块。
代码块的作用有两个,一个是作为界符,比如一个if包含多个语句,那么如果没有{},就不知道if内执行的语句和if后执行的语句怎么区分
另一个是控制变量作用域
泛型约束,基类约束:
1 在泛型方法内可以直接使用基类的属性和方法
2 调用的时候,只能传递基类或者基类的子类
泛型约束 目标 就是 让上边调用者 更少的犯错
in 逆变,out 协变 只存在泛型接口或者泛型委托中 作用 扩展泛型的使用
out 协变 只能是返回结果 用于父类可以实例子类
in 逆变 只能是参数 用于子类可以实例父类
反射
原理:ado.net提供的帮助类库,可以读取我们编译生成的metadata(元数据)里面的信息
作用一:通过配置文件App.config+简单工厂,可以把项目变成可配置的,可扩展
操作
引用命名空间 using System.Reflection;
//1 动态加载 默认加载当前路径的dll文件,不需要后缀
Assembly assembly = Assembly.Load("Ruanmou.DB.Sqlserver");
//2 获取类型 (获取类型信息的方式不止一个)
Type typeDBHelper = assembly.GetType("Ruanmou.DB.Sqlserver.DBHelper");
//3 创建对象
object oDBHelper = Activator.CreateInstance(typeDBHelper);
简单工厂
原理:把创建对象的代码转移到另一个类,好处就是逻辑独立
案例
public class SimpleFactory { //IDBHelper 配置文件里面的key private static string IDBHelperConfig = ConfigurationManager.AppSettings["IDBHelper"]; public static IDBHelper CreateDBHelper() { string dllName = IDBHelperConfig.Split(',')[1]; string className = IDBHelperConfig.Split(',')[0]; Assembly assembly = Assembly.Load(dllName); Type type = assembly.GetType(className); object oObject = Activator.CreateInstance(type); return (IDBHelper)oObject; } }
委托和Lambda
委托是一种类型
委托的声明
public delegate void NoReturnNoPara();//无参
public delegate void NoReturnNoPara(int id,string str);//有参
不影响到我们编译 不需要升级运行环境 由编译器提供(转中间语言)的快捷方式叫语法糖
如果是调用当前实例方法用this识别
lambda表达式:是一个匿名方法,是一个方法
左边是参数 中间=>(goes to) 右边是方法体 C#3.0
{ NoReturnWithPara method = new NoReturnWithPara( (int id, string name) =>//goes to //lambda表达式:本质是一个匿名方法,是一个方法 { Console.WriteLine(nameOut); Console.WriteLine("{0} {1} DoNothing"); }); method.Invoke(4, "Nine"); }
{ NoReturnWithPara method = new NoReturnWithPara( (id, name) => //去掉参数类型,原因是委托的约束 { Console.WriteLine("{0} {1} DoNothing"); }); method.Invoke(5, "小昶"); }
{ //如果方法体只有一行,那么可以去掉大括号和分号,多行不行 //如果参数只有一个 可以去掉小括号 //如果没有参数,直接用小括号 NoReturnWithPara method = new NoReturnWithPara((id, name) => Console.WriteLine("{0} {1} DoNothing", id, name)); method.Invoke(6, "梦醒时分"); }
//匿名类 var model = new { Id = 1, Name = "Alpha Go", Age = 21, ClassId = 2 }; 匿名类 只读 不能修改
扩展方法:静态类 静态方法 第一个参数类型前面加上this
可以将 ExtendShow.ToInt(ivalue);换成 ivalue.ToInt()
定义的类
public static class ExtendShow { public static int ToInt(this int? iParameter) { return iParameter ?? 0; } public static void NoShow(this LambdaShow show) { Console.WriteLine("这里是扩展的 NoShow"); } }
调用
{ int? ivalue = null; int? ivalue2 = 1; int i = ExtendShow.ToInt(ivalue); int i2 = ivalue.ToInt(); }
sql添加数据后,返回新增的ID,两种方式
1:insert ;select @@identity
2:insert into [{0}] output insertd.id values({1})
封装 继承 多态
封装:隐藏对象的属性和实现的细节,仅对外提供公开字段,公共方法
好处:防止对外错误的修改 重用性更高
继承:好处(代码的重用)一个类只能有一个父类,继承之后可以拥有父类的属性和一切行为,好的坏的都得要
多态:多个类可以继承自同一个类。
注意:子类中如果重写了父类的方法(多态),那么父类中的这个方法将不会再调用。
抽象类
抽象类是一个类,里面可以包含一切类可以包含的
抽象成员 必须包含在抽象类里面,抽象类还可以包含普通成员
继承抽象类后,必须显示的override其抽象成员
抽象类不能直接实例化,声明的对象只能使用抽象类里的方法,不能用子类新增的方法
父类只有一个
is a
抽象方法一定要写在抽象类中
public abstract string Brand();
接口
接口不是类,里面可以包含属性、方法、事件 不能包含字段,委托,不能用访问修饰符(因为默认都是public)
接口只能包含没有实现的方法
实现接口的话,必须实现全部方法
接口不能直接实例化,声明的对象只能使用接口里的方法,不能用子类新增的方法
接口可以实现多个
can do
接口叫实现,抽象类叫继承
接口不需要override关键字,抽象类需要override
抽象类/类就是用来描述是个什么东西
模板化,减少一定代码量
接口就是用来表示我们能做什么,能干什么
功能化,增加一定灵活性
"抽象类是对象的抽象,然接口是一种行为规范"。
virtual :虚方法
/// <summary> /// virtual 虚方法 必须包含实现 但是可以被重载 /// </summary> public virtual void VirtualMethod() { Console.WriteLine("ParentClass VirtualMethod"); }
调用对象原则和就近原则
普通方法是由编译时决定的
虚方法是由运行时决定的
重载 方法名一样,参数个数不一样,参数类型不一样,返回值类型可以不相同,编译时多态
重写(override),方法名的相同,相同的参数 ,相同的返回值类型,只有虚方法和抽象方法才能被覆(重)写,运行时多态
sealed 密封之后不能在被override
public sealed override void AbstractMethod() { Console.WriteLine("ChildClass AbstractMethod"); }
委托(二)和事件
委托是一种类型,可以放在类外和里面。
继承了一个特殊类(MulticastDelegate,多步委托),不能被任何类继承,由编译器和其他工具派生
C#中的多线程都是基于委托的
委托 把方法包裹成了一个变量 等我们需要的时候再去执行它
//方法放到委托内 //2 委托的实例化 NoReturnNoPara method = new NoReturnNoPara(this.DoNothing); method.Invoke();//3 委托的调用 method(); //方法 private void DoNothing() { Console.WriteLine("This is DoNothing"); }
+=就是发生这个事件的来同时要通知你,-=就是发生这个事件不再来通知你了。
事件是一个特殊的委托
cat.MiaoAction += new Stealer().Hide; cat.MiaoAction -= new Stealer().Hide;
设计时用外键,创建数据库取消,程序保证外键关系
一定要用外键的话,常用的有支付和流水
SOA 面向服务架构 减低成本
OOP 面向对象 (属性和行为)。
AOP 面向切面
POP 面向过程编程
SOAP
Remote/{*pathInfo} :路由器中 {*pathInfo} 表示所有路径
读写分离:
二八原则:20%写,80%读
NoSql:非关类型系数据库
autosave 自动把数据保存硬盘
C#----语言
.net Framework -----平台
包含
BCL 基础类库
CLR:公共语言运行库
编程工具
asp.net ----框架
又分:asp.net web from 和 asp.net MVC
C#满足.net Framework 约束
JIT 即时编译器,机器玛
序列化就是把数据转成字符串
反序列化就说把数据转成对象