第一章 MVC 开发前奏
MVC 4.0
1.1 开发环境的搭建
数据库: sql server/mysql ,(正版太贵了,所以很多公司用mysql)
版本控制:git/svn (git 的学习成本有点高)
反编译工具:Reflector
1.1.2 常用设置
显示行号:“工具---->选项---->文本编辑器---->所有语言”下的“行号”
屏幕保护色:“工具>>>选项>>>环境>>>字体和颜色>>>项背景>>>自定义”设置“R:204,G:232,B:204”
1.1.3 vs常用快捷键
F12:转到定义
Alt+F12:查看定义
通过按两次tab键插入代码块,比如 打“for”,按两次tab
Ctrl+-:返回跳转
查找匹配标记:选中 { 或者 #region ,按 ctrl+] 或者 ctrl+shift+] 选中
1.2 常用的辅助开发的工具
PostMan,测试http接口工具
总结:做应用程序开发,算法重要性并不是那么重要,更重要的反倒是面向对象的思想
不要总是just do coding,要学会与人打交道,而不是只与机器打交道
1.4 C#语法新特性
mvc 4.0有些新语法,其实都是些 “语法糖”,由编译器转成原始的语法
1.4.0 C#1.0 委托
- 委托是一中类型,使用时候需要先定义,在实例化
- 委托的作用:将方法作为参数进行传递时候用到委托,比如 多线程
- 委托与事件关系:事件是委托的一个实例
1.4.1 C# 2.0新特性
1.泛型
2.泛性约束
3.部分类(partial)
部分类在编译的时候将把partial关键字定义的类合在一起,在EF中使用T4模板自动生成代码的时候部分类作用非常重要
4.匿名方法(4.0时候使用lambda表达式代替)
匿名方法本质就是委托,函数式编程的最大特点就是把方法作为参数和返回值。
编译后生成委托对象,生成方法,然后把方法装入委托对象,最后赋值给声明的委托变量。
1.4.2 C# 3.0/3.5新特性
1.自动属性
在C#3.0之前,这样实现的
2.隐式推断类型Var
在C#中var 声明一个对象时编译器会自动根据赋值语句推断这个局部变量的类型,赋值以后,这个变量的类型也就可以确定并且不可更改,另外var 也可用于匿名类的声明。
3. 初始化器
对象初始化器
集合初始化器
数组初始化
4.匿名类
注意:
当出现“相同”的匿名类时,编译器只会创建一个匿名类
5.扩展方法
扩展方法是一种特殊的静态方法,可以像扩展类型上的实例方法一样进行调用,能向现有的类型“添加”方法,而无需创建新的派送类型
编译器认为一个表达式要使用一个实例方法,但是没有找到,这时候就需要检查导入的命名空间和当前命名空间里所有的扩展方法,并匹配到适合的方法。
注意:
6.系统内置委托
逆变:传入的参数
协变:返回值
C#内置了一些常用的委托,包括Action类的委托、Func类的委托、Predicate<T>委托、Comparison<T>委托等等。以上这些委托的命名空间都是System
就像我们自己已定义好的一样,要实现某些功能,我们可以直接利用系统内置委托,实例化它们,而不必显式定义一个新委托并将命名方法分配给该委托。
下面是我对这四类委托的总结,并附有结合匿名方法与Lambda表达式的范例,两种方法实现的结果一样
一、Action类的委托
1.Action委托 封装一个方法,该方法不具有参数并且不返回值
2.Action<T>委托 封装一个方法,该方法只有一个参数并且不返回值
3.Action<T1,T2>委托 封装一个方法,该方法具有两个参数并且不返回值
…… ……
17.Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>委托 封装一个方法,该方法具有16个参数并且不返回值
下面以Action<T>委托为例,示范如何使用Action类的委托,该类委托仅仅是参数个数上有区别而已。
总结:
Action类的委托最少可以传入0个参数,最多可以传入16个参数,参数类型皆为逆变,并且不返回值。
二、Func类的委托
1.Func(TResult)委托封装封装一个不具有参数但却返回 TResult 参数指定的类型值的方法
2.Func(T,TResult)委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法
3.Func(T1,T2,TResult)委托 封装一个具有两个参数并返回 TResult 参数指定的类型值的方法
…… ……
17.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>委托 封装一个方法,该方法具有16个参数,并返回TResult参数所指定的类型的值
下面以Func<T,TResult>委托为例,示范如何使用Func类的委托,该类委托仅仅是参数个数上有区别而已。
总结:
Func类的委托最少可以传入输入泛型参数(in,逆变) 1个,最多可以传入输入泛型参数(in,逆变) 16个,传入的输出泛型参数(out,协变)有且只有一个,这个类型是此委托封装的方法的返回值类型。
三、Predicate<T>委托
表示定义一组条件并确定指定对象是否符合这些条件的方法
该方法始终返回bool类型的值。如果该对象符合由此委托表示的方法中定义的条件,则为 true;否则为 false。
下面给出Predicate<T>委托的范例:
四.Comparison<T>委托
表示比较同一类型的两个对象的方法
下面给出Comparison<T>委托的范例:
7.Lambda表达式
Lambda表达式本质上就是匿名函数,当有输入参数时候,括号是可选的,当只有一个输入参数,可以省略括号
X=> X>1
(X,Y) => X>Y
有时,编译器难于或无法推断输入类型。就需要显式的指定类型
使用空括号指定零个输入参数:
8. Linq
为什么使用Linq以及Linq 的推演过程 (融合了拓展方法,var 推断,lambda)
https://www.cnblogs.com/dotnet261010/p/8278793.html
Linq 主要用于数据集的查询筛选
LINQ主要包含以下三部分:
1、LINQ to Objects 主要负责对象的查询。
2、LINQ to XML 主要负责XML的查询。
3、LINQ to ADO.NET 主要负责数据库的查询。
LINQ to SQL
LINQ to DataSet
LINQ to Entities
Linq查询的两种方式:
1、查询方法方式:主要利用System.Linq.Enumerable类中定义的扩展方法和Lambda表达式进行查询 (标准查询运算符(SQO)
2、查询语句方式:一种更接近SQL语法的查询方式
查询语句VS查询方法
1、CLR本身并不理解查询语句,它只理解查询方法
2、编译器负责在编译时将查询语句翻译成查询方法
3、大部分查询方法都有对应的查询语句形式:Select()对应select、OrderBy()对应orderby
4、部分查询方法目前在C#中还没有对应的查询语句,如:Count()和Max()这时只能采用以下替代方案:
查询方法
查询语句+查询方法的混合方式
PS: Linq的具体语法可以参考
https://www.cnblogs.com/dotnet261010/category/997880.html
1.4.3 C# 4.0 新特性
1.可选参数和命名参数
可选参数
PS:注意事项
- l 可选参数不能为参数列表的第一个参数,必须位于所有的必须参数之后(除非没有必选参数)
- l 可选参数必须指定一个默认值,且默认值必须是一个常量表达式,不能是一个变量
如何解决 可选参数与重载的问题?可以通过
命名参数
//传统方式调用
PrintOrderDetails("Gift Shop", 31, "Red Mug");
//命名参数,可以与形参定义的顺序不一致
PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop"); // PrintOrderDetails(productName: "Red Mug", sellerName: "Gift Shop", orderNum: 31); // static void PrintOrderDetails(string sellerName, int orderNum, string productName) {}
Dynamic 特性
建议大家多使用reflector工具来查看C#代码和IL语言,reflector就像一面照妖镜,C#语法糖在它面前都将原形毕露。
1.4.4 C# 5.0 Async和Await使异步编程更简单
待更新…………