C/CPP过渡到C#的简易教程2

泛型

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值