第 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
创建内联的辅助器方法 和 拓展方法 好像类似的功能. 不过写在前台更直观
随机推荐
- python之路----进程三
IPC--PIPE管道 #创建管道的类: Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在 ...
- Django框架介绍之cookie与session
cookie http请求时无状态的,一个客户端第一次,第二次,第n次访问同一个服务器都是一样的,服务器都会按照一个新的连接处理.但是,有时候客户端需要服务器记住客户端的登录状态,譬如离开一会,回来之 ...
- Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作
Python3 Selenium WebDriver网页的前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 通过selenium webdr ...
- 根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码
根据wsdl,apache cxf的wsdl2java工具生成客户端.服务端代码 apache cxf的wsdl2java工具的简单使用: 使用步骤如下: 一.下载apache cxf的包,如apac ...
- ubuntu16.04下内核模块解析
一.环境如下: 1.1内核版本: jello@jello:~$ uname -a Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19: ...
- 【附9】elasticsearch-curator + Linux定时任务
官网教程入口:https://www.elastic.co/guide/en/elasticsearch/client/curator/current/index.html 一.下载安装 下载:sud ...
- 51nod 1413 权势二进制
本来刚开始还是想用每一位 -1的个数 然后再乘以10 不断累加 后来发现 完全不是这回事啊 因为本身就是0 和 1 所以只要记录出现的最大的数字 就是答案 因为 n >= 1 // 所以不 ...
- Educational Codeforces Round 1 E. Chocolate Bar dp
题目链接:http://codeforces.com/contest/598/problem/E E. Chocolate Bar time limit per test 2 seconds memo ...
- django用包来组织模型
在我们使用python manage.py startapp xxx命令创建新的应用时,Django会自动帮我们建立一个应用的基本文件组织结构,其中就包括一个models.py文件.通常,我们把当前应 ...
- Java8 新特性之默认接口方法
摘要: 从java8开始,接口不只是一个只能声明方法的地方,我们还可以在声明方法时,给方法一个默认的实现,我们称之为默认接口方法,这样所有实现该接口的子类都可以持有该方法的默认实现. · 待定 一. ...