(转)《C#3.0 in a Nutshell,3rd Edition》之C#3.0和.net3.5基本介绍篇
前言
借着看这本书的机会,好好系统学习一下C#3.0和.net3.5。
C#3.0是一门面向对象的编程语言,具有多用途和类型安全等特征。为实现开发和学习的高效性,她在语言的简单,易表达,以及可编程性上做了很大努力。使得新人能够很快入门,开发者能够快速开发出程序。但这些并不是损害语言的功能为前提的。
正文
1.C#的面向对象性(Object Orientation)
C#同JAVA一样是面向对象的语言,具有封装(encapsulation),多态(polymorphism),继承(polymorphism)的特性。但是她也有着区别其它面向对象语言的特点。
a.统一的类型系统(Unified type system)
就是说所有的类型(Type)都是共享一个通用基础类型(Common base Type). 无论值类型或引用类型就是继承自System.object. 而object所拥有的方法所有类型都可以使用,如:ToString(),Equals()等。
b.类(Class)和接口(Interface)
在传统的面向对象语言中只有类这一种表现形式,而在C#(Java)中却有了接口(Interface),接口是一种只有定义没有实现的类,由于C#是一种单类继承语言,所以接口就显得格外有用,一个类可以继承多个接口,
弥补了单类继承带来的不足。(单类继承应该是语言设计者有意这么做的,大概是为了保证类的纯净)。
c.属性(Properties),方法(Methods)和事件(Events)
传统的面象对象语言只有Methods,而C#增加了属性和方法,这些特性丰富了我们编程,特别是做一些组件和控件开发的时候就显得特别有用。
2.C#的类型安全(Type Safety)
C#是一门强类型语言,也就是说你定义了Int参数的方法,不用用float参数去调用。编译器(Complier)会去强制做类型检查,不匹配的类型是会抛出异常(Exception)并提示错误,变量的定义也是如此。随着VS的IDE功能不断强大,已经提供了智能感知(IntelliSense)的功能,让我们提前排除这些错误。
另外在c#3.0中出现了Var,但这也是一种强类型,编译器会根据上下文,进行类型推断出她的类型。
3..net的内存管理(Memory Management)
C#运行在一个运行时(Common Lanague Runtime)上,这个CLR具有强大的功能,她帮我们管理着程序所用的内存。她有着内存管理,垃圾回收,线程管理等功能。这样就方便了我们编程,不需要想C++那样需要自己写大量的代码来释放资源,所以理论上时不会出现内存泄漏的情况的。
但是我个人觉最好不要偷懒,象一些昂贵的资源还是手动的释放比价好,比如:对打印机的调用,还有多线程管理.防范式编程还是需要的。
CLR的垃圾回收一般是有两个线程来运作的,对于普通的对象的回收器就是直接覆盖内存,而对比较昂贵的资源暂时无法回收的,就会放到另外一个线程上,等到安全点的来临时进行回收。这方面可以到网上找找介绍资料。
4.C#的多平台支撑(Platfrom Support)
C#和CLR都是符合ECMA的标准。 C#的代码通常是运行在windows平台上,但是却不妨碍她运行在其它的系统上如:Linux, Solaris, Mac OS X。.net framework为我们提供了统一的编程模型,所以我们只要针对.net编程,而不需要考虑系统的差异性。
C#的代码也可以运行在Silverlight这个宿主(host)上,她是微软新推出的一项技术。
4.C#和通用语言运行时(CLR)的关系
C#是.运行在CLR上的众多语言之一,她依赖着.net提供的内存管理等服务。
5.通用语言进行时(CLR)和.net Framework的关系
.net framework 是由CLR和一大堆,一系列的类组成。这个巨大的类库又分成了核心类(Core libraries)和应用类(applied libraries),应用类是依靠核心类的。
如图:(图片来自书)
![](http://img1.51cto.com/attachment/200904/200904301241080129296.jpg)
用.net上任何语言写的代码都会被编译成中间语言(Intermediate Language),即IL。这些中间语言以及他们的配置信息(type information)和原数据(MetaData)都会一起打包成可执行文件(exe)或程序集文件(dll),放在CLR上执行。
当CLR要执行代码时,首先是加载程序集(Assembly),通过CLR的即时编译器(Just-In-Time)把IL转换成适合CPU特点运行的机器码.
6.C#3.0给我们带来了那些新特性?
C#3.0新特性的重中之重就是Linq(Language Integrated Query capabilities)了,她的前身是Comega,主要设计者是Erik Meijer,她和Omega有相似之处。
Linq的语法特征跟SQL语法达到95%的相似,但用法以及语意却有出入,编译器能够对她做出很好的语法检查。
Linq可以对本地的集合(Collections),和远端的数据库(DB)和XML,进行查询分析。
C#3.0还有如下新特性。
a. Lambda 表达式 (Lambda Expressions)
例如:
Func<int,int> square = x => x * x;
Console.WriteLine (square(3)); // 9
b. 扩展方法(Extensions Method)
例如:
string[] names = { "Tom", "Dick", "Harry" };
IEnumerable<string> filteredNames = names.Where (n => n.Length >= 4);
例子有点问题,体现不了扩展方法的特性。
比如:Int类型,我们想在它里面加自己的方法myMethod(),以后调用Int类型的时候,智能提示就是出现myMethod(),就可以用到这个。
c. 隐式类型变量(Implicitly typed local variables)
例如:
var filteredNames = names.Where (n => n.Length == 4);
也就是Var。
d.推算分析(Query comprehension)
这个是我的叫法,她是Linq的语法,如:from,select ,in,group by 之类的。
例如:
var filteredNames = from n in names where n.Length >= 4 select n;
e.匿名类(Anonymous types)
就是我们无需象传统的那样定义一个类,象定义一个临时变量定义一个有结构的类。
她只是为方便我们临时使用。以后会细说。
例如:
var query = from n in names where n.Length >= 4
select new {
Name = n,
Length = n.Length
};
或
var dude = new { Name = "Bob", Age = 20 };
f.对象初始化器(Object initializers)
这个是方便我定义对象时,省去一大堆的构造器。同时也方便了我们实例化。
例如:
Bunny b1 = new Bunny { Name="Bo", LikesCarrots=true, LikesHumans=false };
g.隐式类型数组(Implicitly typed arrays)
这个跟隐式类型变量定义差不多,只是她是数组。
例如:
var dudes = new[]
{
new { Name = "Bob", Age = 20 },
new { Name = "Rob", Age = 30 }
};
h.自动属性(Automatic properties)
又一个语法糖(syntactic sugar),为了我们这些代码工人省力而做的。
例如:
public class Stock
{
// C# 3.0:
public decimal X { get; set; }
// C# 2.0:
private decimal y;
public decimal Y
{
get { return y; }
set { y = value; }
}
}
I.部分方法(Partial methods)
这用处就是我们一个方法里可能需要调用另外一个未定义或定义好的方法,她可能暂时用不上。部分方法就是为她设计的。
例如:
partial class PaymentForm
{
partial void ValidatePayment (decimal amount);//部分方法的申明
}
///部分方法的定义
partial class PaymentForm
{
partial void ValidatePayment (decimal amount)
{
if (amount > 100)
}
}
///调用
Static void Main()
{
PaymentForm form=new PaymentFrom();
Form.ValidatePayMent(5.3);///如果没有定义上面的方法,也不会报错。
}
j.表达树(Expression trees)
这个不多说了,以后会说到。
例如:
string[] names = { "Tom", "Dick", "Harry" };
IEnumerable<string> filteredNames = // Include only names
Enumerable.Where (names, n => n.Length >= 4); // of >= 4 characters.
以上都c#3.0新出的特性,行内都说是语法糖。呵呵!以后的文章会详细说这些东西的。
后记
本人学习中,错误难免,敬请指教,谢谢!