您的位置:首页 > 编程语言 > C#

[.net]C#4.0新特性COM开发的福音

2010-02-22 21:58 288 查看
简介

这是一篇关于介绍C#4.0高级特性的译文,原文地址是:http://www.codeproject.com/KB/cs/CSharp4_Features.aspx

自从C#诞生开始,每个版本都有高级的变革和修正,比如:C#1.0的主题是管理代码,C#2.0带来了泛型数据,一直到C#3.0LINQ被引入,C#4.0中将有全新的概念:动态编程(Dynamic Programming),总体来说,在C#4.0中将有4个主要的特性:

Dynamic Typed Objects (动态类型对象)

Optional and Named Parameters (可选和指定参数)

Improved COM Interoperability (改善了COM的交互能力)

Co- and Contra-Variance (共同而且可逆的变量)

让我们先来看这两个特性:动态类型对象和可选、指定参数(Dynamic Typed Object,Optional Parameter and Named Argument)。在MSDN变量的资料中的C#新特性的文档中只解释道了一点点,如果对Visual Studio 2010 CTP版本感兴趣,可以参考下我在Visual Studio 2010 CTP中的帖子,请注意,本篇文章是根据CTP版本写的,具体正式版本可以有所不同。

动态编程

C#4.0通过引入动态类型对象来支持动态编程,这种类型的对象在运行时确定,而不是在编译时确定。新关键字dynamic用来声明动态类型对系那个,关键字告诉编译器来处理这个对象,被声明为动态类型后,可以在动态语言运行环境(Dynamic Language Runtime DLR)中进行动态的处理,dynamic关键字和变量的关键字是有区别的,当声明一个变量时,它在编译时就起作用了,而不是在运行环境中,动态类型对象是在运行环境中处理的,下面看例子来更好的理解:(下面是使用映射的方式设置属性)


Assembly asmLib= Assembly.LoadFile(@"C:/temp/DemoClass/bin/Debug/DemoClass.dll");
Type demoClassType = asmLib.GetType("DemoClass.DemoClassLib");
object demoClassobj= Activator.CreateInstance(demoClassType);
PropertyInfo pInfo= demoClassType.GetProperty("Name");
pInfo.SetValue(demoClassobj, "Adil", null);
[/code]
注意3-5行中的代码,在C#4.0中可以代替写为以下的方式:


dynamic dynamicDemoClassObj = Activator.CreateInstance(demoClassType);
dynamicDemoClassObj.Name = "Adil";
[/code]
很简单吧?

可选参数

第二个新特性是可选参数,比如说我们有个类Employee,为了方便给可选的参数赋值,我们提供了一些重载的构造函数:

public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Qualification { get; set; }
public string MiddleName { get; set; }

public Employee(string firstName, string lastName)
{
FirstName= firstName;
LastName= lastName;
Qualification= "N/A";
MiddleName= string.Empty;
}
public Employee(string firstName, string lastName, string qualification)
{
FirstName= firstName;
LastName= lastName;
Qualification= qualification;
MiddleName= string.Empty;

}
public Employee(string firstName, string lastName, string qualification,
string middleName)
{
FirstName= firstName;
LastName= lastName;
Qualification= qualification;
MiddleName= middleName
}
}
[/code]
在C#4.0中,只需要简单的对构造函数修改下就可以了:

public Employee(string firstName, string lastName,
string qualification = "N/A", string middleName = "")
{
FirstName= firstName;
LastName= lastName;
Qualification= qualification;
MiddleName = middleName;
}
[/code]
很简单吧,只要向这样声明就可以了:(这个我觉得是C#3.5版本前很郁闷的东西,在C++中都有参数默认值的,C#中就必须赋值,很不方便)

Employee(“Adil”,”Mughal”);
[/code]
这个特性在其他语言中早已存在,由于种种原因在C#中一直没有,但是现在有了(微软的策略失误找借口),这个特性对COM开发人员很有帮助,也是他们最盼望在C#后期版本中出现的一个新特性,如果没有显示的给对象的参数赋值,编译器将填充可选参数为默认值:

Employee emp= new Employee("Adil", "Mughal");
[/code]
简单而且实用!

命名参数

例如,在Employee类中,我们需要传递一些可选参数到构造函数中:


public Employee(string firstName, string lastName,
string qualification = "N/A", string middleName = "")
[/code]
我们可以简单的写为:

Employee emp= new Employee("Adil", "Mughal");
[/code]
问题出现了:如果想略过第三个参数,直接给第四个参数赋值要怎么办?

答案是:肯定有办法!通过C#4.0中的新特性命名参数(Named Argument)来解决:(我觉得应该叫做指定参数,有些专业词汇真是难翻译)

Employee emp = new Employee("Adil", "Mughal", middleName: "Ahmed");
[/code]
这个方法真是太好了,我们再把Employee的构造函数改改,让lastName也变成可选:(这里我就要“泪牛满面”了,想当初传递存储过程中的参数的时候重写构造函数也不行,传递泛型也不好,遇到存储过程时,硬是写死了,终于有解决方案了。)


public Employee(string firstName, string lastName = "",
string qualification = "N/A", string middleName = "")
[/code]
然后写法就简单了:

Employee("Adil", qualification:"BS");
Employee("ABC", lastName: "EFG", qualification: "BS");
Employee("XYZ", middleName: "MNO");

小结

这些即将到来的特性真的是太酷了,它会大大提高开发者的效率,尽管某些特性在编程语言界已经不是什么新面孔了。

译者小结:我个人觉得,新特性主要围绕参数可选则赋值,这个原来在其他语言中已经有的功能,在C#4.0中竟然编程了新特性,害得无数程序员编写了许多类来弥补这个不足,比如使用两个参数来传递要赋值的参数位置(有个缺陷不能跳过中间的参数),传递泛型列表,这个方法判断得要死,最傻也是最有效的方式就是一一重写。如果有N个参数就吐血了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: