泛型
和Cpp中的泛型很像
泛型类
public class MyGenericArray{ public MyGenericArray(int size){} }
MyGenericArray intArray = new MyGenericArray(5);
泛型方法
static void Swap(ref T lhs, ref T rhs) {}
Swap(ref a, ref b);
委托
类似于C/Cpp中的函数指针,可以存有对某个方法的引用,它是 一种引用类型变量。引用可在运行时被改变
特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
理解一切皆地址:
变量名代表所存储值在内存中的起始地址,变量大小指定了在起始地址上要偏移的长度。
方法名代表方法所包含的所有指令在内存中的起始地址,所有指令长度之和指定了在起始地址上要偏移的长度
理解声明委托所需要遵守的规则:
委托人的签名要和被委托人的签名一致
形象地理解:
和现实中的委托一样,我们要做一件自己可能不方便做的事,就可以委托别人帮助我们做。我们需要告诉他用什么做(把自己的函数名传给他)
委托有三种:
Action:委托人签名为:
返回值为 ,参数为void
Func <retType,参数列表>:
委托人签名为:返回值为retType型,参数为(参数列表)型
自定义:delegate [typeReturn] Name (TypeList Args)
//自定义类型
public delegate int MyDelegate (string s);
MyDelegate Refed_object1 = new MyDelegate(specified_func);
Refed_object1.Invoke("xxxx");
//Action
void sepecified_func(void);
Action action = new Action( specified_func); // specified_func的签名是:返回值为void,无传入参数
action.Invole
//Func
int Calculate(int,int);
Func<int,int,int> func= new Func( Calculate ); // Calculate的签名指定在Func的<>中第一个是返回值,后面都是Calculate的参数
func.Invoke(1,2);
泛型委托
int add(int,int);
double multi(double,double);
delegate T myfunc<T>(T a , T b );
//使用
myfunc<int> func1 = new myfunc<int>(add);
myfunc<double> func2 = new myfunc<double>(multi);
func1.Invoke(1,2);
func2.Invoke(3.12,3.15);
事件—windows图形界面与用户交互的基石
基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。事件是用于进程间通信。
集合
集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。
Lambda
提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。
在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。
对比有名与匿名:
//有名方法,先声明后使用
static int add(int a,int b)
{
return (a+b);
}
add(1,2);
//===================================================
//匿名方法,调用与声明同时进行
//如果程序当中有许多细碎的小函数,而且他们可能不会被重复调用,那将他们
//前声明出来性价比就很低
Func<int,int,int> func = new Func<int,int,int>( (int a,int b)=>{return (a+b);} );
//可简化:Func<int,int,int> func = (a,b)=>{return (a+b)}; //前面委托指定了参数类型,lambda中参数类型就不用再声明了
int res = func(100,200);
func = new Func<int,int,int>( (int x,int y)=>{return (x*y);} );
//可简化:func = (x,y)=>{return (x*y);}
int res = fun(100,200);
//===============================================================
//匿名方法作为参数
static void DosomeCalc<T>(Func<T,T,T> func,T a,T b)
{
func(a,b);
}
DosomeCalc<int>( (a,b)=>{return a+b;}, 2 , 4);
最主要的是搞懂泛型委托的参数类型推断的那一点灵性,推断很重要,决定了匿名能否写的干净利落。
ORM:Object Relational Mapping 对象关系映射
是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换
从效果上说,它其实是创建了一个可在 编程语言 里使用的“虚拟对象数据库
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
ORM相当于中继数据。具体到产品上,例如下边的ADO.NET Entity Framework。DLINQ中实体类的属性[Table]就算是一种中继数据。
ADO.NET Entity Framework 实体框架
微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。EF提供变更跟踪、唯一性约束、惰性加载、查询事物等。开发人员使用LINQ语言,对数据库操作如同操作Object对象一样省事。
功能:
.跨平台 EF Core是一个跨平台的框架,可以在Windows,Linux和Mac上运行。
.建模 EF可以创建具有不同数据类型get / set属性的EDM(Entity Data Model/实体数据模型)。它使用此模型查询或保存底层数据库的数据。
.查询 EF允许我们使用LINQ从底层数据库中检索数据,同时也支持直接对数据库执行原始SQL查询。
.更改跟踪 EF会跟踪需要提交到数据库的实体实例(属性值)发生的更改。
.保存 EF调用SaveChanges()方法时,根据实体发生的更改,对数据库执行INSERT,UPDATE和DELETE命令。EF还提供了异步的SaveChangesAsync()方法。
.并发 默认情况下,从数据是从数据库中提取开始,EF使用乐观并发来避免我们做的修改被其他用户覆盖。
.事务 EF在查询或保存数据时自动执行事务管理。它还提供自定义事务管理的选项。
.缓存 EF包括开箱即用的第一级缓存。因此,重复查询将从缓存中返回数据,而不是访问数据库。
.配置 EF允许我们使用注释属性配置EF模型,也可以使用Fluent API来覆盖默认约定。
.迁移 EF提供了一组迁移命令,我们可以在NuGet Package Manager控制台或命令行界面中执行这些命令来创建或管理底层数据库计划。
//=====================================================
LINQ: .NET Language Integrated Query 集成查询语言
var dbContext = new AdventureWorks2014Entities();
var allPeople = dbContext.People.ToList();
var allFirstName = dbContext.People.Select(p=>p.FirstName).ToList();//返回所有人名的FirstName
var allFullNames bContext.People.Select(p=>p.FirstName + " " + p.LastName).ToList();
var allFullNames = dbContext.People.Where(p=>{p.FirstName=="Timothy"})
.Select(p=>p.FirstName + " " + p.LastName).ToList()