第 4 章—— C# 语言特性(《精通 ASP.NET MVC 5》)
这里只提供各个特性的简单概括。
C# 的完整指南可参阅《Introducing Visual C#》、深度了解 LINQ 可参考《Pro LINQ in C#》
4.1 准备示例项目
为了演示语言特性,笔者用 “ASP.NET MVC 4 Application” 模板创建了一个新的 Visual Studio 项目。(名称为 LanguageFeatures,选择 “空模板” 作为初始内容,并对 “添加文件夹和核心引用” 选中了 “MVC” 选项)
(本章需要一个简单的控制器来演示这些语言特性,所以在 “Controllers” 文件夹中创建 HomeControllers.cs 文件 —— 右击 Controllers 文件夹,选择 “添加”、“控制器”,然后从 “选择支架” 菜单中选择 “空的 MVC 5 控制器”,单击 “添加” 按钮,将名称设置为 “HomeController”,单击 “添加” 按钮。最后,编辑其内容)
添加 System.Net.Http 程序集
本章后面部分()将使用一个依赖于 System.Net.Http 程序集的示例(该程序集默认情况下不会添加到 MVC 项目中)—— 打开 “引用管理器” 窗口,在窗口左侧选择 “程序集”,并勾选 “System.Net.Http”选项。
特性一、使用自动实现的属性
使用属性要比使用字段更好,因为你可以修改 get 块和 set 块中的语句,而不需要修改依赖于这个属性的类。
属性固然号,但是当一个类有很多属性时,事情就变得有点乏味了 —— 所有属性都要对字段协调访问 —— 产生了一个不必要的冗长的类文件。
属性要具有灵活性 —— 没有重复的 getter 和 setter,解决办法是使用一种自动实现的属性(也成为 “自动属性”)
利用自动属性,可以采用字段支持式属性模式,而不需要定义这个字段或在 getter 和 setter 中指定代码,如下所示:
public int ID { get; set;}
public int Name { get; set;}
public int Price { get; set;}
注意,这里并未定义 getter 和 setter的体,也未定义该属性返回的字段。—— 这两者都由 C# 编译器在这个类被编译时自动完成。使用自动属性与使用规则属性没什么不同。
通过使用自动属性可以减少一些输入,形成更易于阅读的代码。(并保持了属性的灵活性)
如果需要改变一个属性的实现方式,还可以返回到规则属性的格式。(必须同时实现 getter 和 setter,以回到规则属性的定义方式。另外还有一点要注意 —— 必须补上属性所对应的字段的定义)
C# 在一个属性中不支持混用自动和规则风格的 getter 和 setter 。
特性二、使用对象与集合的初始化器
另一个烦人的编程任务是构造一个新的对象,然后给属性赋值。例如:
Product myProduct = new Product(); //创建一个新的 Product 对象
//设置属性值
myProduct.ID = 100;
myProduct.Name = "口香糖";
myProduct.Description = "请不要吞咽";
myProduct.Price = "2M";
myProduct.Category = "零食";
在这个示例中必须要通过 2 个步骤才能创建 Product 对象:创建对象、设置参数值。—— 而使用对象初始化器特性可以在一个步骤中创建并填写 Product 实例,如下所示:
Product myProduct = new Product {
ID = 100,
Name = "口香糖",
Description = "请不要吞咽", Price = "2M", Category = "零食"
}
Product 名称之后所调用的花括号形成了初始化器,目的是为参数提供值,以此作为该对象的构造过程。
以这种同样的特性作为构造过程,也能对集合和数组的内容进行初始化。
string[ ] stringArray = { "apple", "orange", "plum" };
List<int> intList = new List<int> { 10, 20, 30, 40 };
Dictionary<string, int> myDic = new Dictionary<string, int> { { "apple",10 }, { "orange", 20 } };
这种特性是一种语法的便利,它只是使 C# 用起来更舒适,并没有任何其他影响或好处。
特性三、使用扩展方法
扩展方法是指给那些不是你拥有的、不能直接修改的类添加方法的一种方便的办法。
在 Models 文件夹中创建 MyExtensionMethods.cs 类文件
public static class MyExtensionMethods
{
public static decimal TotalPrices(this ShoppingCart cartParam)
{
decimal total = 0;
foreach (Product prod in cartParam.Products)
{
total += prod.Price;
}
return total;
}
}
第一个参数前的 this 关键字把 TotalPrices 标记为是一个扩展方法。
第一个参数告诉 .NET,这个扩展方法运用于哪个类 —— 此例为 ShoppingCart 类。(可以通过使用 cartParam 参数类引用 ShoppingCart 类的实例,ShoppingCart 类是这个扩展方法所运用的类)
通过使用扩展方法可以可以扩展类的功能,但只能使用有权限访问的类成员。(方法、字段、属性等)
TotalPrices 虽然是由一个完全不同的类所定义的扩展方法,但依然可以像其他方法一样在 ShoppingCart 对象上调用,就好像它是 ShoppingCart 类的一部分。(如果你的扩展类和当前类位于同一命名空间中,或是在 using 语句子项的命名空间中,.NET便会找到它们)
4.4.1 对接口运用扩展方法
也可以创建运用于一个接口的扩展方法,并允许在实现这个接口的所有类上调用这个扩展方法。
……(这一部分先跳过吧)
[ 未完待续……]
第 4 章—— C# 语言特性(《精通 ASP.NET MVC 5》)的更多相关文章
- 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引
索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(1)搭建MVC环境 注册区域 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(2)创建 ...
- 精通ASP.Net MVC 3 框架(第三版)学习笔记
精通ASP.Net MVC 3 框架(第三版)学习笔记 代码才是王道. http://pan.baidu.com/s/1pJyL1cn
- 3.4 自动测试初步《精通ASP.NET MVC 5》
概述 ASP.NET MVC 框架已被设计成易于建立自动测试,并易于采用诸如测试驱动开发(TDD)等的开发方法学.ASP.NET MVC 为自动化测试提供了一个理想平台. 从广义上讲,当今的 Web ...
- 3.3 建立松耦合组件(MVC 模式最重要的特性之一是它支持、关注“分离”)《精通 ASP.NET MVC 5》 推荐指数:8 星半
笔者通常希望应用程序中的组件尽可能独立,而只有很少几个可控的依赖项.—— 在理想情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他区域.这称为松耦合 .—— 它能够使应用程序更易 ...
- 【开源分享:入门到精通ASP.NET MVC+EF6+Bootstrap】从这里开始,一起搭框架(1)开篇介绍
框架简介 这几年一直在做ASP.NET开发,几年前做项目都是老老实实一行行的写代码,后来发现那些高手基本都会有自己积累起来的代码库,现在称之为开发框架,基础代码不用再去堆,主要精力可以集中在业务逻辑实 ...
- 精通 ASP.NET MVC 4 学习笔记(一)
这里记录着从 P132 到 P192 的内容.水分很足,大部分是书上的代码,我只加了一些基于我自己的理解的能帮助初学者看懂的注释,并且把书中的部分内容做了一些的拓展. 建立数据层 设置 DI 容器 / ...
- 使用整体模型模板辅助器 Using Whole-Model Templated Helpers 模板辅助器方法 精通ASP.NET MVC 5
怎么会
- Creating Form Elements --Using BeginForm and EndForm 使用内建的Form辅助器方法 精通ASP.NET MVC 5
Using the BeginForm and EndForm Helper Methods in the CreatePerson.cshtml File
- Creating Custom Helper Methods 创建自定义辅助器方法----辅助器方法 ------ 精通ASP.NET MVC 5
创建内联的辅助器方法 和 拓展方法 好像类似的功能. 不过写在前台更直观
随机推荐
- 一个简单的JavaScript实例
1 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...
- SP211 PRIMIT - Primitivus recurencis(欧拉回路)
SP211 PRIMIT - Primitivus recurencis 欧拉回路 Warning: enormous Input/Output data 警告:巨大的输入/输出 经过若干(11)次提 ...
- 计算两个集合的差集——第六期 Power8 算法挑战赛
第六期Power8大赛 1.1 比赛题目 题目: 计算两个集合的差集: 详细说明: 分别有集合A和B两个大数集合,求解集合A与B的差集(A中有,但B中无的元素),并将结果保存在集合C中,要求集合C中的 ...
- 08: Django使用haystack借助Whoosh实现全文搜索功能
参考文章01:http://python.jobbole.com/86123/ 参考文章02: https://segmentfault.com/a/1190000010866019 参考官网自定制v ...
- npm 查看全局安装过的包
查看全局安装的包 npm list -g --depth 0 非全局安装的包 npm list --depth 0 如果不加参数 --depth 0会显示安装的包以及相关的依赖包,会显示的很详细.
- 微信小程序——1、文件的认识
主体文件的构成 微信小程序的主体由三个部分组成,需放在主目录中,名称也是固定的 app.js:微信小程序的主逻辑文件,主要用来注册小程序 app.json:微信小程序的主配置文件,对微信小程序进行全局 ...
- C++ shared_ptr的用法
一. http://www.cnblogs.com/welkinwalker/archive/2011/10/20/2218804.html 二.http://www.cnblogs.com/Tian ...
- hbase读写流程分析
前言 最近被大佬问到一个问题,hbase查询数据在最坏的场景下需要进行几次rpc,当时就懵了..下面主要对client端代码进行分析.阅读文章和看源码更配~ 读数据 流程总览 1. 从zookeepe ...
- 全网最详细Apache Kylin1.5安装(单节点)和测试案例
转:http://blog.itpub.net/30089851/viewspace-2121221/ 微视频链接: Apache Kylin初识 1.版本(当前实验版本组合,版本一定要兼容 ...
- 【eclipse】阿里巴巴代码检测插件在线安装
https://p3c.alibaba.com/plugin/eclipse/update