《Pro ASP.NET MVC 3 Framework》学习笔记之六【C#部分特性】

简介:

本次笔记分为两个部分:C#语言的部分特性和MVC3里面提供的新视图引擎Razor的@句法。今天晚上的笔记是第一部分:C#的部分特性(我主要选择扩展方法,泛型委托,Lambda表达式等内容,选择这些是因为我对这几个部分不是很熟悉)。如果你已经对C#2.0及3.0里面出现的几个特性比较了解,那你完全可以忽略这部分直接去看下次的关于Razor的笔记。

一,扩展方法(Extension Methods)

1.扩展方法给我们提供了一种很便捷的方式,通过这种方式我可以给那些不是我们自己创建的类(如第三方组件里面的)或是我们不能直接修改的类添加方法。下面是一个关于购物车的例子,我们定义一个ShoppingCart类,如下所示:

复制代码
public class ShoppingCart 
{
public List<Product> Products { get; set; }
}

public class Product
{
public int ProductID { get; set; }
public string Name { get; set;}
public string Description { get; set;}
public decimal Price { get; set; }
public string Category { set; get;}
}
复制代码

这个类简单吧,呵呵。现在我们需要知道购物车里面Products的总价,但是我们不能去直接更改ShoppingCart类,这种情况的确是存在的,比如这是第三方的组件,我们没有源码。这个问题显然符合定义扩展方法的条件,所以我们可以这样做:

复制代码
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关键字是必须的,用this指示我们要对哪个类添加方法(称为这个类的扩展方法),后面也可以跟其他类型的参数。这里的参数就是ShoppingCart类型。因为我们计算就是购物车的总价。实现的方法也很简单,遍历购物车里面的商品,把价格累加。

注意:扩展方法并不是让我们通过这样一种规则来打破给类定义方法,属性,字段等,所以我们定义类的成员的时候一般都是在类里面定义。

扩展方法只不过让我们可以在必要的时候扩展类的功能,而且仅仅使用的是你能访问的成员来对其进行扩展。下面看看如何使用上面的定义的扩展方法,如下所示:

复制代码
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
ShoppingCart cart = new ShoppingCart
{
Products = new List<Product>
{
new Product {Name = "Kayak", Price = 275M},
new Product {Name = "Lifejacket", Price = 48.95M},
new Product {Name = "Soccer ball", Price = 19.50M},
new Product {Name = "Corner flag", Price = 34.95M}
}
};
decimal cartTotal = cart.TotalPrices();
Console.WriteLine("Total: {0:c}", cartTotal);
}
}
复制代码

2.现在我们对ShoppingCart类进行扩展

复制代码
using System.Collections;
using System.Collections.Generic;
public class ShoppingCart : IEnumerable<Product>
{
public List<Product> Products { get; set; }
public IEnumerator<Product> GetEnumerator()
 {
return Products.GetEnumerator();//对Products进行迭代获取Product列表
}
IEnumerator IEnumerable.GetEnumerator()
 {
return GetEnumerator();
}
}
复制代码

上面我们让ShoppingCart继承了一个支持迭代的泛型接口,获取了所有的Products。

下面我们修改扩展方法,对IEnumerable<Product>进行扩展,如下所示:

复制代码
using System.Collections.Generic;
public static class MyExtensionMethods
{
public static decimal TotalPrices(this IEnumerable<Product> productEnum)
{
decimal total = 0;
foreach (Product prod in productEnum)
 {
total += prod.Price;
}
return total;
}
}
复制代码

接着对修改过的扩展方法应用,如下所示:

复制代码
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
IEnumerable<Product> products = new ShoppingCart
{
Products = new List<Product>
{
new Product {Name = "Kayak", Price = 275M},
new Product {Name = "Lifejacket", Price = 48.95M},
new Product {Name = "Soccer ball", Price = 19.50M},
new Product {Name = "Corner flag", Price = 34.95M}
}
};
Product[] productArray =
{
new Product {Name = "Kayak", Price = 275M},
new Product {Name = "Lifejacket", Price = 48.95M},
new Product {Name = "Soccer ball", Price = 19.50M},
new Product {Name = "Corner flag", Price = 34.95M}
};
decimal cartTotal = products.TotalPrices();
decimal arrayTotal = productArray.TotalPrices();
Console.WriteLine("Cart Total: {0:c}", cartTotal);
Console.WriteLine("Array Total: {0:c}", arrayTotal);
}
}
复制代码

到这里我们会发现一个很有意思的地方,我们定义的IEnumerable<Product>类型的products调用TotalPrices()扩展方法,这个毫无疑问。但是我们这里productArray是一个C#数组,这里竟然也能调用TotalPrices扩展方法。嘿嘿,有点奇怪哈,而且关于C#数组实现IEnumerable<T>的方式有点奇怪这点,我们在MSDN上面也查不到相关的文档。有点奇怪但的确可以这样用的,因为这是编译器支持的,为的是能够兼容早期的C#代码编译。

好了,本次的笔记记到这里。我刚学习,笔记里面肯定理解不到位的地方,请路过的朋友多多指导,谢谢!

祝路过的朋友工作顺利!

晚安!

本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/archive/2011/12/06/mvcnotes_6.html如需转载请自行联系原作者


张雪飞

相关文章
|
27天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
7天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
48 13
|
1月前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
41 7
C# 9.0 新特性解析
|
1月前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
45 7
|
26天前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
26天前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
1月前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
34 2
|
16天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
16天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
26天前
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)

相关实验场景

更多