[你必须知道的.NET]第三十回:.NET十年(下)

引言

语言是程序开发者行走江湖的手上利器,各大门派的高手在论坛、博客为了自家门派争吵不已早是技术世界中的亮丽风景,虽多少为刚刚踏入江湖的新手提供了思考的素材,但也同时迷惑了初出茅庐的前行方向。

本文不欲计较门派的高下,旨在明辨技术的真谛,这就是.NET平台下的开发利器:C#语言,并从其变迁的进程中对于.NET技术发展把玩一番。

在下篇,我们将从历史走来,对.NET的未来做个展望性的了解,具体而言就是.NET 4.0的新东西。

.NET之,未来武器

无论如何,.NET 4.0已经在叩开新年的大门之时,以高调的姿态迎来一片掌声。广大的技术爱好者不会等待太长的时间,就能感受C#发展中的又一次变革。随着.NET 4.0在2009年的发布,我们对于C# 4.0的关注也将与日俱增。总体而言,C# 4.0的重头戏主要着眼在以下几个方面:

  • 动态编程
  • 并行计算
  • 后期绑定
  • 协变与逆变

废话少说,接下来我们一一领略C# 4.0中的语言特性。

动态编程

众所周知,C#是静态强类型语言。而在很多情况下,提供“动态”行为,是常常发生的事情,例如通过反射在运行时访问.NET类型、调用动态语言对象、访问COM对象等,都无法以静态类型来获取。因此, C# 4.0引入的又一个全新的关键字dynamic,也同时引入了改善静态类型与动态对象的交互能力,这就是动态查找(Dynamic Lookup)例如:

// Release : code06, 2009/05/07
// Author  : Anytao, http://www.anytao.com
public static void Main()
{dynamic d = GetDynamicObject();               d.MyMethod(22);                  // 方法调用   d.A = d.B;                       // 属性赋值d[“one”] = d[“two”];             // 索引器赋值int i = d + 100;                 // 运算符调用string s = d(1,2);               // 委托调用
}

就像一个object可以代表任何类型,dynamic使得类型决断在运行时进行,方法调用、属性访问、委托调用都可动态分派。同时,动态特性还体现在构建一个动态对象,在C# 4.0实现IDynamicObject接口的类型,可以完全定义动态操作的意义,通过将C#编译器作为运行时组件来完成由静态编译器延迟的操作,例如:

dynamic d = new Foo();  
string s;   d.MyMethod(s, 3, null);

在具体执行过程中,C#的运行时绑定器基于运行时信息,通过反射获取d的实际类型Foo,然后在Foo类型上就MyMethod方法进行方法查找和重载解析,并执行调用,这正是动态调用的背后秘密:DLR。在.NET 4.0中将引入重要的底层组件DLR(Dynamic Language Runtime,动态语言运行时),除了实现动态查找的基础支持,DLR也同时作为基础设施为类似于IronRuby、IronPython这样的动态语言提供统一的互操作机制。总而言之,动态编程将为C#在以下领域产生巨大的变革:

  • Office编程与其他COM交互。
  • 动态语言支持,在C#中消费IronRuby动态语言类型将并非难事,体验动态语言特性指日可待。
  • 增强反射支持。

以调用IronRython为例,我们只需引入IronPython.dll, IronPython.Modules.dll, and Microsoft.Scripting.dll,即可通过创建ScriptRuntime在C#中HostingIronPython环境,进而来操作动态语言的类型信息。

ScriptRuntime py = Python.CreateRuntime();
dynamic mypy = py.UseFile("myfile.py");Console.WriteLine(mypy.MyMethod("Hello"));

虽然从微软当前提供的技术资料和CTP演示中,动态查找还存在或多或少的问题,但是在“动态”大行其道的今天,我们无法回避也必须拥抱这个未来的主角,因为我坚信明天会更好。

并行计算

并行计算的出现,是计算机科学发展的必然结果,随着计算机硬件的迅猛发展,在多核处理器上工作已经是既存事实,而传统的编程模式必须兼容新的硬件环境才能使计算机性能达到合理的应用效果。用Anders大师的话说:未来5到10年,并行计算将成为主流编程语言不可忽视的方向,而4.0为C#打响了实现并发的第一枪。

未来的.NET Framework 4.0中将集成TPL(Task Parallel Library)和PLINQ(Parallel LINQ),这也意味着未来我们可以应用C# 4.0实现并行化应用,在统一的工作调度程序下进行硬件的并行协调,这将大大提高应用程序的性能同时降低现存并发模型的复杂性。

那么,我们应该一睹为快应用C#武器来开发并发环境下的超酷感受,在System.Threading.Parallel 静态类提供了三个重要的方法For、Foreach、Invoke可以为我们小试牛刀:

//应用TPL,执行并行循环任务
Parallel.For(0, 10, i =>
{DoSomething(i);
});

在线程争用执行情况下,相同的操作在双核平台下运行,以StopWatch进行精确时间测试,并行环境下的执行时间为 2001ms,而非并行环境下的执行时间为4500ms,并行运算的魅力果然名不虚传。我们再接再厉应用PLINQ执行对于并行运算的查询、排序等,当前PLINQ支持两种方式ParallelEnumerable类和ParallelQuery类,例如:

int[] data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] selected = (from x in data.AsParallel()select x + 1).ToArray();

更详细的对比示例留待读者在实践中对此进行讨论,并行计算为托管代码在多核环境下的性能优化提供了统一的解决方案,而未来我们会做的更好。

备注:实际上,我们可以选择下载安装Microsoft Parallel Extensions to the .NET Framework 3.5June 2008 CTP包,就可以在.NET 3.5环境下体验并行计算的无穷魅力。

协变和逆变

协变和逆变,是为解决问题而生的。而要理清解决什么样的问题,需要首先从理清几个简单的概念开始。首先我们进行一点操作:

Derived d = new Derived();
Base b = d;

Derived类型继承自Based类型,由Derived引用可以安全的转换为Based引用,而这种转换能力可以无缝的实现在Derived数组和Base数组,例如:

Derived[] ds = new Derived[5];
Base[] bs = ds;

而这种原始转换(由子类转换为父类)方向相同的可变性,被称为协变(covariant);其反向操作则被称为逆变(contravariant)。当同样的情形应用于泛型时,例如:

List<Derived> ds = new List<Derived>();
List<Base> bs = ds;

类似的操作却是行不通的。所以,这就成为C# 4.0中完善的问题——泛型的协变与逆变:

// Release : code07, 2009/05/07
// Author  : Anytao, http://www.anytao.com
List<Base> bs = new List<Base>();
List<Derived> ds = new List<Derived>();bs = ds;    //List<T>支持对T协变
ds = bs;    //List<T>支持对T逆变

而在C# 4.0中,伴随着协变与逆变特性的加入,C#引入两个in和out关键字来解决问题。

// Release : code08, 2009/05/07
// Author  : Anytao, http://www.anytao.com
public interface ICovariant<out T>
{T MyAction();
}public interface IContravariant<in T>
{void MyAction(T arg);
}

其中,out表示仅能作为返回值的类型参数,而in表示仅能作为参数的类型参数,不过一个接口可以既有out又有in,因此既可以支持协变、支持逆变,也可以同时支持,例如:

public interface IBoth<out U, in V>
{
}

命名参数和可选参数

命名参数和可选参数是两个比较简单的特性,对于熟悉其他编程语言的开发者来说可选参数并不陌生,为参数提供默认值时就是可选参数:

// Release : code09, 2009/05/07
// Author  : Anytao, http://www.anytao.com
public void MyMethod(int x, int y = 10, int z = 100)
{
}

因此,我们可以通过调用MyMethod(1)、MyMethod(1, 2)方式来调用MyMethod方法。而命名参数解决的是传递实参时,避免因为省去默认参数造成的重载问题,例如省去第二个参数y调用时,即可通过声明参数名称的方式来传递:

MyMethod(20, z: 200);

相当于调用MyMethod(20, 10, 200),非常类似于Attribute的调用方式。虽然只是小技巧,但也同时改善了方法重载的灵活性和适配性,体现了C#语言日趋完美的发展轨迹。

当然,除此之外.NET 4.0还增加了很多值得期待的平台特性,也将为C#编码带来前所未有的新体验。

.NET之,趋势不可逆转

预测未来,在技术世界是常有的事儿。从高级语言的发展历史来看,编程世界从来就没有停止过脚步,变革时时发生、创新处处存在。以技术人员的角度来观摩未来,带着C# 4.0的脚步来看展望, 除了在函数式编程、并行计算和动态特性上大展拳脚,Meta Programming的概念已然浮出水面,将编译器变成一个Service,你可以自由控制在编译器和运行期的逻辑,那是多么美好而向往的未来呀,所以,我们坚信 4.0之后还有广阔的天地随着语言的变迁变得更加开阔。

概括Anders大师在C#设计过程中的思想,C#是语言美学的集大成者。例如,当使用foreach进行循环遍历之后,当应用using语句代替try/finally实现强制资源管理,当应该attribute进行运行时反射,当以LINQ进行语言级别的信息查询,这些语言级别的支持为C#实现面向对象编程带来强大的功能动力和美学感受。

 

注:本文代码在VS2010 CTP基础上开发,未检测任何版本更新所带来的不同,望明察。

参考文献

(Web)http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

(Web)http://weblogs.asp.net/podwysocki/archive/2008/05/24/what-is-the-future-of-c-anyways.aspx

(Web)New features in C# 4.0

(Web)http://msdn.microsoft.com/en-us/magazine/cc163340.aspx

作者简介:

王涛,网名Anytao,微软C# MVP,高级软件工程师,机械工程硕士,《你必须知道的.NET》一书作者,主要研究方向为.NET底层架构和企业级系统应用。现就职于某软件公司负责架构设计、软件开发和项目管理方面的工作。作者对.NET基础架构和CLR底层运行机制有浓厚的研究兴趣和造诣,熟悉ASP.NET、XML、WCF、SQL Server相关技术,对面向对象、设计模式和软件架构有一定的研究与实践经验。他的联系方式如下:http://www.cnblogs.com/Anytao

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

navcat定时备份mysql_Linux实现MYSQl数据库的定时备份

今天给大家分享一下如何在Linux下实现MYSQl数据库的定时备份。前提需要保证你的Linux服务器已经安装了MYSQl数据库服务。1、创建shell脚本vim backupdb.sh创建脚本内容如下&#xff1a;#!/bin/shdb_user"root"db_passwd"123456"db_name"userdb"n…

[你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望

总体来说&#xff0c;这是一篇介绍性的文章&#xff0c;不会涉及过多技术细节和研究过程。但是&#xff0c;作为拉开序幕的第一页&#xff0c;本文以提纲挈领的方式展开对.NET 4.0的初次体验。从What’s new的角度&#xff0c;开始我对.NET 4.0新特性的探索之旅。既然是介绍&am…

iphone电压测试软件,‎App Store 上的“ECG Test Pro”

超过1000份真实患者的异常静态心电图案例&#xff0c;供医学院学生或老师作为心电学习的辅助数据。> 医学生或实习生&#xff0c;可通过这个应用学习各种各样的心电病例> 医学院老师&#xff0c;可把这个应用作为教学素材&#xff0c;进行案例教学APP STORE 上最具有影响…

idea远程调试修改代码_IDEA远程调试(Remote Debug)Java代码指南

前言当我们的代码在线上/测试环境运行出现异常需要进行问题定位时,之前的传统做法是:查看异常日志,根据日志定位到出错代码,然后再根据相关参数及异常信息进行推断。但是很多异常问题需要更细致的进行debug才能够更精准的去定位和解决&#xff0c;这种情况下&#xff0c;我们希…

苹果计算机磁盘格式,Mac怎么将ntfs格式的磁盘格式化

1. 首先下载NTFS For Mac。下载之后就可以读取NTFS磁盘。2. 插入要格式化的NTFS磁盘。您可以在Mac OS X下通过命令行格式化NTFS磁盘。按照以下步骤进行操作&#xff1a;启动命令行&#xff1a;应用程序 》 工具 》 终端; 输入diskutil获取帮助。格式化命令图&#xff1a;使用di…

[你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二

Tuple&#xff0c;是函数式编程的概念之一&#xff0c;早见于Elang、F#等动态语言。不过&#xff0c;我第一次听说Tuple还早在2005年园子的Ninputer大牛提出在.NET 2.0实现Tuple的基本想法&#xff0c;我们可以通过以下地址仰慕当时的历史片段&#xff1a; 探讨.NET 2.0中Tuple…

支持商用吗_可商用的插画素材 | 美翻了

好素材在手&#xff0c;天下我有啊...哈哈哈喽大家周末好&#xff0c;那上周公子做的那份工作型插画模板呢&#xff0c;很多小伙伴都来问我素材是哪里找的&#xff0c;自己画的吗当然不是了&#xff01;其实我在文章中已经提到了&#xff0c;那有的人可能之前用过或可以自己找到…

永恒边境白羊座服务器维护,永恒边境升级攻略 速升50级技巧

永恒边境怎么升级快&#xff1f;分享永恒边境升级攻略&#xff0c;下面我们就一起来看看永恒边境速刷主线支线任务技巧&#xff0c;希望对大家有所帮助。20-30级篇在这个阶段&#xff0c;我们就主线任务和支线任务大家都不要错过了&#xff0c;都要好好抓住&#xff0c;我还可以…

[你必须知道的.NET]第三十三回,深入.NET 4.0之,LazyT点滴

对象的创建方式&#xff0c;始终代表了软件工业的生产力方向&#xff0c;代表了先进软件技术发展的方向&#xff0c;也代表了广大程序开发者的集体智慧。以new的方式创建&#xff0c;通过工厂方法&#xff0c;利用IoC容器&#xff0c;都以不同的方式实现了活生生实例成员的创生…

频数直方图的步骤_绘制频数直方图步骤

怎样用excel制作频率分布直方图给出简单的步骤~有截图的话更好。我不知道按哪个东西~而且还要弄什么频(转载于word帮助文件&#xff0c;建议大家使用word时遇到问题按F1搜索帮助)使用直方图显示数据全部显示利用分析工具库的直方图工具&#xff0c;您可以分析数据并将其显示在直…

格式化css文件,css文件格式化脚本的方法

这次给大家带来css文件格式化脚本的方法&#xff0c;css文件格式化脚本的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。#!/usr/bin/python# -*- coding: UTF-8 -*-import sys,osdef format(ddt):ddt ddt.replace(\n,)#去除换行ddtddt.replace(;},}).…

[你必须知道的.NET]第三十四回,object成员,不见了!

在.NET世界了&#xff0c;object是公认的造物主&#xff0c;其麾下的7大成员&#xff0c;个顶个的横行在任何系统的任何代码角落。 public class Object {public Object();public virtual bool Equals(object obj);public static bool Equals(object objA, object objB);publi…

直接请求接口_http类型的post和get接口测试

我们做接口测试时候&#xff0c;会发现通常需要测试的接口类型有好几种&#xff0c;比较多的是http类型的接口&#xff0c;其他还有webservice接口&#xff0c;rpc接口等等&#xff0c;本次主要说下http类型的接口我们该怎么测试&#xff0c;还有该测试哪些东西。HTTP接口概念:…

css3加载中动画效果,CSS3实现加载中的动画效果

Loading 的菊花图形组合的不太好&#xff0c;基本上实现这个功能了动画解析这个动画用到的 CSS3 特性:transform 主要使用 transform 属性的 rotate&#xff0c;将线条组合成 Loading 图形 (也就是常见的菊花图形)animation 实现将线条颜色由浅到深&#xff0c;再由深到浅来回变…

[你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题

问题的提出 晚上翻着群里的聊天&#xff0c;发现一个有趣的问题&#xff1a;如何通过编码方式来判断一个dll或者exe为debug build还是release build&#xff1f;由于没有太多的讨论&#xff0c;所以我只好自己找点儿办法&#xff0c;试图解决这个问题&#xff0c;为夜生活带点…

执行本地sql_实用!5个在线 SQL 数据库环境

文章目录SQL FiddleDB Fiddledb<>fiddleSQL OnlineOracle Live SQL总结大今天给大家分享几个在线的免费 SQL 运行环境&#xff0c;也就是在线数据库。这些网站可以帮助我们快速运行一些 SQL 语句的测试或者验证&#xff0c;同时还可以在网络上进行分享&#xff0c;关键不…

网页传世服务器端,传世服务端文件分析

DB (数据库)baobao.db 宝宝(佩带套装引发&#xff0c;需设置套装属性)EvilMon.db 心魔Magic.db 技能Monster 怪物StdItems 装备&#xff0c;道具&#xff0c;物品说明&#xff1a;装备攻击、魔法、道术、等等Dbserver (数据服务器)Backup空ClearLog空Connection空FDBBackup数据…

ocp证书怎么考_没有基础怎么考初级会计证书?

初级会计证书这些年来越发火热&#xff0c;报考门槛也较低。多数报考初级会计证的考生都是没有基础的&#xff0c;那么怎么复习呢?今天会计网将给大家带来没有基础怎么考初级会计证书?1、制定一份适合自己的学习计划&#xff0c;分阶段学习对于没有基础的考生而言&#xff0c…

oracle sparc 服务器系统,OracleSPARC服务器基础.PDF

OracleSPARC服务器基础Oracle SPARC服务器基础及管理Agenda1. 服务器运行环境标准2. Oracle Sparc T5140维护与ILOM管理3. Oracle Solaris 基础4. 收集日志、故障分析、解决和案例分享2SPARC T5140环境输入电压 100 - 240 VAC, 50-60Hz8.3 - 7.2 A 100-120 VAC (max)输入电流4…

C#设计模式(23种设计模式)

创建型&#xff1a; 1. 单件模式(Singleton Pattern) 2. 抽象工厂&#xff08;Abstract Factory&#xff09; 3. 建造者模式(Builder) 4. 工厂方法模式&#xff08;Factory Method) 5. 原型模式(Prototype) 结构型&#xff1a; …