知识点汇总

C#语言新特性

自动属性

下面两种写法作用相同.前者属于自动属性.在使用自动属性时应该注意:get和set访问器不能有具体的实现.

可空类型(可以为空的值类型)

对于值类型而言,C#规定:在定义变量的同时必须要对其赋初值,否则可能无法通过编译器的编译.但是在某些情况下,用户事先是不知道变量的初始值是多少的.因为可以为空的值类型就显得很重要.

  1. 值类型包括:int\double\float\decimal\bool\char
  2. 可为空的语法为:Nullable<T>,其中T指代上面具体的某种值类型

比如,可以为空的int类型:Nullable<int>;可以为空的bool类型:Nullable<bool>

  1. 可以为空的变量,在赋值时,可以将null赋值给它.

例如:Nullable<int>  age  =  null;

  1. Nullable<T>可以简写为:T?

例如: Nullable<int> age = null;等价于int? age = null;

  1. 下面两种写法都是错误的.

string? name = null;  Student? Stu = null;

因为string和Student都是引用类型.

  1. 可空值类型的常用属性:

l HasValue:布尔类型,如果字段不为null返回true,否则返回false.

l Value:获取字段的值,如果该字段的值为null,那么调用Value属性会报错

泛型类

List<T>:T可以指代任何类型,比如:int\bool\string\Student\...

Dictionary<T, K>:字典类,其中T和K可以指代任何类型

KeyValuePair<Tkey, Tvalue>:键值对类型

对象初始化器

利用对象初始化器,在实例化一个类对象的同时可以为它的属性赋值.

集合初始化器

利用集合初始化器,可以在实例化一个集合对象时为它指定元素

var关键字

var用于定义变量,变量的类型根据值来确定.

var  a  = 5; 因为5是int类型,所以a的类型也是int

var  stu  =  new  Student();因为通过new创建的是Student类型的变量,所以stu是Student类型.

注意1:var b;这种写法是错误的.原因是由var声明的变量,必须在定义的同时就赋初值.

注意2:通过var声明的变量一旦实例化后,就不能再更改它的数据类型.例如下面的代码:

var  a  =  5;  a  =  “zhangsan”;//a=”zhangsan”报错

匿名类型

在实例化一个类对象时,可以无须事先定义该类,通过new{}即可动态创建类对象.

扩展方法

扩展方法是指:为以前定义好的类扩展其他方法.具体步骤如下:

  1. 首先,定义一个静态类(类的名称没有限制)
  2. 其次,在静态类中定义一个静态方法(方法返回值根据实际情况自定定义)
  3. 最后,给上述静态方法添加一个参数,且该参数必须被this关键字修饰.

注意:  上面被this关键字修饰的参数的类型就是该扩展方法所扩展的类型

下面的代码演示了如何为string类扩展名称为Convert的无参方法.

匿名类型和Lambda表达式

  1. 什么是委托:委托允许将一个方法作为参数,传递给另外一个方法.

下面的代码演示了如果使用委托计算2个数字的加法\减法\乘法.

委托和挂载的方法:参数个数\参数类型\参数顺序\返回值类型必须要一致.

2.但是上述方式,使用很复杂.我们可以通过匿名方法来简写上述功能.=符号右侧的就是匿名方法.

3.Lambda表达式也是匿名方法的一种.并且它的语法更加简洁明了.

  Lambda表达式分3部分  :   参数   |   =>   |    表达式

下面的代码演示了如果使用Lambda表达式改写委托的示例.其中3个粉色的线框就是Lambda的3部分.

注意1:如果Lambda表达式只有1个参数,那么参数部分可以不用()包裹

注意2:Lambda表达式部分可以使用{}包裹,也可以不包裹.如果有多行代码,必须要使用{}包裹起来.

4. 在出现委托(Func参数)的地方,我们就可以写Lambda表达式.

Func<T, K>是一个泛型委托.该委托的参数类型为T,返回值类型为K.

Lambda表达式的参数arg的类型为T,Lambda的表达式部分返回值类型为K.

分部类

分部类允许将一个类的定义拆分到多个文件中.Winform应用程序和ASP.NET Webform应用程序中的每一个窗体所对应的后台类就采用了分部类技术.

分部类的语法就是:在类声明时,在关键字class前添加partial关键字.

下面的代码将名称为Person的类拆分到了2个类文件中,分别是:Person.cs文件和PersonExt.cs文件.

  

Linq查询知识点详解

Linq标准查询语法格式

var data = from  变量  in  集合对象

where  布尔表达式

orderby  排序字段  descending|ascending

select  变量;

解释:

select:提取要查询的数据                 where:筛选满足条件的元素

from 变量:该变量指代集合中的单个元素   in:从哪里筛选元素

orderby:排序                          descending:降序  ascending:升序

注意:where是可选的,如果不加where则表示筛选所有元素.

示例代码:

使用Linq进行数据查询的条件

数据源(in 后面的集合对象)必须直接或间接继承自IEnumerable<T>

或者说:只要数据源继承自IEnumerable<T>,我们就可以使用Linq从它里面检索数据

Where关键字

筛选满足条件的元素,where关键字后面一定要跟布尔表达式

Where后面的布尔表达式可以很简单,也可以是复杂的表达式.

注意:

注意from关键字后面可以出现多个where表达式,这些表达式之间是并且的关系

Select关键字

Select关键字用于提取要查询的数据.

Select后面可以直接跟from后面的变量;也可以跟一个匿名类型.

Count()方法

Count(expression<Func<T, bool>>)

解释:T代表Lambda表达式中的参数部分,bool代表Lambda表达式部分为布尔类型

Count方法用于获取满足条件的记录数量(有多少个满足条件的记录)

Max()和Min()

Max(Expression<Func<T, K>>)和Min(Expression<Func<T, K>>)

Max:求最大值    Min:求最小值

First()和FirstOrDefault()

First(Expression<Func<T, bool>>)

FirstOrDefault(Expression<Func<T, bool>>)

两个方法都是从集合中筛选满足条件的第一个元素.

区别:当没有从集合中筛选到满足的条件的元素时,First将会报错,FirstOrDefault则不会报错.

Average()方法

该方法用于计算平均值

Linq的联合查询

将两个集合进行关联,然后从这两个集合中提取所需要的数据.

语法格式:

var  data  =  from  变量1  in  集合1

from  变量2  in  集合2

where  变量1.属性  ==  变量2.属性

select  new { ...  ...}

提示:可以将N个集合进行关联(N>=2)

示例代码:

Sum()

Sum(Func<T, K>)

其中T为参数的类型,K为返回值的类型.

Sum()方法用于对数据进行求和运算.

OrderBy()和OrderByDescending()

这两个方法用于实现对数据进行排序(升序和降序)

group by分组

分组的标准语法:

var  data  =  from  变量1  in  集合对象

group  变量1  by  变量1.属性  into  变量2

select  变量2;

注意:使用group by分组后,将不能使用之前的变量1,需要通过into关键字定义一个新的变量2.新的变量指代的是分组后的每一组.

关于分组的示例

其他:

  • 在进行数据查询时,.net framework为我们提供了2套方案:

一种是使用标准的linq查询语法=>

(from\in\select\where\orderby\ascdening\descending\group\by\into\join);

另一种方案是使用扩展方法=>

(Where\Select\FirstOrDefault\Count\Sum\Average\Max\Min\OrderBy\OrderByDescending\GroupBy\Last\LastOrDefault)

当然,我们也可以将2种混合起来使用.

  • 其他常用扩展方法

Intersect:取两个集合的交集             Union:取两个集合的并集

Except:去两个集合的差集                 Reverse:反转序列中元素的顺序

ForEach:遍历集合中的元素

            Linq To Sql

Linq及其扩展

Linq是一种数据查询语言(它能够从多种数据源中查询数据). 现在基于Linq的扩展有:

  1. Linq To Object:主要是从内存对象中查询数据
  2. Linq To Sql:主要是从MS Sql Server数据库中操纵(查询\新增\修改\删除)数据
  3. Linq To XML:主要是从XML片段或XML文档中查询数据

Linq To Sql简介

Linq To Sql是一个微软在.NET Framework 3.5中推出的一款ORM(Object  Relation  Model)实体框架.一个好的实体框架除了能够将数据表映射为实体类,还应该支持使用面向的思想去操纵关系型数据库.现在比较流行的ORM框架包括:Linq To Sql\Entity Framework\Nhibernate等.

我们在使用Linq To Sql的过程中,很少去手写SQL语句就能实现常见的数据增删改差操作.但是它的底层实现仍然是Ado.net.那么如何检测Linq To Sql生成的SQL语句呢?通过DataContext的Log属性即可实现检测功能.

Linq To Sql设计器

在服务器资源管理器中通过拖拽的方式,将数据表放置到Linq To Sql的设计器区域后,VS会自动将这些数据表生成N+1(N为数据表的个数)个类.这些类大致可以分为2种:一种是数据库上下文,另一种是实体类.数据库上下文类就是名称以DataContext结尾的类,它继承自Sytem.Data.Linq.DataContext.

他们的作用分别是:DataContext类用于和数据库交互(增删改查),每次进行数据库操作时,都应该先创建该类对象;

而每一个实体类则和数据表相对应.

DataContext的特性标记为Database,表示与数据库相关

实体类的特性标记是Table,表示与数据表相关

实体类中属性的特性标记是Column,表示与数据列相关

DataContext数据库上下文类的常用属性和方法

CreateDatabase():创建数据库

DeleteDatabase():删除数据库

DatabaseExits():判断数据库是否存在

Log:该属性用于检测和写入LINQ TO SQL生成的SQL语句

Linq To Sql常用操作

新增数据

void  InsertOnSubmit():实现每次新增1条记录

void  InsertAllOnSubmit():实现一次新增多条记录

注意:调用InsertOnSubmit后,一定要再调用DataContext.SubmitChanges();

修改数据

首先,查询到要修改的元素

其次,改变元素相应的属性

最后,调用dataContext.SubmitChanges()

删除数据

首先,查询到要删除的元素

其次,调用void DeleteOnSubmit()删除单个元素,如果要删除多个可以调用void DelteAllOnSubmit()

最后,调用dataContext.SubmitChanges();

数据查询

数据查询时,有2种常用的使用方式.一种是使用linq的标准语法;一种是使用Lambda表达式扩展方法.

单表查询:

多表查询:

典型应用场景

场景1:服务器获取动态表单数据

做法一:

做法二:

上述两种做法都可以实现功能.做法一是先实现工资模版的新增,然后再新增工资条目.做法二是向工资模版对象中添加多个工资条目,然后向数据库提交工资模版.

需要注意的是,做法一中为工资条目对象设置了工资模版ID,而做法二并没有为工资条目设置工资模版ID.但为什么最后效果却是一样的呢?

因为我们将工资条目添加到工资模版对象中时,linq to sql会自动将主外键关系的字段赋值.

场景2:使用Linq To Sql进行分页

分页功能需要使用两个函数进行组合:Skip()和Take()

Skip(int count):跳过count条数据

Take(int count):从开始位置提取count条记录

分页查询: dataContext.XXX.Skip(pageIndex * pageSize).Take(pageSize)

pageIndex是要提取的第几页记录.pageIndex >= 0

pageSize是每页显示的记录条数

场景3:在分层中如何使用Linq To Sql

Linq To Sql是ADO.NET的一种替代方案,而ADO.NET属于数据层的范畴,因此应该将Linq To Sql添加到数据层.又因为Linq To Sql生成的类既包括了DataContext,又包括了实体类,所以如果要利用Linq To Sql生成的实体类,就需要将这些实体类剪切到实体层中,然后在向DataContext中添加实体层的引用即可.

当然,我们也可以不将Linq To Sql生成的实体类剪切到实体层中,那么这样我们就需要额外重新编写实体层需要的实体类.

其他

  • EntitySet<T>:该类表示数据实体的集合
  • System.Data.Linq.Table<T>:该类表示数据表对象
  • 如何判定通过Linq To Sql进行数据的修改\删除\新增是否成功?

因为InsertOnSubmit方法和DataContext.SubmitChanges()方法都没有任何返回值,所以无法通过他们判断出是否操作成功.判断的标准就是:如果不抛出异常就成功,抛出异常肯定就失败了.

  • 对于标识列(自动生成列)而言,在调用DataContext.XXX.InsertOnSubmit()后是无法获取标识列的值的;只有在调用DataContext.SubmitChanges()后方能获取标识列的值.
  • 在项目中,我们可以利用VS提供的Linq To Sql设计器,快速的生成DataContext和实体类.也可以手写相应的类代码.在这里推荐大家使用VS提供的Linq To Sql设计器,因为它更加方便快捷,基本都是通过拖拽的方式就实现我们想要的效果.除非设计器生成的代码不满足你的要求,我们才会采用第二种方案.
时间: 2024-10-13 00:43:56

知识点汇总的相关文章

《App研发录》知识点汇总

原文链接:http://www.jianshu.com/p/fc8c4638937e <App研发录>这部书是包建强写的,说来也巧,在读这边书之前在看池建强的<Mac 人生元编程> ,所以读这本书的时候,将这两个建强搞混.这本书花了我一周多一点的时间看完.昨天晚看完久久不能寐,一是惊叹这本书的干货太多,这本书不同于市面上其他的Android 教程,给你讲一堆API方法,Android 基础,作者从一个APP团队的负责人的角度高屋建瓴的讲解App框架设计,Bug收集汇总分析,团队建设

APP研发录

APP研发录 1.代码重构 2.网络框架 3.场景设计 4.编码规范 5.异常管理 6.代码混淆 7.持续集成 8.竞品技术 9.项目管理 10.日常问题 11.无线团队 来自为知笔记(Wiz)

《App研发录》面世

古者富贵而名灭,不可胜记,唯倜傥非常之人称焉.故西伯拘而演<周易>,屈原放逐,乃赋<离骚>.文人雅士一次次的谱写着千古绝唱,而我亦不能免俗,也要附庸风雅,写一部前不见古人.后不见来者的经典之作. 于是,历时一年,呕心沥血,结合自身3年来从事App领域的一线实战经验,再辅之以从事软件行业十余载的奇技淫巧,写下这洋洋洒洒三百多页十几万字.初稿完成后,就如同和氏璧般,竟找不到出版社愿意出版,而我又不肯妥协,去写那些无关痛痒的语法介绍和UI布局等入门级章节.就在这时,杜勇帮我介绍了机械工业

APP研发录笔记

一.消灭全局变量 在内存不足时,系统会回收一部分闲置的资源,由于App被切换到后台,所以之前存放的全局变量很容易被回收,这时再切换到前台继续使用,会报空指针崩溃.想彻底解决这个问题,就要使用序列化. 1.把数据作为intent的参数传递 使用intent进行页面间数据的传递,即使activity被摧毁,intent上的数据依然存在,所以intent是保存数据的好地方,比本地文件靠谱. 但是intent能传递的数据类型也必须支持序列化,像JSONObject这样的数据类型,是传不过去的. inte

vue2.0:(八)、外卖App弹窗部分知识点总结

本篇文章是对外卖App弹窗部分知识点的总结. 知识点一:如何从接口取出不同的图片. 答: 1.header.vue: 代码: <ul v-if="seller.supports" class="supports"> <li class="support-item" v-for="(item,index) in seller.supports"> <span class="icon&quo

Java研发工程师知识点总结

Java研发工程师知识点总结 最近一次更新2017年12月08日 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 四.Java虚拟机 五.数据库(Sql.MySQL.Redis等) 六.算法与数据结构 七.计算机网络 八.操作系统(OS基础.Linux等) 九.其他 一.Java基础(语言.集合框架.OOP.设计模式等) 1. HashMap和Hashtable的区别 Hashtable是基于陈旧的Dicti

赵雅智:js知识点汇总

赵雅智:js知识点汇总,布布扣,bubuko.com

CodeIgniter框架——知识点汇总

NO1.学习要点: 一.CodeIgniter 框架的简介 二.CodeIgniter 框架的安装 三.CodeIgniter 框架的目录结构分析 四.CodeIgniter 框架是如何工作的? 五.CodeIgniter 框架中的控制器.视图.模型及数据库操作 六.CodeIgniter 框架中辅助函数.类库.适配器的学习 七.…… NO2. 一.CodeIgniter 是什么? 1.CodeIgniter 是一个应用程序框架 CodeIgniter 是一个为用 PHP 编写网络应用程序的人员

《正则表达式》知识点汇总摘录

开园一个月了,但一直没有抽出多少时间,就算有时间,也不知道怎么组织语言记(不是写,是记,写是一个创造的过程,像我这等程序猿,猿嘴吐不出象牙!)点东西!翻翻过去手头整理的一些知识点杂记,然后再结合网上的一些,今天对正则表达式在做一个个人的知识汇总摘录吧!程序员都是共产主义者,一点不假!大部分时候我们只是互联网的搬运工,堆砌者(扯远了,当然成为互联网创造者一直使我们的目标!). 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串&quo

软考网络工程师易混淆的知识点汇总

网络工程师考试是全国计算机技术与软件水平考试的一项中级资格考试,通过考试的合格人员能根据应用部门的要求进行网络系统的规划.设计和网络设备的软硬件安装调试工作,能进行网络系统的运行.维护和管理,能高效.可靠.安全地管理网络资源,作为网络专业人员对系统开发进行技术支持和指导,具有工程师的实际工作能力和业务水平,能指导网络管理员从事网络系统的构建和管理工作.网络工程师考试是软考的一大热门,怎样才能顺利通过考试是广大考生都想知道的,下面希赛软考学院为您带来网络工程师备考锦囊之应战篇,专业老师整理的网络工