为了逼迫自己学习C#,硬着头皮查阅了New features in CSharp 4.0.docx,在朦朦胧胧中认知着C#4.0
花了两个晚上,终于看完了New features in CSharp 4.0.docx。最大的感触是动态语言编程和COM的互操作性上游很大的变化。前者将是C#具备python和ruby的语言特性,后者将更好支持office编程。
很多地方都没有看的很明白,需要进一步深入的学习。我会不定期更新此文章。
第一个主题:最大的变化是具备了动态语言的特征。
重点有以下几个方面:
Ø 动态编程语言对象
Ø 通过IDispatch来获取COM对象
Ø 通过反射获取.Net类型
Ø 对象结构的变化,类似于HTML DOM对象
C#在保留静态语言的同时,更好的实现对象的交互。
第二个主题:与VB保持共同进化。
C#4.0新特性
动态查询
被命名的和可选参数
COM特定的互操作特性
灵活性
动态查询
动态类型
动态操作符
运行时查询
COM对象
动态对象
普通对象
过度的解析动态参数
动态语言运行时
当前进度6页
现存问题
不能使用LINQ来查询动态对象。由于lambda不能作为参数传递给动态操作。
指定参数和任意参数
COM互操作特性
动态引用
NO PIAS 编译
这个功能将提高代码的编译效率,减少程序集加载做占用的内存。可参考张羿的webcast<<.NET 4.0中的新特性系列课程(1):等价类型(Type Equivalency)(>>
略去ref
逆变
Func<object,string> 可以这样用: Func<string,object>.
局限
IEnumerable<int>不等同于 IEnumerable<object>。因为从整型转换为对象是装箱操作,而不是引用变换。
三 文档最后的实例
我从word档拷贝到VS2010 BETA2上代码出现的问题:
var processes = Process.GetProcesses()
.OrderByDescending(p > p.WorkingSet)
.Take(10);
解决办法:小于号"<"替换成"<",大于号">"替换成">"。即.OrderByDescending(p => p.WorkingSet)
3.1 新建console类型的项目
完整的代码:
1
using System;
2
using System.Diagnostics;
3
using System.Linq;
4
using Excel = Microsoft.Office.Interop.Excel;
5
using Word = Microsoft.Office.Interop.Word;
6
namespace ConsoleApplication1
7

{
8
class Program
9
{
10
static void Main(string[] args)
{
11
var excel = new Excel.Application();
12
excel.Visible = true;
13
excel.Workbooks.Add(); // optional arguments omitted
14
excel.Cells[1, 1].Value = "Process Name"; // no casts; Value dynamically
15
excel.Cells[1, 2].Value = "Memory Usage"; // accessed
16
var processes = Process.GetProcesses()
17
.OrderByDescending(p => p.WorkingSet)
18
.Take(10);
19
int i = 2;
20
foreach (var p in processes)
{
21
excel.Cells[i, 1].Value = p.ProcessName; // no casts
22
excel.Cells[i, 2].Value = p.WorkingSet; // no casts
23
i++;
24
}
25
Excel.Range range = excel.Cells[1, 1]; // no casts
26
Excel.Chart chart = excel.ActiveWorkbook.Charts.
27
Add(After: excel.ActiveSheet); // named and optional arguments
28
chart.ChartWizard(
29
Source: range.CurrentRegion,
30
Title: "Memory Usage in " + Environment.MachineName); //named+optional
31
chart.ChartStyle = 45;
32
chart.CopyPicture(Excel.XlPictureAppearance.xlScreen,
33
Excel.XlCopyPictureFormat.xlBitmap,
34
Excel.XlPictureAppearance.xlScreen);
35
var word = new Word.Application();
36
word.Visible = true;
37
word.Documents.Add(); // optional arguments
38
word.Selection.Paste();
39
}
40
}
41
}
3.2 添加引用
在COM标签中添加“Microsoft Excel 11.0 Object Library”的引用。