理解C# 3.0的五项主要改进
1. 隐型局部变量
C# 3.0引入了一个叫做“var”的新关键字。这个关键字允许开发者建立一个变量,但不必明确它的类型。例如,用var说明一个字符串,就像这样:
varmyData = "This is my data";
注意,这里并没有提到myData变量是一个字符串,而C# 2.0却要求这一点。
虽然var允许您建立隐含的类型,它并没有降低C#浓厚的类型特征。var关键字只有在建立变量时有用,一旦您建立变量并且确定它的类型以后,就不能再用var来改变一个变量的类型。
例如,这段代码没有作用:
varmyDate = DateTime.Now;
myDate = "Hello.";
使用var关键字还会产生一个有趣的结果,它可以帮助开发者减少建立变量时的代码输入。例如,在C# 2.0中建立一个Customer对象,需要输入以下代码:
Customer myCustomer = new Customer();
使用新的var关键字,则只要输入:
varmyCustomer = new Customer();
var关键字的另一个特点在于,使用它可以避免改变一个返回某个类型对象的方法调用。例如,在C# 2.0中,如果您需要调用一个返回Customer对象的方法,您应该编写以下代码:
Customer myCustomer = GetByName("Zach");
如果某个时候GetByName方法返回一个不是Customer的对象,这段代码就无法编译。但是,如果应用var关键字,您就不用担心GetByName返回的对象类型。
varmyData = GetByName("Zach");
现在,因为应用了var关键字,GetByName方法能够进行改变,返回一个Person对象,这个方法调用也依然有效。
2.extension方法
在C#中,您不能继承和扩充用访问标识符标记为“封装”的类型。但在C# 3.0中,extension方法允许您扩充任何类,甚至是标记为封装的类。例如,如果希望添加一个NoSpaces()方法到字符串类中,我们要定义一个类似列表A中的extension方法。
列表A
namespaceMyExtensionMethods
{
public static class Extension
{
public static void NoSpaces(this string data)
{
return data.Replace(" ", "");
}
}
}
在一个类中导入这个extension方法时,开发者就能够对这个类包含的任何字符串调用NoSapces()方法。
extension方法的第一个参数决定extension方法的有效类型。在这种情况下,“这个字符串数据”(this string data)表明extension方法适用于字符串类;如果extension方法以“这个对象数据”(this object data)为第一个参数,则说明这个方法对每个对象有效。
要表明您希望导入extension方法,只需在它们的命名空间中包括一个using指令。例如,要应用上面说明的方法,需要在类文件中包括一个using MyExtensionMethods指令:(列表B)
列表B
usingMyExtensionMethods;
namespace MyNamespace
{
public class MyClass
{
public MyClass()
{
string data = "this is my data";
//nospaces will contain "thisismydata".
string nospaces = data.NoSpaces();
}
}
}
注意extension方法的优先度比instance方法低。因此如果instance方法和extension方法有同样的签名,则应执行instance方法。
3.对象初始化器
在C# 2.0中,开发者认为建立许多构造器来设定某个属性值为对象初始化过程。下面是一个例子:
- 类访问Customer方法:
Customer myCustomer = new Customer("Zach", "Smith");
- Customer类构造器:
public Customer(string firstName, string lastName) : this()
{
this.FirstName = firstName;
this.LastName = lastName;
}
public Customer()
{
}
C# 3.0介绍了一个初始化对象的新方法,它允许您在初始化对象时设定任何属性值。例如,在C# 3.0中,上面的代码块可以写成:
- 类访问Customer方法:
Customer myCustomer = new Customer{FirstName = "Zach", LastName = "Smith" };
- Customer类构造器:
public Customer()
{
}
在C# 3.0代码中,没有与初始化对象对应的构造器。这样,开发者就不用为每组需要设定的属性建立不同的构造器。
这样产生的另外一个效果是:代码变得更容易阅读了。例如,虽然我们清楚知道下面的代码对一个Car对象进行了初始化,但我们并不清楚其中变量的作用:
Car car = new Car(18, 10, 550);
一眼看来,下面这行代码更易阅读,尽管我们必须输入更多代码:
Car car = new Car { WheelDiameter = 18, WheelWidth = 10, Horsepower = 550 };
4.匿名类型
C# 2.0引入了匿名方法,C# 3.0推出匿名类型。匿名类型与匿名方法类似,它们都是以嵌入方式建立,并没有正式的名称。在建立一个匿名类型,您必须组合上述对象初始化器和隐型局部变量两个概念。下面是一个匿名类型的例子:
varmyType = new { Length = 79, Width = 30 };
匿名类型的范围与任何其它变量的范围相同。例如,下面代码块中的cobra实例仅仅在Speed函数块中有效:
private void Speed()
{
var cobra = new { Horsepower = 550, Torque = 570 };
}
如果一个匿名类型被初始化而另一个匿名类型位于范围域中,并且它们的签名相同,第二个类型将自己占用第一个类型的类型。例如,在下面这段代码中,cobra和mustang都是匿名类型,并且可以彼此设定。
private void Speed()
{
var cobra = new { Horsepower = 550, Torque = 570 };
var mustang = new { Horsepower = 300, Torque = 300 };
mustang = cobra; //or you could say cobra = mustang
}
5 .LINQ
在之前的C#版中,开发者应用许多不同的查询语言来访问不同的数据源。例如,要查询一个XML文件,开发者会使用XPath,要查询一个SQL数据库,开发者将使用SQL。在过去这种方法十分有效,并且现在仍然是访问各种数据的主要方法。但是,这种方法具有一些缺点。
一个显著的缺点在于:开发者必须以一种不同的语言,而非他们当前使用的语言(如SQL或XPath)来编写查询代码。另一个缺点是,在执行某些查询语言,如SQL时,开发者必须编写映射代码将查询结果转化为可用的C#业务对象。
C#3.0推出一种称之为语言集成查询(LINQ)的新方法。应用LINQ,开发者可以编写出能够搜索任何IEnumerable<T>数据源的代码。所以除了应用TSQL访问MS SQL数据库,应用XPath访问XML文件外,他们还可以应用LINQ。
下面的代码(列表C)是一个LINQ查询的例子,它返回所有OrderCount大于10的顾客:
列表C
using System;
using System.Query;
using System.Collections.Generic;
public class SampleClass
{
static void Main()
{
List<Customer> customers = GetCustomers();
//Write our query to retrieve customers who have more than
// 10 orders.
IEnumerable<Customer> queryResult = from customer in customers
where customer.OrderCount > 10
orderbycustomer.ID
select customer;
}
}
与SQL或XPath不同,LINQ查询用C#,而非第三方语言编写。这样,查询就不会出现类型问题,开发者也就没有必要编写映射代码把查询返回的数据转化成C#对象,而由LINQ API自动处理映射。
基本上,在ORM解决方案中,LINQ对象用途很大。同样,它的范围也非常广泛,有大量MSDM信息描述了它的功能。欲了解更多信息,请访问LINQ主页。
转载于:https://www.cnblogs.com/wangzhanjianshe/archive/2007/12/19/2326487.html
理解C# 3.0的五项主要改进相关推荐
- 世界级版本控制工具Vault v10.0发布,多项功能改进|附下载
2019独角兽企业重金招聘Python工程师标准>>> 版本控制工具Vault 版本更新至v10.0,增加了对SQL Server 2016,Visual Studio 2017等的 ...
- Debug神经网络的五项基本原则
整理 | 琥珀 出品 | AI科技大本营(公众号id:rgznai100) 很多情况下,研究人员会遇到一个问题:使用机器学习框架实现的神经网络可能与理论模型相去甚远.验证这款模型是否可靠,直接方式就是 ...
- 吴恩达deeplearning.ai五项课程完整笔记了解一下?
来源:机器之心 本文共3744字,建议阅读8分钟. 通过本文为大家解读如何构建自然语言.音频和其他序列数据的模型. 自吴恩达发布 deeplearning.ai 课程以来,很多学习者陆续完成了所有专项 ...
- 系统思考与《第五项修炼》
系统思考与<第五项修炼>--<可以量化的管理学> 内容提要:彼得•圣吉通过<第五项修炼>将控制理论的正反馈和负反馈引入管理学,对管理学理论产生了巨大的影响.系统思考 ...
- 开发者应该关注的五项Web新兴技术:WebGL和SVG名列其中
最近一位HTML5专家Rich Clark(作者的好朋友)为大家做了一个HTML5 APIs的简介,在文章中为大家指向了一个令人迷惑的网页(web平台:浏览器技术http://platform.htm ...
- 五项挑战获四项第一,地平线霸榜Waymo自动驾驶算法挑战赛
美国当地时间6月15日,Alphabet(Google母公司)旗下的自动驾驶公司Waymo在CVPR 2020自动驾驶Workshop上揭晓Waymo开放数据集挑战赛的结果,边缘AI芯片企业地平线斩获 ...
- ECCV 2020 五项大奖出炉!李飞飞高徒、徒孙共摘最佳论文奖
作者 | 陈大鑫 今日,ECCV 2020五项大奖出炉,分别是最佳论文奖.最佳论文提名奖.Koenderink奖.Mark Everingham奖.Demo奖. 在每年大奖中都最受期待的最佳论文奖这一 ...
- Gartner 2022年新兴技术和趋势影响力雷达图中五项具有影响力的技术
来源:Gartner公司 编辑:蒲蒲 如果一幢建筑能够告诉您暖通空调系统中的过滤器导致系统运行效率低下并需要更换,是不是会对您很有帮助?如果该系统还可以根据使用情况来调整暖风或通风呢?您目前的系统是否 ...
- 五项管理行动日志_迈向学习型组织,企业必须具备五项修炼
未来真正出色的企业,将是能够设法使各阶层人员全心投入,并有能力不断学习的组织. --彼得·圣吉 陈春花老师曾说,一个企业组织在平稳发展之时,最可怕的是怠情,是组织疲劳,就像人们说的"温水煮青 ...
最新文章
- SpringCloud配置文件 application.yml和 bootstrap.yml区别,执行顺序
- python学会了可以做什么菜_python学习之路(24)
- 【MVVM Light】新手初识MVVM,你一看就会
- 基于re模块的计算器
- Android编译系统分析三:make完整编译android系统
- 阿里云全球发布5大举措!
- [转载] Java线程池框架源码分析
- 【SpringBoot零基础案例02】【IEDA 2021.1】SpringBoot框架集成SpringMVC
- [vue] 你了解vue的diff算法吗?
- R7-1 正整数A+B (15 分)
- Python的Boolean操作
- 常用H桥电机驱动模块L298N原理及应用
- 谁在制造房价泡沫:土地供应下滑 居民杠杆上升
- css改变权重,1. CSS 权重
- 2008年国际十大财经新闻
- 【Windows7】win7启动 报错 AutoIt错误,不能打开脚本文件
- mysql utc_MySQL的时区是否应该设置为UTC?
- 人脸识别之insightface开源代码使用——自定义数据集制作
- 弘辽科技:拼多多懵懂商家不知道的直通车操作
- 【情人节表白神器:送她一个HTML动态表白网站 带源码】