搜索
您的当前位置:首页正文

新Orcas语言特性-查询句法

2023-11-16 来源:字库网

新Orcas语言特性-查询句法

【原文地址】 【原文发表日期】 Saturday, April 21, 2007 2:12

上个月我开始了一个贴子系列,讨论作为Visual Studio和.NET框架Orcas版本一部分发布的一些新的VB和C#语言特性。下面是该系列的前三篇贴子的链接:

  • 今天的贴子要讨论另一个基础性的新语言特性:查询句法(Query Syntax)

    什么是查询句法(Query Syntax)?

    查询句法是使用标准的LINQ查询运算符来表达查询时一个方便的声明式简化写法。该句法能在代码里表达查询时增进可读性和简洁性,读起来容易,也容易让人写对。Visual Studio 对查询句法提供了完整的intellisense和编译时检查支持。

    在底下,C#和VB编译器则把查询句法的表达式翻译成明确的方法调用代码,这样的代码利用了Orcas中的新的和语言特性。

    查询句法的例子:

    在我以前的语言系列贴子里,我示范了你可以象下面这样声明一个Person类:

    然后我们可以使用下面这样的代码,用一些个人信息来生成一个List集合实例,然后使用查询句法来对该集合做一个LINQ查询,只取出那些姓(last name)的首字母为G的人,按名字(first name)来排序(升序):

    上面查询句法的表达式在语意上与下面明确使用LINQ和的代码是等同的:

    使用查询句法方法的好处是,结果会是稍微容易读写些,这在表达式变得更繁复时尤其如此。

    查询句法 - 理解from和select子句:

    在C#中,每个查询表达式的句法从from子句开始,以select或group子句结束。from子句表示你要查询什么数据。select子句则表示你要返回什么数据,且应该以什么构形返回。

    譬如,让我们再来看一下我们对List集合的查询:

    在上面的代码片段里,"from p in people"表示了我要对"people" 这个集合做一个LINQ查询,我将用参数"p"代表我正查询的输入序列的每个项。我们将参数命名为"p" 这个事实是无关紧要的,我完全可以很容易地将其命名为"o", "x", "person"或我想要的任何名字。

    在上面的代码片段里,语句结尾的"select p"子句表示,作为查询的结果,我要返回一个Person对象的IEnumerable序列。这是因为"people"集合包含了Person类型的对象,而参数p则代表了输入序列中的Person对象。因此,该查询句法表达式的结果数据类型是IEnumerable

    假如不是返回Person对象,我想返回该集合中的人的名字,我可以把查询改写成这样:

    注意上面我不再说"select p",而是说"select p.FirstName"。这表示我不想返回一串Person对象,而是想返回一串字符串,由Person对象的FirstName属性(该属性是个字符串)填充而来。 因此,该查询句法表达式的结果类型是 IEnumerable

    针对数据库的查询句法的例子

    LINQ的妙处在于,我可以针对任何数据类型使用完全一样的查询句法。譬如,我可以使用Orcas提供的新LINQ到SQL对象关系映射器支持,对SQL服务器的Northwind数据库进行建模,生成下面这些类(请来学习该如何实现):

    在上面定义好类模型之后(以及它与数据库间的映射关系),然后我就可以写个查询句法的表达式取出那些单价大于99元的产品:

    在上面的代码片段里,我表示我要对NorthwindDataContext类的Products表进行一个LINQ查询,NorthwindDataContext类是由Visual Studio orcas的ORM设计器生成的。"select p"表示我要返回匹配我的查询的一串Product对象,因此,该查询句法表达式的结果数据类型是IEnumerable

    就象前面List查询句法的例子一样,C# 编译器会把我们的声明式查询句法翻译成明确的扩展方法调用(使用Lambda表达式作为参数)。在上面的LINQ到SQL的例子的情形下,这些Lambda表达式会被转化成SQL命令,然后在SQL服务器上做运算(这样,只有那些匹配查询条件的Product记录行会返回到我们的应用中)。促成这个LambdaSQL 转化的机制的细节可见于我的的"Lambda表达式树"部分。

    查询句法 - 理解where和orderby子句:

    在一个查询句法表达式开头的"from" 子句和结尾的"select"子句之间,你可以使用最常见的LINQ查询运算符来过滤和转换你在查询的数据。两个最常用的子句是"where"和"orderby"。这两个子句处理对结果集的过滤和排序。

    譬如,要从Northwind数据库里返回按字母降序排列的分类名称列表,过滤条件是只包括那些含有5个以上产品的分类,我们可以编写下面这样的查询句法来用LINQ到SQL对我们的数据库做查询:

    在上面的表达式里,我们加了 "where c.Products.Count > 5" 子句来表示我们只要那些含有5个以上产品的分类。这利用了数据库中产品和分类间的LINQ到SQL的ORM映射的关联。在上面的表达式中,我也加了"order by c.CategoryName descending"子句来表示我要将结果集按名称降序排列。

    LINQ到SQL然后就会在使用这个表达式查询数据库时,生成下列SQL:

    Select [t0].[CategoryName] FROM [dbo].[Categories] AS [t0]Where (( Select COUNT(*) FROM [dbo].[Products] AS [t1] Where [t1].[CategoryID] = [t0].[CategoryID])) > 5ORDER BY [t0].[CategoryName] DESC

    注意,LINQ到SQL很聪明,只返回了我们所需的单个字段(分类名称), 而且它是在数据库层做了所有的过滤和排序,使得该查询效率非常高。

    查询句法 - 用投影(Projection)来转换数据

    先前我指出的一个要点是,"select" 子句表示了你要返回的数据,以及这个数据的构形是什么

    譬如,假如你有个象下面这样的"select p" 子句,这里p的类型是Person,然后,它就会返回一串Person对象:

    LINQ和查询句法提供的一个非常强大的功能是允许你定义跟被查询的数据分开的新的类型,然后用新的类型来控制查询返回的数据的形状和结构。

    譬如,假设我们定义了一个新的AlternatePerson类,内含一个FullName属性,而不是我们原先的Person类内的分开的FirstName和LastName属性:

    然后我就可以使用下面的LINQ查询句法来查询我原先的List集合,用下面的查询句法将结果转换成一串AlternatePerson对象:

    注意看,我们是如何在上面的表达式里的"select"子句里,使用里讨论过的新的来创建新的AlternatePerson实例,同时设置它的属性的。也注意我是如何连接我们原先Person类的FirstName和LastName属性,然后将其赋值给FullName属性的。

    对数据库使用查询句法投影

    这个投影特性在操作从象数据库这样一个远程数据提供器那里取回的数据时,会变得难以置信地有用,因为它提供给我们一个优雅的方式,来表示我们的ORM应该从数据库实际取回哪些数据字段。

    譬如,假设我用了LINQ到SQL的ORM提供器对Northwind数据库建模,生成下面这些类:

    通过编写下面这个LINQ查询,我告诉LINQ到SQL我要返回一串Product对象:

    填充Product类所需的所有字段都将作为上面查询的一部分从数据库中返回,由LINQ到SQL orM执行的raw SQL看上去象下面这样:

    Select [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]FROM [dbo].[Products] AS [t0]Where [t0].[UnitPrice] > 99

    在一些场景下,我不需要也不用所有这些字段,我可以定义一个下面这样的新的MyProduct类,只拥有Product类具有的部分属性,以及一个Product类并不具有的额外属性,TotalRevenue (注: 对那些不熟悉C#的,Decimal?句法表示我们的UnitPrice属性是个nullable值):

    然后我就可以使用下面这个查询,使用查询句法的投影功能来构造我要从数据库返回的数据的形状:

    这表明,不是返回一串Product对象,我要MyProduct对象,我只要其中三个属性被赋值,LINQ到SQL就会很聪明地调整要执行的raw SQL语句,从数据库只返回那三个需要的产品字段:

    Select [t0].[ProductID], [t0].[ProductName], [t0].[UnitPrice]FROM [dbo].[Products] AS [t0]Where [t0].[UnitPrice] > 99

    为炫耀起见,我也可以填充MyProduct类的第四个属性,即TotalRevenue属性。我要这个值等于我们产品目前的销售额的总量。这个值在Northwind数据库中并没有作为一个预先算好的字段而存在。而是,你需要在Products表和Order Details表间做一个关联,然后计算出一个给定产品对应的所有的Order Detail 行的总量。

    非常酷的是,我可以在Product类的OrderDetails关联上使用LINQ的 Sum 这个,编写一个作为我的查询句法投影一部分的乘法,来计算这个值:

    LINQ到SQL就会非常聪明地使用下面这个SQL在SQL数据库里做运算:

    Select [t0].[ProductID], [t0].[ProductName], [t0].[UnitPrice], ( Select SUM([t2].[value]) FROM ( Select [t1].[UnitPrice] * (CONVERT(Decimal(29,4),[t1].[Quantity])) AS [value], [t1].[ProductID] FROM [dbo].[Order Details] AS [t1] ) AS [t2] Where [t2].[ProductID] = [t0].[ProductID] ) AS [value]FROM [dbo].[Products] AS [t0]Where [t0].[UnitPrice] > 99

    查询句法 - 理解延迟执行(Deferred Execution)和使用ToList() 和ToArray()

    在默认情形下,查询句法表达式的结果的类型是IEnumerable。在上面的例子里,你会注意到所有的查询句法赋值是给IEnumerable, IEnumerable, IEnumerable, IEnumerable, 和 IEnumerable 变量的。

    IEnumerable接口的一个很好的特征是,实现它们的对象可以把实际的查询运算延迟到开发人员第一次试图对返回值进行迭代(这是通过使用最早在VS 2005中C# 2.0 中引进的yield构造来达成的)时才进行。LINQ和查询句法表达式利用了这个特性,将查询的实际运算延迟到了你第一次对返回值进行循环时才进行。假如你对IEnumerable的结果从不进行迭代的话,那么查询根本就不会执行。

    譬如,考虑下面这个LINQ到SQL的例子:

    不是在查询句法表达式声明的时候,而是在我们第一次试图对结果进行循环(上面红箭头标志的地方),才会去访问数据库以及取出填充Category对象所需的值。

    这个延迟运算的行为结果变得非常有用,因为它促成了一些把多个LINQ查询和表达式链在一起的强有力的组合场景。譬如,我们可以把一个表达式的结果喂给另一个表达式,然后通过延迟运算,允许象LINQ 到SQL这样的ORM根据整个表达式树来优化raw SQL。我将在以后的一个博客贴子里对这样的场景做示范说明。

    如何立刻对查询句法表达式做运算

    如果你不要延迟查询运算,而是要对它们立刻就执行运算,你可以使用内置的ToList() 和ToArray() 运算符来返回一个包括了结果集的List或者数组。

    譬如,要返回一个基于范型的 List 集合的话:

    要返回一个数组的话:

    在上面两种情形下,会立刻访问数据库,填充Category对象。

    结语

    查询句法在使用标准的LINQ查询运算符来表达查询时,提供了非常方便的声明式简化写法。它提供的句法可读性非常高,可以针对任何类型的数据(内存中的集合,数组,XML内容,以及象数据库这样的远程数据提供器,web服务等等)进行查询。一旦你熟悉这个句法后,你可以在任何地方应用这个知识。

    在不远的将来,我将结束本语言系列的最后一部分,该部分将讨论新的匿名类型特性。然后我将转而讨论在实际应用中使用所有这些语言特性的一些非常实用的例子(特别是针对数据库和XML文件使用LINQ的例子)。

    希望本文对你有所帮助,

    Scott

    小编还为您整理了以下内容,可能对您也有帮助:

    C# 3.0中的分部方法

       分部方法的语法

      在看C#语言的What s New时 突然发现新特性列表的最后 多出了一个 Partial Method Definitions 但并不像其他新特性一样有超链接链接到其说明 上网搜索了一下 关于分部类型的信息非常少 尤其是中文信息 只有CSDN的 周融 在其《C# 语言在 Visual Studio Orcas Beta 上的新增功能(二) 》一文的最后提到了这个分部方法 但没有进一步说明 英文技术文章中 倒是有两篇不错的 heard aspx 和 partial methods what why and how aspx

      又仔细看了一下MSDN Library for Visual Studio Beta 终于对这个语言特性有所了解 在这里介绍一下 希望对大家有所帮助

      分部方法的定义和分部类型类似 只需在方法定义前添加partial关键字 但分部方法只能拆分成两个部分——一部分是定义声明(Definition Declaration) 另一部分是实现声明(Implement Declaration) 其中定义声明看上去和抽象方法类似

      partial class CA

      {

      // ……

      private void partial M() // 定义声明|

      而实现声明看上去和普通方法类似

      private void partial M() // 实现声明

      {

      // 方法体

      }

      在调用分部方法时 和调用其他方法一样

      CA a = new CA()

      a M()

      只是 如果只有定义声明而没有编写实现声明 则编译器不会发射(Emit)该方法和调用该方法的语句的元数据与IL代码 换言之 如果没有编写实现声明 则编译得到的程序集中 CA类型里并没有M这个方法

       使用分部方法的注意事项

      分部方法的语法非常简单 但有一些事项要注意

      如果没有写实现声明 则不会发射方法调用代码 也不会对参数进行求值 因此 对于下面的例子

      

      class CA { partial void M(int i); static void Main() { CA a = new CA(); int i = ; a M(i++); } }

      分部方法M只有定义声明 没有实现声明 因此也不会发射调用该方法的代码 a M(i++) 因此也不会对i++进行求值 所以最终i的值依然是 但如果为M编写了实现声明 则a M(i++)的代码会被编译到最终的程序集中 同时参数也被求值 i的值将被变为

      分部方法只能出现在分部类中

      分部方法必须是私有(private)的 并且返回值类型必须是void

      分部方法可以带有参数 并且其参数可以带有this params和ref修饰符 但不能带有out修饰符

      分部方法不可以是虚拟(virtual)的

      分部方法不可以是外部(extern)的

      分部方法可以是静态(static)的 也可以是不安全(unsafe)的

      分部方法可以是泛型方法 泛型约束必须放置在定义声明中 但也可以在事先声明中重复说明 在定义声明和实现声明中 类型参数和类型参数的名字不一定必须一致

      不能将分部方法封装到一个委托中

       分部方法的应用场景

      分部方法和分部类型的初衷是类似的 一方面可以使得不同的开发者能够同时编写一个类型的不同部分 另一方面可以分离自动生成的代码和用户手写的代码 和分部类型一样 分部方法也会在编译初期被合并成一个方法定义 猜测 从微软的角度来看 第二个 初衷 可能才是真正的初衷

      由此 分部方法有如下几个应用场景 (场景 出自In Case You Haven t Heard这篇文章「 case you haven t heard aspx」) 场景 出自Visual Studio 的Linq to SQL技术 而场景 则是Anders Liu自已臆想出来的

       场景 轻量级事件处理

      有的时候 自动生成的代码需要事件这类语言构造来通知用户对某些操作进行处理 但实际上用于编写的代码就位于自动生成的类型之中 此时 或者需要触发一个事件 或者就需要生成一个virtual方法来让用户继承 但无论是事件还是继承 开销都是比较大的 所以可以通过分部方法来实现轻量级的处理方式 如下面的类 (本例子引用自前述的In Case You Haven t Heard一文)

      

      partial class Customer { string name; public string Name { get { return name; } set { OnBeforeUpdateName(); OnUpdateName(); name = value; OnAfterUpdateName(); } } partial void OnBeforeUpdateName(); partial void OnAfterUpdateName(); partial void OnUpdateName(); }

      这里定义了三个分部方法 其意义不言而喻 假设这是系统自动生成的代码 则我们只需在另外一个源代码文件中的partial class Customer中实现这几个分部方法即可

       场景 自定义DataContext中的Insert Update Delete方法

      当使用Linq to SQL向项目中加入了实体类之后 还会创建一个XxxDataContext类 这个类继承自DataContext类 并且是partial的 这个类封装了具体的数据库操作功能(实体类仅封装数据库中的数据) 如对象的插入 更新和删除等

      下面我们来看一下这个自动生成的类定义

      

      [System Data Linq Mapping DatabaseAttribute(Name= AdventureWorks )] public partial class AdventureWorksDataContext : System Data Linq DataContext { private static System Data Linq Mapping MappingSource mappingSource   = new AttributeMappingSource(); #region Extensibility Method Definitions partial void OnCreated(); partial void InsertAWBuildVersion(AWBuildVersion instance); partial void UpdateAWBuildVersion(AWBuildVersion instance); partial void DeleteAWBuildVersion(AWBuildVersion instance);

      这里我们可以看到一系列的partial方法 其中第一个OnCreated实际上属于场景 中描述的情况 是一个轻量级的事件 表示 DataContext环境对象创建完毕 而其他partial方法则用于自定义DataContext的IUD操作 对于每一个表(实体类) 这里都会出现一组InsertXxx UpdateXxx和DeleteXxx方法 如果我们希望自定义删除行为(如希望将一个IsDelete字段设置为 true来表示已删除) 则可以在另一个文件中扩展这个partial类 并为对应的Delete方法提供实现声明

       场景 新的调试信息输出方法

      这是Anders Liu臆想的场景 在分部方法的协助下 我们可以写出这样的代码

      

      partial class CA { partial void DebugPrint(string msg); void F() { DebugPrint( aaa ); } } partial class CA { #if DEBUG partial void DebugPrint(string msg); { Debug WriteLine(msg); } #endif }

      这样做的好处在于 我们还是反过来说罢 如果不这样做 必须在每次调用调试代码时都加入#if判断 而这样可以将调试代码都写成方法 在一处用#if进行判断

      缺点在于 由于分部方法必须是私有的 所以必须针对每个类写一套调试代码

       小结

    lishixin/Article/program/net/201311/13680

    谁给简单介绍一下C#?

    C#(读做 "C sharp",中文译音“夏普”)是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角.

    在本文中,我将考察创建一种新计算机语言的一般动机,并将特别指明是什么原因导致了C#的出现.然后我将介绍C#和它与Java,c,c++的相似之处.其次我将讨论一些存在于Java和C#之间的高层次的,和基础的差别.我将以衡量在用多种语言开发大型应用程序的时候所需的知识(或者对这种知识的缺乏程度)来结束本文,而这正是.NET和C#的一个主要战略.目前,C#和.NET还只能以C#语言规则,以及Windows 2000的一个"d预览版本",还有MSDN上迅速增多的文档集子的形式获得(还没有最终定型).

    微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说structs),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java.C#还需要进化成一种开发者能够接受和采用的语言.而微软当前为它的这种新语言大造声势也是值得注意的.目前大家的反应是:"这是对Java的反击."

    C#更象Java一些,虽然微软在这个问题上保持沉默.这也是意料中的事情,我觉得,因为Java近来很成功而使用Java的公司都报告说它们在生产效率上比C++获得了提高.

    Java所带来的巨大影响和大家对它的广泛接受已经由工作于这种语言和平台之上的程序员数量明显的说明了(估计世界范围内共有两百五十万程序员使用Java).由这种语言写成的应用程序的数量是令人惊讶的并已经渗透了每一个级别的计算,包括无线计算和移动电话(比如日本发明的Java电话).C#能够在用户领域获得这样的礼遇吗?我们必须等待并观望,就象已经由SSI公司的CEO和Kalpathi S. Suresh指出来的那样,"我发现所有这些都是渐进的.如果C#不存在,我们总能回到Java或C和C++.这些都不完全是新技术;它们在更大的意义上来说只是大公司制造的市场噱头.我们必须给他们时间安顿下来看看这些是不是真的对IT工业有什么影响."

    C#从Java继承而来的特点

    类:在C#中类的申明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好.Java的关键字import已经被替换成using,它起到了同样的作用.一个类开始执行的起点是静态方法Main().下面的Hello World程序展示了基本的形式:

    using System;

    class Hello

    {

    static void Main()

    {

    Console.WriteLine("Hello, world");

    }

    }

    在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(namespace).这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:一个被申明成abstract的类不能被实例化;它只能被用做一个基类.C#关键字sealed就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.界面:就象在Java中一样,一个界面是一组方法集合的抽象定义.当一个类或结构体实现一个界面的时候,它必须实现这个界面中定义的所有方法.一个单一的类可以实现几个界面.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层.NET框架进行自动内存垃圾回收.

    C#从C和C++继承的特点

    编译:程序直接编译成标准的二进制可执行形式.但C#的源程序并不是被编译成二进制可执行形式,而是一中中间语言,类似于JAVA字节码。如果前面的Hello World程序被保存成一个文本文件并被命名为Hello.cs,它将被编译成命名Hello.exe的可执行程序.

    结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据声明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面.

    预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有:

    #define

    #undef

    #if

    #elif

    #else

    #endif

    #warning

    #error

    #line []

    没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名.

    操作符重载:一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被被重载的单目操作符是:

    + - ! ~ ++ -- true false

    能够被重载的二元运算符是:

    + - * / % & | ^ << >> == != > < >= <=

    C#独有的特点

    C#最引人入胜的地方是它和Java的不同,而不是相似的地方.这一节(和这个系列第二部分的大部分地方)讲述了C#实现的和Java不同的地方或者Java根本没有的特点.

    中间代码:微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码.当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得Java和C#在性能上相对相同.象"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧.Java的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码.

    命名空间中的申明:当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容.

    基本的数据类型:C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字.

    两个基本类:一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它.

    参数传递:方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值.

    与COM的集成:C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET语言子类化.

    索引下标:一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的.

    public class ListBox: Control

    {

    private string[] items;

    public string this[int index]

    {

    get

    {

    return items[index];

    }

    set

    {

    items[index] = value;

    Repaint();

    }

    }

    }

    可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样:

    ListBox listBox = ...;

    listBox[0] = "hello";

    Console.WriteLine(listBox[0]);

    代理和反馈:一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明.

    补充:

    C#简史——摘自《程序员》杂志2005-12月刊

    C# 简史

    编者按:时间过得真快,居然现在就可以写C#的简史了。但是想想也不奇怪,C#可谓

    起点高、发展快的新一代语言,它的这五年走过了很多前辈十几年的路。公允地说,C#是目

    前兼顾系统开发和应用开发的最佳实用语言,并且很有可能成为编程语言历史上的第一个“全

    能”型语言。看过这篇简史,我们都应该明白,不要再把C#看成年轻后生了——只要是“马

    拉多纳”,就早晚当“球王”。

    C# 1.0,纯粹的面向对象

    当时间回溯到1998年底,微软正在忙于新一代COM的设计工作。此前,COM一直是组件化开发中非常成功的一种技术;但由于它仅提供了二进制

    层面上的统一,因此无法将类型信息和用于支持基础平台和开发工具的信息放到组件中。这时,Java正在逐步走向成熟。于是,微软学习Java

    的做法,将虚拟机的概念引入到了COM领域;同时,微软提出了“元数据”的概念,用于描述组件的类型信息和工具支持信息,并决定将其放入

    到组件当中。这种“COM虚拟机”的名字在经历了若干争论后,最终被定为CLR(Common Language Runtime,公共语言运行时)。与此同时,微

    软提出了在该运行时上运作的语言应该遵循的一些规则,以及该虚拟机的类型系统和指令集——所有这些规范形成了最终的C L I(Common

    Language Infrastructure,公共语言基础设施),并提交给了ECMA委员会。同时,微软开发了CLI的一个实现,这就是大名鼎鼎的.NET了。

    1998年12月,微软启动了一个全新的语言项目——COOL,这是一款专门为CLR设计的纯面向对象的语言,也正是本文的主角——C#的前身。历时

    半年有余,1999年7月份,微软完成了COOL语言的一个内部版本。直到2000年2月份,微软才正式将COOL语言更名为C#。据说起这个名字是因为

    C#开发小组的人很讨厌搜索引擎,因此把大部分搜索引擎无法识别的“#” 字符作为该语言名字的一部分;还有一种说法是在音乐当中“#”是

    升调记号,表达了微软希望它在C的基础上更上一层楼的美好愿望——当然这些都只是传说,无从考证。又是历经了一系列的修改,微软终于在

    2000年7月发布了C#语言的第一个预览版。因此人们一般认为C#是2000年发布的,并以此来计算它的“年龄”。在此后的一年多时间里,微软一

    直在修补各个测试版本中的BUG。直到2002年2月,微软终于推出了迟迟未上市的Visual Studio 7.0,并将其定名为“VisualStudio .NET 2002

    ”。随着这套开发环境的出炉,开发者们终于看到了C#语言的第一个正式版本——C# 1.0。此后,微软马不停蹄,Visual Studio也恢复了往日

    的开发进度。在2003年5月,微软如期推出了Visual Studio .NET 2003,同时也发布了C#的改进版本——C# 1.1。这一时期的C#(以下称为C#

    1.x)提出了纯粹的面向对象概念,并在语言特性中展现得淋漓尽致。C++并非纯面向对象的,为了和C兼容以及提供更高的执行效率,它保留了

    很多模块化的东西。Java尽管号称是面向对象的,但实际上,对于对象所应该具备的三种构成结构——属性、方法和事件,Java仅提供了方法

    ,其它两种结构都要通过方法来模拟。在C# 1.x中,所有面向对象的概念都在语言中得到了非常好的体现。同时,C#还通过类类型、值类型和

    接口类型的概念形成了统一的类型系统。C#使用了大家所熟知的语法实现了方法,以至于很多人认为C#和Java、C++等面向对象语言“非常相像

    ”,这使得从使用其他面向对象语言转到使用C#的过程非常简单。此外,C#还通过无参数列表的方法声名语法,结合get/set访问器实现了优雅

    的属性语法。其中的get访问器相当于获取属性值的方法,可以通过一些运算返回最终的结果,而不是简单地返回一个变量的值;而set访问器

    相当于设置属性值的方法,在其中可以进行一系列检测,最后将属性值赋给相应的变量。同时,通过同时提供get和set访问器、只提供get访问

    器和只提供set访问器,还可以很方便地实现可读写、只读和只写的属性。C#的这种属性语法,使得一个属性在提供该属性的类的内部看来,非

    常像一组方法;而对于外部调用类看来,访问一个对象的属性和访问它的公共域没有任何区别。

    通过委托(稍后介绍),结合关键字event,C#提供了优雅的事件概念。使用+=运算符,开发者可以非常方便地将一个事件处理器关联到一个事

    件上,这个过程称之为“订阅”一个事件。由于委托内部封装了一个调用链表,因此可以方便地为一个事件添加多个事件处理器,这些处理器

    会自动地依次调用。多年的开发语言进化证明,函数指针是非常重要也是非常危险的语言特征之一。同时,基于函数指针的回调机制也Windows

    核心概念之一。然而,由于函数指针很难验证参数的类型准确性,因此C#(确切地说是CLI)提出了“委托”的概念,这是一种类型安全的函数

    指针链表。这意味着,C#不仅可以提供回调机制,同时调用回调的一方还无需在其内部维护函数指针列表,所要做的仅仅是声名一个具有恰当

    委托类型的公共成员即可;而提供回调的一方也只需通过构造一个带有指定方法的相应委托实例,并通过“+=”运算符添加到回调列表即可。

    尽管C# 1.x提供了如此多的新鲜概念,但实际上,这些概念都是由CLI提出的。因此当将一个C#源程序编译为可执行文件时,编译器做的工作相

    对而言并不多。需要编译器代劳的是要将一个简单的委托定义语句翻译为一个继承自System.MulticastDelegate类型定义。

    C# 2.0,泛型编程新概念

    微软本打算继续保证开发进度,并在2004年推出Visual Studio .NET 2004,但由于其间软件工程学尤其是软件管理学的大规模进步,微软所提

    供的这种仅具备开发和调试功能的IDE已经无法满足团队开发的需求。因此微软决定在项目设计和管理工具方面进行了进一步研发,并将其集成

    到Visual Studio中,以赢回原有的市场。因此,微软将Visual Studio.NET 2004“改名”为Visual Studio 2005,并决定推迟一年发布。不过

    ,微软还是坚持在2004年的6月份发布了Visual Studio2005的第一个Beta 版,同时向开发者展示了C#语言的2.0版本。2005年4月,微软发布了

    Visual Studio 2005 Beta2,这已经是具备了几乎全部功能的VisualStudio,包括的产品有SQL Server2005、Team Foundation Server和

    TeamSuite。这时的C#编译器已经能够处理C# 2.0中所有的新特性。C# 2.0为开发者带来的最主要的特性就是泛型编程能力。和面向对象思想一

    样,泛型思想也是一种已经成熟的编程思想,但依然是没有哪一种主流开发语言能够支持完备的泛型概念。这主要是因为泛型的概念在一定程

    度上对面向对象概念进行冲击,同时,由于在编译期间对类型参数的完全检测很难做到,很多问题会被遗留到运行时。C# 2.0别出心裁,对泛

    型类型参数提出了“约束”的新概念,并以优雅的语法体现在语言之中。有了约束,结合编译器强大的类型推断能力,可以在编译时

    发现几乎所有“危险”的泛型应用。C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更

    加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就

    用匿名方法结合泛型编程实现了函数式编程中的重要结构—— Lambda 表达式。尽管这种实现显得很繁琐而且不易理解,但毕竟是实现了。最

    终,函数式编程还是被引入到了C#语言中,这将在下一节中为大家讲述。

    此外,C# 2.0还进一步增强了语言的表达能力。在C# 2.0中,属性语法中的get和set访问器可以拥有不同的权限,这就使得定义一个在库的内

    部可读写,而在库的外部只读的属性成为可能。同时,C# 2.0还提供了迭代器的概念,这使得一个类无需实现IEnumerator 和IEnumerable接口

    即可实现一个可以进行遍历的类型,并且无需在类型中维护迭代状态。此时的.NET已经得到了很广泛的认可,并且因为元数据为组件带来了强

    大的自我描述能力,许多程序库厂商被吸引到.NET平台上来。随着.NET程序库数量的增长,逐渐暴露了命名的问题。在面向对象技术广泛发展

    后,人们就意识到名字的管理问题,因此几乎所有的面向对象语言都提出了“命名空间”的概念;

    而在C# 1.x时代,这个问题再一次出现。如果一个库厂商XX 希望以XX.System来命名他们自己的系统基础库,那么当开发者使用using System

    语句时就会产生歧义。为此。C# 2.0中提供了global关键字,这为.NET库中所有的命名空间提供了一个“根”,通过指定global::System和

    global::XX.System就可以区别两个库了。这一时期的C#编译器变得非常复杂,泛型的引入使得编译器不得不具备超强的类型推断能力。同时,

    迭代器的思想并非是在CLI层面上实现的,而是由编译器自动生成了实现I E n u m e r a t o r 和IEnumerable接口类型。

    C# 3.0,魔鬼

    在经历了一系列的改进和完善后,微软决定于2005年11月发布Visual Studio2005,该开发环境将正式支持C#2.0。由于此前推出了数个预览版

    和测试版,大家的期待之情似乎已经不是那么强烈了。而2005年9 月份的PDC大会则为开发者们带来了另外的惊喜——C#3.0(研发代号“Orcas

    ”——魔鬼)的技术预览版。

    说到C# 3.0,就不得不提一下微软的LINQ 项目,LINQ(语言集成查询,Language Integrated Query)提出了一种通过面向对象语法来实现对

    非面向对象数据源的查询技术,可查询的数据源从关系型数据库延伸到一般意义上的集合(如数组和列表)以及XML。而C# 3.0则是率先实现了

    LINQ的语言。在C# 3.0中,我们可以用类似于SQL语句的语法从一个数据源中轻松地得到满足一定条件的对象集合。例如要查找一个字符串

    数组names中所有长度大于5的字符串,就可以写: var longname = from n in names wheren.Length > 5 select n;这样我们就得到一个

    新的字符数组longname,其中包含了我们所需要的结果。这种语句称作查询语句,与SQL语句唯一的区别是C#中的查询语句往往把select子句放

    到最后(这反而倒有些类似于中文的阅读顺序了)。初次看到这样一个语句,我们可能会有很大疑问:这还是C#语言吗?这的确是合乎语法规

    则的C#代码,而且编译器可以识别这种语法。然而实际上,C#编译器并不会对这种语法进行实际的的编译,而是将其翻译为正常的方法调用:

    var longname = names.Where(n => n.

    Length > 5).Select(n);然后再进行进一步的编译。在上面的例子中已经说明,names是一个存放有字符串的数组,而数组类型并没有Where的

    方法。的确,Where并非names的成员方法,微软也没有对数组类型进行任何改动。这是C# 3.0中另外一个重要的新特性:扩展方法。扩展方法

    是定义在其他静态类中的静态方法,其第一个参数的类型就是希望扩展的类型,并且这个参数被冠以this修饰符。扩展方法是静态的,但可以

    像调用被扩展类型的实例方法那样进行调用,看起来好像是被扩展类型自己的方法一样。这就为语言带来了很大的灵活性,我们可以将一组近

    似的功能如上面的Where 和Select等(这在LINQ中被称作“标准查询表达式”)定义在一个外部类中,这样既无须修改现有类型,又可以将新

    功能组织在一起。当然,为了做到面向对象的封装性,扩展方法只能在被扩展类型的公共成员上进行操作,如果需要从内部对类型进行改进,

    就必须改变现有类型的代码。在Where方法的参数列表里,我们又发现了一种奇怪的语法:n => n.Length > 5。这就是我们上文提到过的

    Lambda 表达式。微软的官方规范中称,Lambda 表达式是匿名方法的一种自然进化。因此Lambda 表达式其实也是一种特殊的委托,由编译器负

    责生成一个匿名的委托类型,它接受一个字符串类型的参数n;返回值为布尔类型,表示n的长度是否大于5;其中的参数类型和返回值类型都是

    由编译器推断而来的。说到类型推断,还要解释的一点就是上面的语句中出现的新关键字var。从出现的位置来看,var应该是一个类型。然而

    这又不是一个C#内建类型,也不是CLI提出的新类型;它只是一个“占位符”,它的确表示一个类型,但具体是什么类型需要编译器在编译期间

    进行推断。Lamda表达式的真正意义不仅仅在于简化了委托的编写方式,更重要的是它把代码表达式体现为了数据。换句话说,Lambda表达式不

    仅可以被编译为一段可以执行的代码(类似于匿名方法),也可以将其翻译为一个数据结构——表达式树。而如何处理Lambda 表达式,是由编

    译器根据Lambda表达式的使用方式来自动确定的。当把一个Lambda表达式赋给一个具有委托类型的域、属性或变量时,编译器像编译匿名方法

    一样将表达式体翻译成一段可执行代码;而当把一个L a m b d a 表达式赋给一个具有Expression<T>类型的域、属性或变量时,编译器就会将

    Lambda表达式解析为一个表达式树。对于翻译为代码的Lambda,可以向调用委托那样进行调用,而对于翻译为表达式树的Lambda表达式,就不

    可以了,会得到一个编译错误。但表达式树存在于一个由编译器生成的数据结构中,因此可以在运行时对其进行分析甚至修改。

    除了上面提到的一些重大改进之外,C# 3.0也对细微的语法进行了一些改进,使C#语言变得更加优雅和全面。值得说明的是,C# 3.0经过编译

    后生成的IL代码,完全是基于.NET 2.0的,C#语言已经远远跑在了他所栖生的平台前面。这一时期的C#语言离CLI已经越来越远了,编译器的工

    作也愈加繁重起来。首先很多语言结构(如查询表达式和Lambda 表达式)都不是CLI中提供的特性,因此需要编译器进行大量的转译工作;其

    次是这些语言结构带来的大量类型推断任务,也都是靠编译器来完成的。

    C#走到了3.0以后,已经完全不再是当年那个“简单”的语言了。它的开发者称其为“魔鬼”,而琳琅满目的新特性也的确让开发者们眼花缭乱

    ,甚至感到恐惧。语言集成查询的引入,使得前一段时期内为开发者们广泛讨论的ORM概念得到了更加深入地体现,尤其是它所支持的数据源之

    广泛,让ORM理念变得已经不再必要了;而一些“.NET中的ORM实现”,似乎也成了完全不必要的扩展项目了。Lambda 表达式的引入,使得C#

    将可以轻松地完成特定领域(Domain-Specific)的开发。一个成功的开发人员在面对新鲜事物和新的困难时,兴奋是远大于恐惧的。

    让魔鬼来得更猛烈些吧!

    .NET的3.5特性

    VS 2008的多定向支持
    VS 2008允许你构建针对多个.NET框架版本的应用。你可以从下面的博客贴子里进一步了解其中的工作原理:
    VS 2008 Multi-Targeting Su ort
    VS 2008 Web设计器和C 支持
    VS 2008包含一个显著改进的HTML web设计器。该设计器提供了分割视图编辑,嵌套母板页,以及出色的C 集成。
    A .NET还提供了一个新的控件,该控件对数据UI场景提供了非常灵活的支持,允许对输出的标识做完全的定制,与VS 2008中的新C 支持还有良好的协作。
    A .NET AJAX和JavaScript支持
    .NET 3.5 内置提供A .NET AJAX,还添加了支持We art的UpdatePanel,支持JSON的WCF,以及N个缺陷修补和性能改进等方面的新特性。VS 2008还对集成JavaScript和AJAX进你的应用提供了极棒的支持:
    VS 2008 JavaScript Intellise e
    VS 2008 JavaScript Debugging VS 2008中的新VB和C#编译器对这些语言做了显著的改进。两者都添加了函数式编程概念的支持,允许你编写更干净,更简洁,更具有表达性的代码。这些特性还促成了我们称之为LINQ(语言级集成查询)的新编程模型,使得查询和操作数据成为.NET中的一等编程概念。
    下面是我撰写的一些讨论这些新语言特性的文章(用C#作为示例):
    自动属性,对象初始化器,和集合初始化器
    扩展方法
    Lambda表达式
    查询句法
    匿名类型
    LINQ to SQL中的数据访问改进
    LINQ to SQL是.NET 3.5中内置的OR/M (对象关系映射器)。它允许你使用.NET 对象模型对关系数据库进行建模。然后你可以使用LINQ对数据库进行查询,以及更新、插入,删除数据。LINQ to SQL完整支持事务,视图和存储过程。它还提供了一个把业务逻辑和验证规则结合进你的数据模型的简易方式。下面是一些我讨论如何使用LINQ to SQL的文章:
    Part 1: Introction to LINQ to SQL
    Part 2: Defining our Data Model Cla es
    Part 3: Querying our Database
    Part 4: Updating our Database
    Part 5: Binding UI using the A :LinqDataSource Control
    我会在以后的几周内再往这个系列里添加几篇文章。我认为你会发现LINQ to SQL显著地简化了构建非常干净的数据模型以及编写极其干净的数据代码。 在安装VS 2008 和.NET 3.5 Beta2之后,还有2件重要的事情你应该马上做:
    1) 你应该下载和运行这个批文件。这只要几秒钟就可以运行完,它修补了这个星期早些时候我们发现的System.Web.Exte io .dll版本*的问题,该程序集包含了 A .NET AJAX。如果你不运行这个批文件,那么用A .NET AJAX 1.0 和 VS 2005构建的现有的A .NET 2.0项目就会自动地运载随 .NET 3.5 Beta2发布的新A .NET AJAX 版本。这会工作而且运行良好,但会不小心导致你的VS2005应用依赖于.NET 3.5。运行这个批文件会改变新的System.Web.Exte io .dll程序集的版本绑定*,确保你只在你明确构建.NET 3.5项目时才使用新的.NET 3.5 A .NET AJAX版本。
    2) 假如你曾经在你的机器上安装过Orcas或VS 2008的早期版本(Beta1 或某个CTP 版本)的话,你需要在安装Beta2后重新设定你的VS 2008设置。如果你不这么做的话,有些设置会非常奇怪(一些窗口在出现在奇怪的地方),你也有可能看到一些IDE性能问题。你可以在命令行上对VS 2008的IDE版本键入“DevEnv /resetsettings”来重新设定你的配置。

    .NET的3.5特性

    VS 2008的多定向支持
    VS 2008允许你构建针对多个.NET框架版本的应用。你可以从下面的博客贴子里进一步了解其中的工作原理:
    VS 2008 Multi-Targeting Su ort
    VS 2008 Web设计器和C 支持
    VS 2008包含一个显著改进的HTML web设计器。该设计器提供了分割视图编辑,嵌套母板页,以及出色的C 集成。
    A .NET还提供了一个新的控件,该控件对数据UI场景提供了非常灵活的支持,允许对输出的标识做完全的定制,与VS 2008中的新C 支持还有良好的协作。
    A .NET AJAX和JavaScript支持
    .NET 3.5 内置提供A .NET AJAX,还添加了支持We art的UpdatePanel,支持JSON的WCF,以及N个缺陷修补和性能改进等方面的新特性。VS 2008还对集成JavaScript和AJAX进你的应用提供了极棒的支持:
    VS 2008 JavaScript Intellise e
    VS 2008 JavaScript Debugging VS 2008中的新VB和C#编译器对这些语言做了显著的改进。两者都添加了函数式编程概念的支持,允许你编写更干净,更简洁,更具有表达性的代码。这些特性还促成了我们称之为LINQ(语言级集成查询)的新编程模型,使得查询和操作数据成为.NET中的一等编程概念。
    下面是我撰写的一些讨论这些新语言特性的文章(用C#作为示例):
    自动属性,对象初始化器,和集合初始化器
    扩展方法
    Lambda表达式
    查询句法
    匿名类型
    LINQ to SQL中的数据访问改进
    LINQ to SQL是.NET 3.5中内置的OR/M (对象关系映射器)。它允许你使用.NET 对象模型对关系数据库进行建模。然后你可以使用LINQ对数据库进行查询,以及更新、插入,删除数据。LINQ to SQL完整支持事务,视图和存储过程。它还提供了一个把业务逻辑和验证规则结合进你的数据模型的简易方式。下面是一些我讨论如何使用LINQ to SQL的文章:
    Part 1: Introction to LINQ to SQL
    Part 2: Defining our Data Model Cla es
    Part 3: Querying our Database
    Part 4: Updating our Database
    Part 5: Binding UI using the A :LinqDataSource Control
    我会在以后的几周内再往这个系列里添加几篇文章。我认为你会发现LINQ to SQL显著地简化了构建非常干净的数据模型以及编写极其干净的数据代码。 在安装VS 2008 和.NET 3.5 Beta2之后,还有2件重要的事情你应该马上做:
    1) 你应该下载和运行这个批文件。这只要几秒钟就可以运行完,它修补了这个星期早些时候我们发现的System.Web.Exte io .dll版本*的问题,该程序集包含了 A .NET AJAX。如果你不运行这个批文件,那么用A .NET AJAX 1.0 和 VS 2005构建的现有的A .NET 2.0项目就会自动地运载随 .NET 3.5 Beta2发布的新A .NET AJAX 版本。这会工作而且运行良好,但会不小心导致你的VS2005应用依赖于.NET 3.5。运行这个批文件会改变新的System.Web.Exte io .dll程序集的版本绑定*,确保你只在你明确构建.NET 3.5项目时才使用新的.NET 3.5 A .NET AJAX版本。
    2) 假如你曾经在你的机器上安装过Orcas或VS 2008的早期版本(Beta1 或某个CTP 版本)的话,你需要在安装Beta2后重新设定你的VS 2008设置。如果你不这么做的话,有些设置会非常奇怪(一些窗口在出现在奇怪的地方),你也有可能看到一些IDE性能问题。你可以在命令行上对VS 2008的IDE版本键入“DevEnv /resetsettings”来重新设定你的配置。

    C#到现在一共经历了几个版本?

    C# 1.0-纯粹的面向对象

    在2003年5月,微软推出了Visual Studio .NET 2003,同时也发布了C#的改进版本——C# 1.1。[25]

    这一时期的C#(以下称为C# 1.x)提出了纯粹的面向对象概念。C++并非纯面向对象的,为了和C兼容以及提供更高的执行效率,它保留了很多模块化的东西。C#还通过类类型、值类型和接口类型的概念形成了统一的类型系统。[25]

    尽管C# 1.x提供了如此多的新鲜概念,但实际上,这些概念都是由CLI提出的。因此当将一个C#源程序编译为可执行文件时,编译器做的工作相对而言并不多。需要编译器代劳的是要将一个简单的委托定义语句翻译为一个继承System.MulticastDelegate类型定义。[25]

    C# 2.0-泛型编程新概念

    微软在2004年的6月份发布了Visual Studio2005的第一个Beta
    版,同时向开发者展示了C#语言的2.0版本。2005年4月,微软发布了Visual Studio 2005
    Beta2,这已经是具备了几乎全部功能的VisualStudio,包括的产品有SQL Server2005、Team Foundation
    Server和TeamSuite。这时的C#编译器已经能够处理C# 2.0中所有的新特性。[26]

    C# 2.0为开发者带来的最主要的特性就是泛型编程能力。和面向对

    Microsoft Visual C# .NET Step by Step[27]
    象思想一样,泛型思想也是一种已经成熟的编程思想,但依然是没有哪一种主流开发语言能够支持完备的泛型概念。这主要是因为泛型的概念在一定程度上对面向对象概念进行冲击,同时,由于在编译期间对类型参数的完全检测很难做到,很多问题会被遗留到运行时。C#
    2.0别出心裁,对泛型类型参数提出了“约束”的新概念,并以优雅的语法体现在语言之中。有了约束,结合编译器强大的类型推断能力,可以在编译时发现几乎所有“危险”的泛型应用。[28]

    C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名方法结合泛型编程实现了函数式编程中的重要结构——
    Lambda 表达式。尽管这种实现显得很繁琐而且不易理解,但毕竟是实现了。

    C#3.0-(研发代号“Orcas”)

    2005年9 月份的PDC大会——C#3.0(研发代号“Orcas”——魔鬼)的技术预览版。说到C# 3.0,就不得不提一下微软的LINQ
    项目,LINQ(语言集成查询,Language Integrat

    c#
    本质论[29]
    ed
    Query)提出了一种通过面向对象语法来实现对非面向对象数据源的查询技术,可查询的数据源从关系型数据库延伸到一般意义上的集合(如数组和列表)以及XML。而C#
    3.0则是率先实现了LINQ的语言。

    在C#
    3.0中,可以用类似于SQL语句的语法从一个数据源中轻松地得到满足一定条件的对象集合。例如要查找一个字符串数组names中所有长度大于5的字符串,就可以写:var
    longname = from n in names wheren.Length > 5 select n;

    这样就得到一个新的字符数组longname,其中包含了所需要的结果。这种语句称作查询语句,与SQL语句唯一的区别是C#中的查询语句往往把select子句放到最后(这反而倒有些类似于中文的阅读顺序了)。初次看到这样一个语句,可能会有很大疑问:这还是C#语言吗?这的确是合乎语法规则的C#代码,而且编译器可以识别这种语法。然而实际上,C#编译器并不会对这种语法进行实际的的编译,而是将其翻译为正常的方法调用。[30-31]

    C# 4.0动态编程

    C# 4.0 新增 dynamic关键字,提供动态编程(dynamic programming),把既有的静态物件标记为动态物件,类似javascript, Python
    或 Ruby[32-33] 。

    C# 4.5
    C#4.5在2012年随着Vs2012一起发布的,新的特性简化大异步编程

    C#到现在一共经历了几个版本?

    C# 1.0-纯粹的面向对象

    在2003年5月,微软推出了Visual Studio .NET 2003,同时也发布了C#的改进版本——C# 1.1。[25]

    这一时期的C#(以下称为C# 1.x)提出了纯粹的面向对象概念。C++并非纯面向对象的,为了和C兼容以及提供更高的执行效率,它保留了很多模块化的东西。C#还通过类类型、值类型和接口类型的概念形成了统一的类型系统。[25]

    尽管C# 1.x提供了如此多的新鲜概念,但实际上,这些概念都是由CLI提出的。因此当将一个C#源程序编译为可执行文件时,编译器做的工作相对而言并不多。需要编译器代劳的是要将一个简单的委托定义语句翻译为一个继承System.MulticastDelegate类型定义。[25]

    C# 2.0-泛型编程新概念

    微软在2004年的6月份发布了Visual Studio2005的第一个Beta
    版,同时向开发者展示了C#语言的2.0版本。2005年4月,微软发布了Visual Studio 2005
    Beta2,这已经是具备了几乎全部功能的VisualStudio,包括的产品有SQL Server2005、Team Foundation
    Server和TeamSuite。这时的C#编译器已经能够处理C# 2.0中所有的新特性。[26]

    C# 2.0为开发者带来的最主要的特性就是泛型编程能力。和面向对

    Microsoft Visual C# .NET Step by Step[27]
    象思想一样,泛型思想也是一种已经成熟的编程思想,但依然是没有哪一种主流开发语言能够支持完备的泛型概念。这主要是因为泛型的概念在一定程度上对面向对象概念进行冲击,同时,由于在编译期间对类型参数的完全检测很难做到,很多问题会被遗留到运行时。C#
    2.0别出心裁,对泛型类型参数提出了“约束”的新概念,并以优雅的语法体现在语言之中。有了约束,结合编译器强大的类型推断能力,可以在编译时发现几乎所有“危险”的泛型应用。[28]

    C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名方法结合泛型编程实现了函数式编程中的重要结构——
    Lambda 表达式。尽管这种实现显得很繁琐而且不易理解,但毕竟是实现了。

    C#3.0-(研发代号“Orcas”)

    2005年9 月份的PDC大会——C#3.0(研发代号“Orcas”——魔鬼)的技术预览版。说到C# 3.0,就不得不提一下微软的LINQ
    项目,LINQ(语言集成查询,Language Integrat

    c#
    本质论[29]
    ed
    Query)提出了一种通过面向对象语法来实现对非面向对象数据源的查询技术,可查询的数据源从关系型数据库延伸到一般意义上的集合(如数组和列表)以及XML。而C#
    3.0则是率先实现了LINQ的语言。

    在C#
    3.0中,可以用类似于SQL语句的语法从一个数据源中轻松地得到满足一定条件的对象集合。例如要查找一个字符串数组names中所有长度大于5的字符串,就可以写:var
    longname = from n in names wheren.Length > 5 select n;

    这样就得到一个新的字符数组longname,其中包含了所需要的结果。这种语句称作查询语句,与SQL语句唯一的区别是C#中的查询语句往往把select子句放到最后(这反而倒有些类似于中文的阅读顺序了)。初次看到这样一个语句,可能会有很大疑问:这还是C#语言吗?这的确是合乎语法规则的C#代码,而且编译器可以识别这种语法。然而实际上,C#编译器并不会对这种语法进行实际的的编译,而是将其翻译为正常的方法调用。[30-31]

    C# 4.0动态编程

    C# 4.0 新增 dynamic关键字,提供动态编程(dynamic programming),把既有的静态物件标记为动态物件,类似javascript, Python
    或 Ruby[32-33] 。

    C# 4.5
    C#4.5在2012年随着Vs2012一起发布的,新的特性简化大异步编程

    寻找一个 Microsoft Visual Basic 9.0 中文版

    Visual Basic(VB)是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用 DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。

    发展历史

    1991年,微软公司推出了Visual Basic 1.0版。这在当时引起了很大的轰动。这个连接编程语言和用户界面的进步被称为Tripod(有些时候叫做Ruby),最初的设计是由阿兰·库珀(Alan Cooper)完成的。许多专家把VB的出现当做是软件开发史上的一个具有划时代意义的事件。其实,以我们现在的目光来看,VB1.0的功能实在是太弱了;(不过最近VB6.0, VB.NET的功能相当大!)。但在当时,它是第一个“可视”的编程软件。这使得程序员欣喜之极,都尝试在VB的平台上进行软件创作。微软也不失时机地在四年内接连推出VB2.0,VB3.0,4.0三个版本。并且从VB3开始,微软将ACCESS的数据库驱动集成到了VB中,这使得VB的数据库编程能力大大提高。从VB4开始,VB也引入了面向对象的程序设计思想。VB功能强大,学习简单。而且,VB还引入了“控件”的概念,使得大量已经编好的VB程序可以被我们直接拿来使用。VB1.0的DOS版本VB1.0于1991年发布。这个连接编程语言和用户界面的进步被称为Tripod(有些时候叫做 Ruby),最初的设计是由阿兰·库珀(Alan Cooper)完成的

    2002年Visual Basic .NET 2002 (v7.0)问世,2003年Visual Basic .NET 2003 (v7.1)问世,2005年11月7日Visual Basic 2005 (v8.0)问世,同时间推出Visual Basic 2005的免费简化版本Visual Basic 2005 Express Edition给Visual Basic初学者及学生使用。

    VB 2005的“显著”优点是,可以直接编写出XP风格的按钮,以及其他的控件。但是其编写的小程序占用近10MB的内存。

    通过几年的发展,它已成为一种专业化的开发语言和环境。用户可用Visual Basic快速创建Windows程序,现在还可以编写企业水平的客户端/服务器程序及强大的数据库应用程序。

    VB会吸引更多的赞誉和批评,也会继续为广大的用户和程序员使用。它非常适合用来开发拥有友好界面的程序(比如针对终端的数据),但是不适合开发其它程序(比如联合计算程序)。

    语言特性

    一个典型的VB进程VB的中心思想就是要便于程序员使用,无论是新手或者专家。VB使用了可以简单建立应用程序的GUI系统,但是又可以开发相当复杂的程序。VB的程序是一种基于窗体的可视化组件安排的联合,并且增加代码来指定组建的属性和方法。因为默认的属性和方法已经有一部分定义在了组件内,所以程序员不用写多少代码就可以完成一个简单的程序。过去的版本里面VB程序的性能问题一直被放在了桌面上,但是随着计算机速度的飞速增加,关于性能的争论已经越来越少。

    窗体控件的增加和改变可以用拖放技术实现。一个排列满控件的工具箱用来显示可用控件(比如文本框或者按钮]]。每个控件都有自己的属性和事件。默认的属性值会在控件创建的时候提供,但是程序员也可以进行更改。很多的属性值可以在运行时候随着用户的动作和修改进行改动,这样就形成了一个动态的程序。举个例子来说:窗体的大小改变事件中加入了可以改变控件位置的代码,在运行时候每当用户更改窗口大小,控件也会随之改变位置。在文本框中的文字改变事件中加入相应的代码,程序就能够在文字输入的时候自动翻译或者阻止某些字符的输入。

    VB的程序可以包含一个或多个窗体,或者是一个主窗体和多个子窗体,类似于操作系统的样子。有很少功能的对话框窗口(比如没有最大化和最小化按钮的窗体)可以用来提供弹出功能。

    VB的组件既可以拥有用户界面,也可以没有。这样一来服务器端程序就可以处理增加的模块。

    VB使用参数计算的方法来进行垃圾收集,这个方法中包含有大量的对象,提供基本的面向对象支持。因为越来越多组建的出现,程序员可以选用自己需要的扩展库。和有些语言不一样,VB对大小写不敏感,但是能自动转换关键词到标准的大小写状态,以及强制使得符号表入口的实体的变量名称遵循书写规则。默认情况下字符串的比较是对大小写敏感的,但是可以关闭这个功能。

    VB使得大量的外界控件有了自己的生存空间。大量的第三方控件针对VB提供。VB也提供了建立、使用和重用这些控件的方法,但是由于语言问题,从一个应用程序创建另外一个并不简单。

    术语

    在讨论Visual Basic时,经常可以听到以下这些术语,因此对这些术语的基本理解十分有帮助。

    控件——简单的说,控件就是构成或者说建造Visual Basic应用程序的图形化工具,包括窗体、按钮、复选框、列表框、数据控件、表格控件和图片控件等等...。
    事件——由用户或操作系统引发的动作。事件的示例有击键、单击鼠标(Click)、双击鼠标(DblClick)、一段时间的*,或从端口接收数据。
    方法——嵌入在对象定义中的程序代码,它定义对象怎样处理信息并响应某事件。例如,数据库对象有打开纪录集并从一个记录移动到另一个记录的方法程序的基本元素,它含有定义其特征的属性,定义其任务和识别它可以响应的事件的方法。控件和窗体是Visual Basic中所有对象的示例。
    对象——一个控件、窗体等都可被看作一个对象。
    过程——为完成某些特定的任务而编写的代码段,过程通常用于响应特定的事件,也可以当作应用程序的用户自定义函数来使用。
    属性——属性是组成用户界面的各对象的性质的具体描述。例如上述“对象”中所提到的尺寸、位置、颜色、宽度、高度等等都称为控件的属性。属性决定对象的外观,有时也决定对象的行为。对象的属性绝大部分是VB中已经事先定义好的,但也有的属性是需要在应用过程中才去定义的。属性即可为对象提供数据,也能从对象取回信息。

    VB的局限性

    继承。VB5和VB6都是面向对象的编程语言,但是不包含继承特性。VB中提供了特殊的类的功能,但是还是不能满足程序员的需求。VB.net 包含了所有面向对象的特性。
    多线程支持 (VB.Net 2002以及之后的版本,都支持多线程技术。)
    异常处理。VB.net中使用了Try-Catch-Finally来处理异常。而VB中只有"On Error Goto line"语句。
    对指针的支持非常有限。
    VB只能支持8到32位的整形,很多语言都有无*的支持。
    VB不允许在任何数组内存在不变的变量。
    VB不支持以上特性,程序员需要自己建构方法来实现相似的功能。

    争议

    反对观点:

    VB是一种充满了争议的语言:很多程序员对VB程序的质量有强烈的感受。很多人认为VB不配他们使用,认为它是一种给儿童和菜鸟程序员的语言。它自从设计开始就是一种简单的语言。一些C++和Java中的特性在VB中并没有出现。在感受开发的方便和快速的同时,一些类似于编译时进行类型和声明检查的功能在默认情况下是关闭的。这样一些程序员一边感叹VB的易用性,一般沮丧地地看着一些类似于“未定义类型”错误的发生。

    一些批评家认为VB的简单特性使得其在未来具有伤害性。很多人自学了VB,但是并没有学到好的编程习惯。当VB进入课堂的时候,学生们不会学到很多基础的程序技术和结构,因为很多技术已经包含在那些对用户可见的组件里面了。不用学习标准的编程习惯,因为VB具有可视化的特性,所以导致了一些莫名其妙的代码的产生。而且很多错误和警告的检查默认情况下都是关闭的,程序员很难找到隐藏的错误。有经验的程序员在用VB编程的时候都会把这些选项打开。

    很多批评家批评微软简单地拷贝了BASIC的思想到VB中。著名的计算机科学家Edsger Dijkstra说过一句名言:“如果一个学生最早学过BASIC,那么几乎不可能让他学会优秀的编程:因为这些人已经放弃了涅磐的希望。” (Dijkstra对待Fortran、PL/1、COBOL和APL同样也毫不留情。)

    另外一个笑话是:“真正的程序员不用BASIC。12岁以下的孩子才用。”

    并不是非常简便,它开发的程序只能运行在Microsoft Windows中。

    个头太大了。Visual Studio要用好几张盘才能装下。VB程序在运行时候还需要一个1.4M大小的运行库。

    IDE中有错误。

    VB不能很好的综合Windows的基础API,很多时候要使用低级运算的“小伎俩”来进行编程。而C语言的低级内存运算比VB的要简单得多。

    支持观点:

    但是很多VB的支持者解释说VB的易用性就是它最大的优势,可以让经验丰富的VB程序员或是刚刚懂得皮毛的人都能用自己的方式快速开发程序。而且 VB的程序可以非常简单的和数据库连接。比如利用控件可以绑定数据库,这样一来用VB写出的程序就可以掌握数据库的所有信息而不用写一行代码。

    很多语言的特性比如GoSub、On Error和用变量名字的最后一个字符判断声明类型(比如字符串型str$)都是从VB中来的。VB的语法和绝大部分语言都不同,可能会让新的程序员混淆。比如声明“Dim a,b,c As Integer”声明了c为整形变量,但是a、b都是Variant类型的。 {这儿我说明一下,如果想申明3个Integer,必须写 Dim a as Integer, b As Integer, c as Integer;而直接写Dim a,后面不写类型,则自动变成Variant类型——占用大量资源。} 还有一些特性,比如下划线字符“_”用于一行代码分多行写时候。一些程序员在使用的时候由于不规范使得便引起报错。

    发展时间线

    1991年4月,Visual Basic 1.0 Windows版本发布
    1992年9月,Visual Basic 1.0 DOS版本发布。
    1992年11月,VB2.0发布。它对于上一个版本的界面和速度都有所改善。
    1993年夏天,VB3.0发布,分为标准版和专业版。其中包含一个数据引擎,可以直接读取Access数据库。
    1995年8月,VB4.0发布了32位版本和16位的版本。其中包含了对类的支持。
    1997年2月,VB5.0发布。程序员可以用32位的版本导入由4.0版本创建的16位程序,并且能顺利编译。同时还包含了对用户自建控件的支持。
    1998年夏天,VB6.0发布。
    2001年,Visual Basic.net和.NET Framework发布。由于其使用了新的核心和特性,所以很多VB的程序员都要改写程序。
    2003年,Visual Basic.net 2003和.NET Framework 1.1发布。
    2004年,微软开放了Visual Studio 2005的测试版本(代号Whidbey)。包含了.NET Framework2.0的测试版本。
    2005年,微软宣布将不会再对非.NET版本的VB进行支持。VB社群立即作出反应表示关心这个消息,一些老用户还递交了希望能够继续对VB进行技术支持的*书。微软目前还不愿意改变他们的决定。

    由VB派生的语言

    微软开发了一系列有关VB的脚本语言:

    Visual Basic for Applications,即VBA,包含在微软的应用程序中(比如Microsoft Office),以及类似WordPerfect Office这样第三方的产品里面。VBA这样嵌入在各种应用程序中看起来有些矛盾,但是它的功能和VB一样强大。

    VBScript是默认的ASP语言,还可以用在Windows脚本编写和网页编码中。尽管它的语法类似于VB,但是它却是一种完全不同的语言。VBS不使用VB运行库运行,而是由Windows脚本主机解释执行。这两种语言之中的不同点影响ASP网站的表现。

    当微软准备开发一种新的编程工具的时候,第一决定就是利用最抢手的VB6来进行旧改,或者就是重新组建工程开发新工具。微软后来开发了VB的继任者Visual Basic .NET,同时也是.NET平台的一部分。VB.net编程语言是一种真正的面向对象编程语言,和VB并不完全兼容。

    关于VB.NET

    Visual Studio.net 2005已经在2005年11月7日发布。
    Visual Basic.NET(简称VB.NET)是新一代的VB。它不是VB 6.0的简单升级,VB.NET与VB之间有非常大的区别。其新特性主要表现在以下几方面:
    1.VB.NET完全集成到Visual Studio集成开发环境中,在这种集成开发环境与VB在若干方面有差异。主要体现在窗体的布局以及菜单等方面都有所不同。
    2.VB.NET项目与VB不同。它使用基于文件夹的模型,所有项目均放置在项目文件夹层次结构中。
    3.VB.NET中使用ADO.NET来访问数据库,ADO.NET是.NET框架的一部分。在VB.NET中实现数据访问的方法重要有两种:其一是在程序设计阶段,通过创建、配置数据适配器DataAdapter和生成数据集DataSet;其二是在运行中,通过编程方式动态创建配置数据适配器和创建、生成数据集。
    4.在VB.NET中是使用ASP.NET技术来编写Web页面的。在ASP.NET中使用的也不是脚本语言,而是真正意义的编程语言。凭借 ASP.NET的Web应用程序、XML Web Services等基于Web的功能,使得VB.NET开发Web页面与开发Windows应用程序很相似,Web页面代码也显得有条有理了。
    5. VB.NET已经成为完全的面向对象的编程语言。

    寻找一个 Microsoft Visual Basic 9.0 中文版

    Visual Basic(VB)是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用 DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。

    发展历史

    1991年,微软公司推出了Visual Basic 1.0版。这在当时引起了很大的轰动。这个连接编程语言和用户界面的进步被称为Tripod(有些时候叫做Ruby),最初的设计是由阿兰·库珀(Alan Cooper)完成的。许多专家把VB的出现当做是软件开发史上的一个具有划时代意义的事件。其实,以我们现在的目光来看,VB1.0的功能实在是太弱了;(不过最近VB6.0, VB.NET的功能相当大!)。但在当时,它是第一个“可视”的编程软件。这使得程序员欣喜之极,都尝试在VB的平台上进行软件创作。微软也不失时机地在四年内接连推出VB2.0,VB3.0,4.0三个版本。并且从VB3开始,微软将ACCESS的数据库驱动集成到了VB中,这使得VB的数据库编程能力大大提高。从VB4开始,VB也引入了面向对象的程序设计思想。VB功能强大,学习简单。而且,VB还引入了“控件”的概念,使得大量已经编好的VB程序可以被我们直接拿来使用。VB1.0的DOS版本VB1.0于1991年发布。这个连接编程语言和用户界面的进步被称为Tripod(有些时候叫做 Ruby),最初的设计是由阿兰·库珀(Alan Cooper)完成的

    2002年Visual Basic .NET 2002 (v7.0)问世,2003年Visual Basic .NET 2003 (v7.1)问世,2005年11月7日Visual Basic 2005 (v8.0)问世,同时间推出Visual Basic 2005的免费简化版本Visual Basic 2005 Express Edition给Visual Basic初学者及学生使用。

    VB 2005的“显著”优点是,可以直接编写出XP风格的按钮,以及其他的控件。但是其编写的小程序占用近10MB的内存。

    通过几年的发展,它已成为一种专业化的开发语言和环境。用户可用Visual Basic快速创建Windows程序,现在还可以编写企业水平的客户端/服务器程序及强大的数据库应用程序。

    VB会吸引更多的赞誉和批评,也会继续为广大的用户和程序员使用。它非常适合用来开发拥有友好界面的程序(比如针对终端的数据),但是不适合开发其它程序(比如联合计算程序)。

    语言特性

    一个典型的VB进程VB的中心思想就是要便于程序员使用,无论是新手或者专家。VB使用了可以简单建立应用程序的GUI系统,但是又可以开发相当复杂的程序。VB的程序是一种基于窗体的可视化组件安排的联合,并且增加代码来指定组建的属性和方法。因为默认的属性和方法已经有一部分定义在了组件内,所以程序员不用写多少代码就可以完成一个简单的程序。过去的版本里面VB程序的性能问题一直被放在了桌面上,但是随着计算机速度的飞速增加,关于性能的争论已经越来越少。

    窗体控件的增加和改变可以用拖放技术实现。一个排列满控件的工具箱用来显示可用控件(比如文本框或者按钮]]。每个控件都有自己的属性和事件。默认的属性值会在控件创建的时候提供,但是程序员也可以进行更改。很多的属性值可以在运行时候随着用户的动作和修改进行改动,这样就形成了一个动态的程序。举个例子来说:窗体的大小改变事件中加入了可以改变控件位置的代码,在运行时候每当用户更改窗口大小,控件也会随之改变位置。在文本框中的文字改变事件中加入相应的代码,程序就能够在文字输入的时候自动翻译或者阻止某些字符的输入。

    VB的程序可以包含一个或多个窗体,或者是一个主窗体和多个子窗体,类似于操作系统的样子。有很少功能的对话框窗口(比如没有最大化和最小化按钮的窗体)可以用来提供弹出功能。

    VB的组件既可以拥有用户界面,也可以没有。这样一来服务器端程序就可以处理增加的模块。

    VB使用参数计算的方法来进行垃圾收集,这个方法中包含有大量的对象,提供基本的面向对象支持。因为越来越多组建的出现,程序员可以选用自己需要的扩展库。和有些语言不一样,VB对大小写不敏感,但是能自动转换关键词到标准的大小写状态,以及强制使得符号表入口的实体的变量名称遵循书写规则。默认情况下字符串的比较是对大小写敏感的,但是可以关闭这个功能。

    VB使得大量的外界控件有了自己的生存空间。大量的第三方控件针对VB提供。VB也提供了建立、使用和重用这些控件的方法,但是由于语言问题,从一个应用程序创建另外一个并不简单。

    术语

    在讨论Visual Basic时,经常可以听到以下这些术语,因此对这些术语的基本理解十分有帮助。

    控件——简单的说,控件就是构成或者说建造Visual Basic应用程序的图形化工具,包括窗体、按钮、复选框、列表框、数据控件、表格控件和图片控件等等...。
    事件——由用户或操作系统引发的动作。事件的示例有击键、单击鼠标(Click)、双击鼠标(DblClick)、一段时间的*,或从端口接收数据。
    方法——嵌入在对象定义中的程序代码,它定义对象怎样处理信息并响应某事件。例如,数据库对象有打开纪录集并从一个记录移动到另一个记录的方法程序的基本元素,它含有定义其特征的属性,定义其任务和识别它可以响应的事件的方法。控件和窗体是Visual Basic中所有对象的示例。
    对象——一个控件、窗体等都可被看作一个对象。
    过程——为完成某些特定的任务而编写的代码段,过程通常用于响应特定的事件,也可以当作应用程序的用户自定义函数来使用。
    属性——属性是组成用户界面的各对象的性质的具体描述。例如上述“对象”中所提到的尺寸、位置、颜色、宽度、高度等等都称为控件的属性。属性决定对象的外观,有时也决定对象的行为。对象的属性绝大部分是VB中已经事先定义好的,但也有的属性是需要在应用过程中才去定义的。属性即可为对象提供数据,也能从对象取回信息。

    VB的局限性

    继承。VB5和VB6都是面向对象的编程语言,但是不包含继承特性。VB中提供了特殊的类的功能,但是还是不能满足程序员的需求。VB.net 包含了所有面向对象的特性。
    多线程支持 (VB.Net 2002以及之后的版本,都支持多线程技术。)
    异常处理。VB.net中使用了Try-Catch-Finally来处理异常。而VB中只有"On Error Goto line"语句。
    对指针的支持非常有限。
    VB只能支持8到32位的整形,很多语言都有无*的支持。
    VB不允许在任何数组内存在不变的变量。
    VB不支持以上特性,程序员需要自己建构方法来实现相似的功能。

    争议

    反对观点:

    VB是一种充满了争议的语言:很多程序员对VB程序的质量有强烈的感受。很多人认为VB不配他们使用,认为它是一种给儿童和菜鸟程序员的语言。它自从设计开始就是一种简单的语言。一些C++和Java中的特性在VB中并没有出现。在感受开发的方便和快速的同时,一些类似于编译时进行类型和声明检查的功能在默认情况下是关闭的。这样一些程序员一边感叹VB的易用性,一般沮丧地地看着一些类似于“未定义类型”错误的发生。

    一些批评家认为VB的简单特性使得其在未来具有伤害性。很多人自学了VB,但是并没有学到好的编程习惯。当VB进入课堂的时候,学生们不会学到很多基础的程序技术和结构,因为很多技术已经包含在那些对用户可见的组件里面了。不用学习标准的编程习惯,因为VB具有可视化的特性,所以导致了一些莫名其妙的代码的产生。而且很多错误和警告的检查默认情况下都是关闭的,程序员很难找到隐藏的错误。有经验的程序员在用VB编程的时候都会把这些选项打开。

    很多批评家批评微软简单地拷贝了BASIC的思想到VB中。著名的计算机科学家Edsger Dijkstra说过一句名言:“如果一个学生最早学过BASIC,那么几乎不可能让他学会优秀的编程:因为这些人已经放弃了涅磐的希望。” (Dijkstra对待Fortran、PL/1、COBOL和APL同样也毫不留情。)

    另外一个笑话是:“真正的程序员不用BASIC。12岁以下的孩子才用。”

    并不是非常简便,它开发的程序只能运行在Microsoft Windows中。

    个头太大了。Visual Studio要用好几张盘才能装下。VB程序在运行时候还需要一个1.4M大小的运行库。

    IDE中有错误。

    VB不能很好的综合Windows的基础API,很多时候要使用低级运算的“小伎俩”来进行编程。而C语言的低级内存运算比VB的要简单得多。

    支持观点:

    但是很多VB的支持者解释说VB的易用性就是它最大的优势,可以让经验丰富的VB程序员或是刚刚懂得皮毛的人都能用自己的方式快速开发程序。而且 VB的程序可以非常简单的和数据库连接。比如利用控件可以绑定数据库,这样一来用VB写出的程序就可以掌握数据库的所有信息而不用写一行代码。

    很多语言的特性比如GoSub、On Error和用变量名字的最后一个字符判断声明类型(比如字符串型str$)都是从VB中来的。VB的语法和绝大部分语言都不同,可能会让新的程序员混淆。比如声明“Dim a,b,c As Integer”声明了c为整形变量,但是a、b都是Variant类型的。 {这儿我说明一下,如果想申明3个Integer,必须写 Dim a as Integer, b As Integer, c as Integer;而直接写Dim a,后面不写类型,则自动变成Variant类型——占用大量资源。} 还有一些特性,比如下划线字符“_”用于一行代码分多行写时候。一些程序员在使用的时候由于不规范使得便引起报错。

    发展时间线

    1991年4月,Visual Basic 1.0 Windows版本发布
    1992年9月,Visual Basic 1.0 DOS版本发布。
    1992年11月,VB2.0发布。它对于上一个版本的界面和速度都有所改善。
    1993年夏天,VB3.0发布,分为标准版和专业版。其中包含一个数据引擎,可以直接读取Access数据库。
    1995年8月,VB4.0发布了32位版本和16位的版本。其中包含了对类的支持。
    1997年2月,VB5.0发布。程序员可以用32位的版本导入由4.0版本创建的16位程序,并且能顺利编译。同时还包含了对用户自建控件的支持。
    1998年夏天,VB6.0发布。
    2001年,Visual Basic.net和.NET Framework发布。由于其使用了新的核心和特性,所以很多VB的程序员都要改写程序。
    2003年,Visual Basic.net 2003和.NET Framework 1.1发布。
    2004年,微软开放了Visual Studio 2005的测试版本(代号Whidbey)。包含了.NET Framework2.0的测试版本。
    2005年,微软宣布将不会再对非.NET版本的VB进行支持。VB社群立即作出反应表示关心这个消息,一些老用户还递交了希望能够继续对VB进行技术支持的*书。微软目前还不愿意改变他们的决定。

    由VB派生的语言

    微软开发了一系列有关VB的脚本语言:

    Visual Basic for Applications,即VBA,包含在微软的应用程序中(比如Microsoft Office),以及类似WordPerfect Office这样第三方的产品里面。VBA这样嵌入在各种应用程序中看起来有些矛盾,但是它的功能和VB一样强大。

    VBScript是默认的ASP语言,还可以用在Windows脚本编写和网页编码中。尽管它的语法类似于VB,但是它却是一种完全不同的语言。VBS不使用VB运行库运行,而是由Windows脚本主机解释执行。这两种语言之中的不同点影响ASP网站的表现。

    当微软准备开发一种新的编程工具的时候,第一决定就是利用最抢手的VB6来进行旧改,或者就是重新组建工程开发新工具。微软后来开发了VB的继任者Visual Basic .NET,同时也是.NET平台的一部分。VB.net编程语言是一种真正的面向对象编程语言,和VB并不完全兼容。

    关于VB.NET

    Visual Studio.net 2005已经在2005年11月7日发布。
    Visual Basic.NET(简称VB.NET)是新一代的VB。它不是VB 6.0的简单升级,VB.NET与VB之间有非常大的区别。其新特性主要表现在以下几方面:
    1.VB.NET完全集成到Visual Studio集成开发环境中,在这种集成开发环境与VB在若干方面有差异。主要体现在窗体的布局以及菜单等方面都有所不同。
    2.VB.NET项目与VB不同。它使用基于文件夹的模型,所有项目均放置在项目文件夹层次结构中。
    3.VB.NET中使用ADO.NET来访问数据库,ADO.NET是.NET框架的一部分。在VB.NET中实现数据访问的方法重要有两种:其一是在程序设计阶段,通过创建、配置数据适配器DataAdapter和生成数据集DataSet;其二是在运行中,通过编程方式动态创建配置数据适配器和创建、生成数据集。
    4.在VB.NET中是使用ASP.NET技术来编写Web页面的。在ASP.NET中使用的也不是脚本语言,而是真正意义的编程语言。凭借 ASP.NET的Web应用程序、XML Web Services等基于Web的功能,使得VB.NET开发Web页面与开发Windows应用程序很相似,Web页面代码也显得有条有理了。
    5. VB.NET已经成为完全的面向对象的编程语言。

    get microsoft silverlight什么意思

    silverlight
    开放分类: 微软、媒体、平台、方案、新进展

    SilverLight
    是微软最新推出的跨浏览器、跨平台的解决方案。
    主要有以下特点:

    1. 在Web上提供丰富的用户体验

    * 空前的富媒体体验以及网络应用

    * 强大的基于向量的图形

    * 无敌的从Mobile到HD质量的视频以及音频

    * 在有硬件加速支持下,最高达15倍的视频编码速度

    * 移动设备支持

    2. 快速,更具生产力的开发

    * 集成现有的网络开发技术及资源

    * Web以及桌面一致的表现层,保证了开发的低成本性

    * 基于标准的可验证的开发技术

    * 为开发人员以及设计人员提供了广泛的工具支持,并且建立了相应的开发设计生态圈

    3. 快速部署

    * 简单按需安装的SilverLight浏览器插件

    * 灵活的基于视频及动画的广告嵌入方案

    * 低成本的流媒体解决方案,基于荣获艾美奖荣誉的Windows Media技术

    * 内容访问保护技术

    * 在Microsoft Expression Media Encoder的支持下,加速编码并且发布基于视频的体验

    开发工具:

    可以使用已经具有的技能和熟悉的工具来创建基于Silverlight的应用程序,在Web页面中,既可以使用HTML,也可以使用Silverlight的WPF元素,和HTML一样,在Web应用程序中XAML同样可以使用声明的标记来创建用户界面,不同的是,XAML提供了更强大的元素。

    可以使用强大的Visual Studio codename "Orcas" Beta1创建Silverlight应用。(Silverlight在编号为“Orcas”Visual Studio Beta1的IDE中作为一个插件而得到支持。)同样Visual Studio为Silverlight提供了开发工具,比如.NET Framework中已经为创建应用程序提供的强大的编辑器、项目管理、调试等等。

    设计人员可以轻松的拥有使用Expression Studio进行设计、编译和发布Silverlight应用程序。Expression Studio有创建图像、媒体,设计交互和产生体验需要的一切能力。Expression Blend能够生成XAML进行输出,这样使用Visual Studio的程序员和使用Expression Blend的设计人员可以共享同样的文件。

    Flash将会失去垄断地位,互联网将会变得越来越精彩!

    silverlight官方网站:http://www.microsoft.com/silverlight
    微软SilverLight是一个跨浏览器、跨客户平台的技术,能够设计、开发和发布有多媒体体验与富交互(RIA,Rich Interface Application)的网络交互程序。
    因为SilverLight提供了一个强大的平台,能够开发出具有专业图形、音频和视频的Web应用程序,增强了用户体验,所以SilverLight吸引了设计人员和开发人员的眼球。同时,SilverLight还提供了强大的工具来提高他们的工作效率。
    SilverLight能创建一种具有很高艺术性的应用程序,具有以下的特点:
    ◆一种跨浏览器、跨平台的技术。可以在所有流行的浏览器中运行,包括Microsoft Interner Explorer、Mozilla Firefox, Apple Safari, 和Opera,同样可以运行于Microsoft Windows和Apple Mac OS X。
    ◆无论在哪运行,都能提供一致的用户体验。
    ◆需要下载很小的文件来安装以支持,只需几秒。
    ◆它的视频和音频流,视频质量无论从移动设备还是桌面浏览器都是720p HDTV video模式。
    ◆用户可在浏览器中直接对其进行控制,可以拖动、翻转、放大的图片。
    ◆它读取数据并且更新外观,但不会通过刷新整体页面来打断用户操作。
    SilverLight将多种技术结合到一个开发平台,可以在其中选择符合需求的合适的工具和编程语言。SilverLight提供了如下的特性:
    ◆WPF和XAML。SilverLight包含了Windows Presentation Foundation(WPF)技术,这个技术在创建用户界面时极大的扩展了浏览器元素。WPF可以创建融合图形、动画、媒体和其他的富客户端特性,扩展了基于浏览器的用户界面,超越了HTML所提供的。可扩展应用程序标记语言(XMAL)提供了创建WPF元素的声明性标记。
    ◆对于JavaScript的扩展。SilverLight提供了对于全球浏览器脚本语言的扩展,从而为浏览器用户界面提供更加强大的控件,包括与WPF元素工作的能力。
    ◆跨浏览器,跨平台的支持。SilverLight在所有的流行浏览器(任何平台)运行一致。设计和开发应用程序不需要担心你的用户是什么平台什么浏览器。
    ◆与现存应用程序的集成。SilverLight可以与已经存在的JavaScript和ASP.NET AJAX代码无缝集成,不会使已经创建的功能缺失。
    ◆可访问.NET Framework编程模型和相关工具。可以使用托管的Jscrit和IronPython或者C#和VB这样的动态语言来创建基于SilverLight的应用程序。可以使用Visual Studio这样的开发工具来创建基于SilverLight的应用程序。
    ◆LINQ。SilverLight包含集成查询(LINQ)语言。
    ◆如果已经使用ASP.NET,可以将SilverLight集成到熟悉的ASP.NET服务器和客户端功能。可以在ASP.NET中创建基于服务器的资源,使用ASP.NET的AJAX特性与服务器端资源交互而不会打断用户。
    开发工具:
    可以使用已经具有的技能和熟悉的工具来创建基于Silverlight的应用程序,在Web页面中,既可以使用HTML,也可以使用Silverlight的WPF元素,和HTML一样,在Web应用程序中XAML同样可以使用声明的标记来创建用户界面,不同的是,XAML提供了更强大的元素。
    可以使用强大的Visual Studio codename "Orcas" Beta1创建Silverlight应用。(Silverlight在编号为“Orcas”Visual Studio Beta1的IDE中作为一个插件而得到支持。)同样Visual Studio为Silverlight提供了开发工具,比如.NET Framework中已经为创建应用程序提供的强大的编辑器、项目管理、调试等等。
    设计人员可以轻松的拥有使用Expression Studio进行设计、编译和发布Silverlight应用程序。Expression Studio有创建图像、媒体,设计交互和产生体验需要的一切能力。Expression Blend能够生成XAML进行输出,这样使用Visual Studio的程序员和使用Expression Blend的设计人员可以共享同样的文件。

    get microsoft silverlight什么意思

    silverlight
    开放分类: 微软、媒体、平台、方案、新进展

    SilverLight
    是微软最新推出的跨浏览器、跨平台的解决方案。
    主要有以下特点:

    1. 在Web上提供丰富的用户体验

    * 空前的富媒体体验以及网络应用

    * 强大的基于向量的图形

    * 无敌的从Mobile到HD质量的视频以及音频

    * 在有硬件加速支持下,最高达15倍的视频编码速度

    * 移动设备支持

    2. 快速,更具生产力的开发

    * 集成现有的网络开发技术及资源

    * Web以及桌面一致的表现层,保证了开发的低成本性

    * 基于标准的可验证的开发技术

    * 为开发人员以及设计人员提供了广泛的工具支持,并且建立了相应的开发设计生态圈

    3. 快速部署

    * 简单按需安装的SilverLight浏览器插件

    * 灵活的基于视频及动画的广告嵌入方案

    * 低成本的流媒体解决方案,基于荣获艾美奖荣誉的Windows Media技术

    * 内容访问保护技术

    * 在Microsoft Expression Media Encoder的支持下,加速编码并且发布基于视频的体验

    开发工具:

    可以使用已经具有的技能和熟悉的工具来创建基于Silverlight的应用程序,在Web页面中,既可以使用HTML,也可以使用Silverlight的WPF元素,和HTML一样,在Web应用程序中XAML同样可以使用声明的标记来创建用户界面,不同的是,XAML提供了更强大的元素。

    可以使用强大的Visual Studio codename "Orcas" Beta1创建Silverlight应用。(Silverlight在编号为“Orcas”Visual Studio Beta1的IDE中作为一个插件而得到支持。)同样Visual Studio为Silverlight提供了开发工具,比如.NET Framework中已经为创建应用程序提供的强大的编辑器、项目管理、调试等等。

    设计人员可以轻松的拥有使用Expression Studio进行设计、编译和发布Silverlight应用程序。Expression Studio有创建图像、媒体,设计交互和产生体验需要的一切能力。Expression Blend能够生成XAML进行输出,这样使用Visual Studio的程序员和使用Expression Blend的设计人员可以共享同样的文件。

    Flash将会失去垄断地位,互联网将会变得越来越精彩!

    silverlight官方网站:http://www.microsoft.com/silverlight
    微软SilverLight是一个跨浏览器、跨客户平台的技术,能够设计、开发和发布有多媒体体验与富交互(RIA,Rich Interface Application)的网络交互程序。
    因为SilverLight提供了一个强大的平台,能够开发出具有专业图形、音频和视频的Web应用程序,增强了用户体验,所以SilverLight吸引了设计人员和开发人员的眼球。同时,SilverLight还提供了强大的工具来提高他们的工作效率。
    SilverLight能创建一种具有很高艺术性的应用程序,具有以下的特点:
    ◆一种跨浏览器、跨平台的技术。可以在所有流行的浏览器中运行,包括Microsoft Interner Explorer、Mozilla Firefox, Apple Safari, 和Opera,同样可以运行于Microsoft Windows和Apple Mac OS X。
    ◆无论在哪运行,都能提供一致的用户体验。
    ◆需要下载很小的文件来安装以支持,只需几秒。
    ◆它的视频和音频流,视频质量无论从移动设备还是桌面浏览器都是720p HDTV video模式。
    ◆用户可在浏览器中直接对其进行控制,可以拖动、翻转、放大的图片。
    ◆它读取数据并且更新外观,但不会通过刷新整体页面来打断用户操作。
    SilverLight将多种技术结合到一个开发平台,可以在其中选择符合需求的合适的工具和编程语言。SilverLight提供了如下的特性:
    ◆WPF和XAML。SilverLight包含了Windows Presentation Foundation(WPF)技术,这个技术在创建用户界面时极大的扩展了浏览器元素。WPF可以创建融合图形、动画、媒体和其他的富客户端特性,扩展了基于浏览器的用户界面,超越了HTML所提供的。可扩展应用程序标记语言(XMAL)提供了创建WPF元素的声明性标记。
    ◆对于JavaScript的扩展。SilverLight提供了对于全球浏览器脚本语言的扩展,从而为浏览器用户界面提供更加强大的控件,包括与WPF元素工作的能力。
    ◆跨浏览器,跨平台的支持。SilverLight在所有的流行浏览器(任何平台)运行一致。设计和开发应用程序不需要担心你的用户是什么平台什么浏览器。
    ◆与现存应用程序的集成。SilverLight可以与已经存在的JavaScript和ASP.NET AJAX代码无缝集成,不会使已经创建的功能缺失。
    ◆可访问.NET Framework编程模型和相关工具。可以使用托管的Jscrit和IronPython或者C#和VB这样的动态语言来创建基于SilverLight的应用程序。可以使用Visual Studio这样的开发工具来创建基于SilverLight的应用程序。
    ◆LINQ。SilverLight包含集成查询(LINQ)语言。
    ◆如果已经使用ASP.NET,可以将SilverLight集成到熟悉的ASP.NET服务器和客户端功能。可以在ASP.NET中创建基于服务器的资源,使用ASP.NET的AJAX特性与服务器端资源交互而不会打断用户。
    开发工具:
    可以使用已经具有的技能和熟悉的工具来创建基于Silverlight的应用程序,在Web页面中,既可以使用HTML,也可以使用Silverlight的WPF元素,和HTML一样,在Web应用程序中XAML同样可以使用声明的标记来创建用户界面,不同的是,XAML提供了更强大的元素。
    可以使用强大的Visual Studio codename "Orcas" Beta1创建Silverlight应用。(Silverlight在编号为“Orcas”Visual Studio Beta1的IDE中作为一个插件而得到支持。)同样Visual Studio为Silverlight提供了开发工具,比如.NET Framework中已经为创建应用程序提供的强大的编辑器、项目管理、调试等等。
    设计人员可以轻松的拥有使用Expression Studio进行设计、编译和发布Silverlight应用程序。Expression Studio有创建图像、媒体,设计交互和产生体验需要的一切能力。Expression Blend能够生成XAML进行输出,这样使用Visual Studio的程序员和使用Expression Blend的设计人员可以共享同样的文件。

    C#什么意思?

    C#(读做 "C sharp",中文译音“夏普”)是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角.

    在本文中,我将考察创建一种新计算机语言的一般动机,并将特别指明是什么原因导致了C#的出现.然后我将介绍C#和它与Java,c,c++的相似之处.其次我将讨论一些存在于Java和C#之间的高层次的,和基础的差别.我将以衡量在用多种语言开发大型应用程序的时候所需的知识(或者对这种知识的缺乏程度)来结束本文,而这正是.NET和C#的一个主要战略.目前,C#和.NET还只能以C#语言规则,以及Windows 2000的一个"d预览版本",还有MSDN上迅速增多的文档集子的形式获得(还没有最终定型).

    微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说struts),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java.C#还需要进化成一种开发者能够接受和采用的语言.而微软当前为它的这种新语言大造声势也是值得注意的.目前大家的反应是:"这是对Java的反击."

    C#更象Java一些,虽然微软在这个问题上保持沉默.这也是意料中的事情,我觉得,因为Java近来很成功而使用Java的公司都报告说它们在生产效率上比C++获得了提高.

    Java所带来的巨大影响和大家对它的广泛接受已经由工作于这种语言和平台之上的程序员数量明显的说明了(估计世界范围内共有两百五十万程序员使用Java).由这种语言写成的应用程序的数量是令人惊讶的并已经渗透了每一个级别的计算,包括无线计算和移动电话(比如日本发明的Java电话).C#能够在用户领域获得这样的礼遇吗?我们必须等待并观望,就象已经由SSI公司的CEO和Kalpathi S. Suresh指出来的那样,"我发现所有这些都是渐进的.如果C#不存在,我们总能回到Java或C和C++.这些都不完全是新技术;它们在更大的意义上来说只是大公司制造的市场噱头.我们必须给他们时间安顿下来看看这些是不是真的对IT工业有什么影响."

    C#从Java继承而来的特点

    类:在C#中类的申明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好.Java的关键字import已经被替换成using,它起到了同样的作用.一个类开始执行的起点是静态方法Main().下面的Hello World程序展示了基本的形式:

    using System;

    class Hello

    {

    static void Main()

    {

    Console.WriteLine("Hello, world");

    }

    }

    在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(namespace).这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:一个被申明成abstract的类不能被实例化;它只能被用做一个基类.C#关键字sealed就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.界面:就象在Java中一样,一个界面是一组方法集合的抽象定义.当一个类或结构体实现一个界面的时候,它必须实现这个界面中定义的所有方法.一个单一的类可以实现几个界面.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层.NET框架进行自动内存垃圾回收.

    C#从C和C++继承的特点

    编译:程序直接编译成标准的二进制可执行形式.但C#的源程序并不是被编译成二进制可执行形式,而是一中中间语言,类似于JAVA字节码。如果前面的Hello World程序被保存成一个文本文件并被命名为Hello.cs,它将被编译成命名Hello.exe的可执行程序.

    结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据声明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面.

    预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有:

    #define

    #undef

    #if

    #elif

    #else

    #endif

    #warning

    #error

    #line []

    没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名.

    操作符重载:一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被被重载的单目操作符是:

    + - ! ~ ++ -- true false

    能够被重载的二元运算符是:

    + - * / % & | ^ << >> == != > < >= <=

    C#独有的特点

    C#最引人入胜的地方是它和Java的不同,而不是相似的地方.这一节(和这个系列第二部分的大部分地方)讲述了C#实现的和Java不同的地方或者Java根本没有的特点.

    中间代码:微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码.当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得Java和C#在性能上相对相同.象"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧.Java的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码.

    命名空间中的申明:当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容.

    基本的数据类型:C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字.

    两个基本类:一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它.

    参数传递:方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值.

    与COM的集成:C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET语言子类化.

    索引下标:一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的.

    public class ListBox: Control

    {

    private string[] items;

    public string this[int index]

    {

    get

    {

    return items[index];

    }

    set

    {

    items[index] = value;

    Repaint();

    }

    }

    }

    可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样:

    ListBox listBox = ...;

    listBox[0] = "hello";

    Console.WriteLine(listBox[0]);

    代理和反馈:一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明.

    补充:

    C#简史——摘自《程序员》杂志2005-12月刊

    C# 简史

    编者按:时间过得真快,居然现在就可以写C#的简史了。但是想想也不奇怪,C#可谓

    起点高、发展快的新一代语言,它的这五年走过了很多前辈十几年的路。公允地说,C#是目

    前兼顾系统开发和应用开发的最佳实用语言,并且很有可能成为编程语言历史上的第一个“全

    能”型语言。看过这篇简史,我们都应该明白,不要再把C#看成年轻后生了——只要是“马

    拉多纳”,就早晚当“球王”。

    C# 1.0,纯粹的面向对象

    当时间回溯到1998年底,微软正在忙于新一代COM的设计工作。此前,COM一直是组件化开发中非常成功的一种技术;但由于它仅提供了二进制层面上的统一,因此无法将类型信息和用于支持基础平台和开发工具的信息放到组件中。这时,Java正在逐步走向成熟。于是,微软学习Java

    的做法,将虚拟机的概念引入到了COM领域;同时,微软提出了“元数据”的概念,用于描述组件的类型信息和工具支持信息,并决定将其放入到组件当中。这种“COM虚拟机”的名字在经历了若干争论后,最终被定为CLR(Common Language Runtime,公共语言运行时)。与此同时,微

    软提出了在该运行时上运作的语言应该遵循的一些规则,以及该虚拟机的类型系统和指令集——所有这些规范形成了最终的C L I(Common Language Infrastructure,公共语言基础设施),并提交给了ECMA委员会。同时,微软开发了CLI的一个实现,这就是大名鼎鼎的.NET了。

    1998年12月,微软启动了一个全新的语言项目——COOL,这是一款专门为CLR设计的纯面向对象的语言,也正是本文的主角——C#的前身。历时

    半年有余,1999年7月份,微软完成了COOL语言的一个内部版本。直到2000年2月份,微软才正式将COOL语言更名为C#。据说起这个名字是因为C#开发小组的人很讨厌搜索引擎,因此把大部分搜索引擎无法识别的“#” 字符作为该语言名字的一部分;还有一种说法是在音乐当中“#”是升调记号,表达了微软希望它在C的基础上更上一层楼的美好愿望——当然这些都只是传说,无从考证。又是历经了一系列的修改,微软终于在

    2000年7月发布了C#语言的第一个预览版。因此人们一般认为C#是2000年发布的,并以此来计算它的“年龄”。在此后的一年多时间里,微软一直在修补各个测试版本中的BUG。直到2002年2月,微软终于推出了迟迟未上市的Visual Studio 7.0,并将其定名为“VisualStudio .NET 2002”。随着这套开发环境的出炉,开发者们终于看到了C#语言的第一个正式版本——C# 1.0。此后,微软马不停蹄,Visual Studio也恢复了往日

    的开发进度。在2003年5月,微软如期推出了Visual Studio .NET 2003,同时也发布了C#的改进版本——C# 1.1。这一时期的C#(以下称为C# 1.x)提出了纯粹的面向对象概念,并在语言特性中展现得淋漓尽致。C++并非纯面向对象的,为了和C兼容以及提供更高的执行效率,它保留了很多模块化的东西。Java尽管号称是面向对象的,但实际上,对于对象所应该具备的三种构成结构——属性、方法和事件,Java仅提供了方法,其它两种结构都要通过方法来模拟。在C# 1.x中,所有面向对象的概念都在语言中得到了非常好的体现。同时,C#还通过类类型、值类型和

    接口类型的概念形成了统一的类型系统。C#使用了大家所熟知的语法实现了方法,以至于很多人认为C#和Java、C++等面向对象语言“非常相像”,这使得从使用其他面向对象语言转到使用C#的过程非常简单。此外,C#还通过无参数列表的方法声名语法,结合get/set访问器实现了优雅的属性语法。其中的get访问器相当于获取属性值的方法,可以通过一些运算返回最终的结果,而不是简单地返回一个变量的值;而set访问器相当于设置属性值的方法,在其中可以进行一系列检测,最后将属性值赋给相应的变量。同时,通过同时提供get和set访问器、只提供get访问器和只提供set访问器,还可以很方便地实现可写、只读和只写的属性。C#的这种属性语法,使得一个属性在提供该属性的类的内部看来,非常像一组方法;而对于外部调用类看来,访问一个对象的属性和访问它的公共域没有任何区别。通过委托(稍后介绍),结合关键字event,C#提供了优雅的事件概念。使用+=运算符,开发者可以非常方便地将一个事件处理器关联到一个事件上,这个过程称之为“订阅”一个事件。由于委托内部封装了一个调用链表,因此可以方便地为一个事件添加多个事件处理器,这些处理器会自动地依次调用。多年的开发语言进化证明,函数指针是非常重要也是非常危险的语言特征之一。同时,基于函数指针的回调机制也Windows 核心概念之一。然而,由于函数指针很难验证参数的类型准确性,因此C#(确切地说是CLI)提出了“委托”的概念,这是一种类型安全的函数指针链表。这意味着,C#不仅可以提供回调机制,同时调用回调的一方还无需在其内部维护函数指针列表,所要做的仅仅是声名一个具有恰当委托类型的公共成员即可;而提供回调的一方也只需通过构造一个带有指定方法的相应委托实例,并通过“+=”运算符添加到回调列表即可。

    尽管C# 1.x提供了如此多的新鲜概念,但实际上,这些概念都是由CLI提出的。因此当将一个C#源程序编译为可执行文件时,编译器做的工作相对而言并不多。需要编译器代劳的是要将一个简单的委托定义语句翻译为一个继承System.MulticastDelegate类型定义。

    C# 2.0,泛型编程新概念

    微软本打算继续保证开发进度,并在2004年推出Visual Studio .NET 2004,但由于其间软件工程学尤其是软件管理学的大规模进步,微软所提供的这种仅具备开发和调试功能的IDE已经无法满足团队开发的需求。因此微软决定在项目设计和管理工具方面进行了进一步研发,并将其集成到Visual Studio中,以赢回原有的市场。因此,微软将Visual Studio.NET 2004“改名”为Visual Studio 2005,并决定推迟一年发布。不过,微软还是坚持在2004年的6月份发布了Visual Studio2005的第一个Beta 版,同时向开发者展示了C#语言的2.0版本。2005年4月,微软发布了

    Visual Studio 2005 Beta2,这已经是具备了几乎全部功能的VisualStudio,包括的产品有SQL Server2005、Team Foundation Server和TeamSuite。这时的C#编译器已经能够处理C# 2.0中所有的新特性。C# 2.0为开发者带来的最主要的特性就是泛型编程能力。和面向对象思想一样,泛型思想也是一种已经成熟的编程思想,但依然是没有哪一种主流开发语言能够支持完备的泛型概念。这主要是因为泛型的概念在一定程度上对面向对象概念进行冲击,同时,由于在编译期间对类型参数的完全检测很难做到,很多问题会被遗留到运行时。C# 2.0别出心裁,对泛

    型类型参数提出了“约束”的新概念,并以优雅的语法体现在语言之中。有了约束,结合编译器强大的类型推断能力,可以在编译时发现几乎所有“危险”的泛型应用。C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名方法结合泛型编程实现了函数式编程中的重要结构—— Lambda 表达式。尽管这种实现显得很繁琐而且不易理解,但毕竟是实现了。最终,函数式编程还是被引入到了C#语言中,这将在下一节中为大家讲述。

    此外,C# 2.0还进一步增强了语言的表达能力。在C# 2.0中,属性语法中的get和set访问器可以拥有不同的权限,这就使得定义一个在库的内部可读写,而在库的外部只读的属性成为可能。同时,C# 2.0还提供了迭代器的概念,这使得一个类无需实现IEnumerator 和IEnumerable接口即可实现一个可以进行遍历的类型,并且无需在类型中维护迭代状态。此时的.NET已经得到了很广泛的认可,并且因为元数据为组件带来了强大的自我描述能力,许多程序库厂商被吸引到.NET平台上来。随着.NET程序库数量的增长,逐渐暴露了命名的问题。在面向对象技术广泛发展

    后,人们就意识到名字的管理问题,因此几乎所有的面向对象语言都提出了“命名空间”的概念;

    而在C# 1.x时代,这个问题再一次出现。如果一个库厂商XX 希望以XX.System来命名他们自己的系统基础库,那么当开发者使用using System语句时就会产生歧义。为此。C# 2.0中提供了global关键字,这为.NET库中所有的命名空间提供了一个“根”,通过指定global::System和global::XX.System就可以区别两个库了。这一时期的C#编译器变得非常复杂,泛型的引入使得编译器不得不具备超强的类型推断能力。同时,迭代器的思想并非是在CLI层面上实现的,而是由编译器自动生成了实现I E n u m e r a t o r 和IEnumerable接口类型。C# 3.0,魔鬼在经历了一系列的改进和完善后,微软决定于2005年11月发布Visual Studio2005,该开发环境将正式支持C#2.0。由于此推出了数个预览版和测试版,大家的期待之情似乎已经不是那么强烈了。而2005年9 月份的PDC大会则为开发者们带来了另外的惊喜——C#3.0(研发代号“Orcas”——魔鬼)的技术预览版。

    说到C# 3.0,就不得不提一下微软的LINQ 项目,LINQ(语言集成查询,Language Integrated Query)提出了一种通过面向对象语法来实现对非面向对象数据源的查询技术,可查询的数据源从关系型数据库延伸到一般意义上的集合(如数组和列表)以及XML。而C# 3.0则是率先实现了LINQ的语言。在C# 3.0中,我们可以用类似于SQL语句的语法从一个数据源中轻松地得到满足一定条件的对象集合。例如要查找一个字符串

    数组names中所有长度大于5的字符串,就可以写: var longname = from n in names wheren.Length > 5 select n;这样我们就得到一个新的字符数组longname,其中包含了我们所需要的结果。这种语句称作查询语句,与SQL语句唯一的区别是C#中的查询语句往往把select子句放到最后(这反而倒有些类似于中文的阅读顺序了)。初次看到这样一个语句,我们可能会有很大疑问:这还是C#语言吗?这的确是合乎语法规则的C#代码,而且编译器可以识别这种语法。然而实际上,C#编译器并不会对这种语法进行实际的的编译,而是将其翻译为正常的方法调用:

    var longname = names.Where(n => n.

    Length > 5).Select(n);然后再进行进一步的编译。在上面的例子中已经说明,names是一个存放有字符串的数组,而数组类型并没有Where的方法。的确,Where并非names的成员方法,微软也没有对数组类型进行任何改动。这是C# 3.0中另外一个重要的新特性:扩展方法。扩展方法是定义在其他静态类中的静态方法,其第一个参数的类型就是希望扩展的类型,并且这个参数被冠以this修饰符。扩展方法是静态的,但可以像调用被扩展类型的实例方法那样进行调用,看起来好像是被扩展类型自己的方法一样。这就为语言带来了很大的灵活性,我们可以将一组近似的功能如上面的Where 和Select等(这在LINQ中被称作“标准查询表达式”)定义在一个外部类中,这样既无须修改现有类型,又可以将功能组织在一起。当然,为了做到面向对象的封装性,扩展方法只能在被扩展类型的公共成员上进行操作,如果需要从内部对类型进行改进,就必须改变现有类型的代码。在Where方法的参数列表里,我们又发现了一种奇怪的语法:n => n.Length > 5。这就是我们上文提到过的Lambda 表达式。微软的官方规范中称,Lambda 表达式是匿名方法的一种自然进化。因此Lambda 表达式其实也是一种特殊的委托,由编译器负责生成一个匿名的委托类型,它接受一个字符串类型的参数n;返回值为布尔类型,表示n的长度是否大于5;其中的参数类型和返回值类型都是由编译器推断而来的。说到类型推断,还要解释的一点就是上面的语句中出现的新关键字var。从出现的位置来看,var应该是一个类型。然而这又不是一个C#内建类型,也不是CLI提出的新类型;它只是一个“占位符”,它的确表示一个类型,但具体是什么类型需要编译器在编译期间进行推断。Lamda表达式的真正意义不仅仅在于简化了委托的编写方式,更重要的是它把代码表达式体现为了数据。换句话说,Lambda表达式不仅可以被编译为一段可以执行的代码(类似于匿名方法),也可以将其翻译为一个数据结构——表达式树。而如何处理Lambda 表达式,是由编译器根据Lambda表达式的使用方式来自动确定的。当把一个Lambda表达式赋给一个具有委托类型的域、属性或变量时,编译器像编译匿名方法

    一样将表达式体翻译成一段可执行代码;而当把一个L a m b d a 表达式赋给一个具有Expression<T>类型的域、属性或变量时,编译器就会将Lambda表达式解析为一个表达式树。对于翻译为代码的Lambda,可以向调用委托那样进行调用,而对于翻译为表达式树的Lambda表达式,就不可以了,会得到一个编译错误。但表达式树存在于一个由编译器生成的数据结构中,因此可以在运行时对其进行分析甚至修改。除了上面提到的一些重大改进之外,C# 3.0也对细微的语法进行了一些改进,使C#语言变得更加优雅和全面。值得说明的是,C# 3.0经过编译后生成的IL代码,完全是基于.NET 2.0的,C#语言已经远远跑在了他所栖生的平台前面。这一时期的C#语言离CLI已经越来越远了,编译器的工作也愈加繁重起来。首先很多语言结构(如查询表达式和Lambda 表达式)都不是CLI中提供的特性,因此需要编译器进行大量的转译工作;其次是这些语言结构带来的大量类型推断任务,也都是靠编译器来完成的。C#走到了3.0以后,已经完全不再是当年那个“简单”的语言了。它的开发者称其为“魔鬼”,而琳琅满目的新特性也的确让开发者们眼花缭乱,甚至感到恐惧。语言集成查询的引入,使得前一段时期内为开发者们广泛讨论的ORM概念得到了更加深入地体现,尤其是它所支持的数据源之

    广泛,让ORM理念变得已经不再必要了;而一些“.NET中的ORM实现”,似乎也成了完全不必要的扩展项目了。Lambda 表达式的引入,使得C#将可以轻松地完成特定领域(Domain-Specific)的开发。一个成功的开发人员在面对新鲜事物和新的困难时,兴奋是远大于恐惧的。让魔鬼来得更猛烈些吧!

    C#是什么东西?请高手指点。

    C#(读做 "C sharp",中文译音“夏普”)是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角.

    在本文中,我将考察创建一种新计算机语言的一般动机,并将特别指明是什么原因导致了C#的出现.然后我将介绍C#和它与Java,c,c++的相似之处.其次我将讨论一些存在于Java和C#之间的高层次的,和基础的差别.我将以衡量在用多种语言开发大型应用程序的时候所需的知识(或者对这种知识的缺乏程度)来结束本文,而这正是.NET和C#的一个主要战略.目前,C#和.NET还只能以C#语言规则,以及Windows 2000的一个"d预览版本",还有MSDN上迅速增多的文档集子的形式获得(还没有最终定型).

    微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说structs),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java.C#还需要进化成一种开发者能够接受和采用的语言.而微软当前为它的这种新语言大造声势也是值得注意的.目前大家的反应是:"这是对Java的反击."

    C#更象Java一些,虽然微软在这个问题上保持沉默.这也是意料中的事情,我觉得,因为Java近来很成功而使用Java的公司都报告说它们在生产效率上比C++获得了提高.

    Java所带来的巨大影响和大家对它的广泛接受已经由工作于这种语言和平台之上的程序员数量明显的说明了(估计世界范围内共有两百五十万程序员使用Java).由这种语言写成的应用程序的数量是令人惊讶的并已经渗透了每一个级别的计算,包括无线计算和移动电话(比如日本发明的Java电话).C#能够在用户领域获得这样的礼遇吗?我们必须等待并观望,就象已经由SSI公司的CEO和Kalpathi S. Suresh指出来的那样,"我发现所有这些都是渐进的.如果C#不存在,我们总能回到Java或C和C++.这些都不完全是新技术;它们在更大的意义上来说只是大公司制造的市场噱头.我们必须给他们时间安顿下来看看这些是不是真的对IT工业有什么影响."

    C#从Java继承而来的特点

    类:在C#中类的申明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好.Java的关键字import已经被替换成using,它起到了同样的作用.一个类开始执行的起点是静态方法Main().下面的Hello World程序展示了基本的形式:

    using System;

    class Hello

    {

    static void Main()

    {

    Console.WriteLine("Hello, world");

    }

    }

    在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(namespace).这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:一个被申明成abstract的类不能被实例化;它只能被用做一个基类.C#关键字sealed就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.界面:就象在Java中一样,一个界面是一组方法集合的抽象定义.当一个类或结构体实现一个界面的时候,它必须实现这个界面中定义的所有方法.一个单一的类可以实现几个界面.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层.NET框架进行自动内存垃圾回收.

    C#从C和C++继承的特点

    编译:程序直接编译成标准的二进制可执行形式.但C#的源程序并不是被编译成二进制可执行形式,而是一中中间语言,类似于JAVA字节码。如果前面的Hello World程序被保存成一个文本文件并被命名为Hello.cs,它将被编译成命名Hello.exe的可执行程序.

    结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据声明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面.

    预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有:

    #define

    #undef

    #if

    #elif

    #else

    #endif

    #warning

    #error

    #line []

    没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名.

    操作符重载:一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被被重载的单目操作符是:

    + - ! ~ ++ -- true false

    能够被重载的二元运算符是:

    + - * / % & | ^ << >> == != > < >= <=

    C#独有的特点

    C#最引人入胜的地方是它和Java的不同,而不是相似的地方.这一节(和这个系列第二部分的大部分地方)讲述了C#实现的和Java不同的地方或者Java根本没有的特点.

    中间代码:微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码.当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得Java和C#在性能上相对相同.象"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧.Java的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码.

    命名空间中的申明:当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容.

    基本的数据类型:C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字.

    两个基本类:一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它.

    参数传递:方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值.

    与COM的集成:C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET语言子类化.

    索引下标:一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的.

    public class ListBox: Control

    {

    private string[] items;

    public string this[int index]

    {

    get

    {

    return items[index];

    }

    set

    {

    items[index] = value;

    Repaint();

    }

    }

    }

    可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样:

    ListBox listBox = ...;

    listBox[0] = "hello";

    Console.WriteLine(listBox[0]);

    代理和反馈:一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明.

    补充:

    C#简史——摘自《程序员》杂志2005-12月刊

    C# 简史

    编者按:时间过得真快,居然现在就可以写C#的简史了。但是想想也不奇怪,C#可谓

    起点高、发展快的新一代语言,它的这五年走过了很多前辈十几年的路。公允地说,C#是目

    前兼顾系统开发和应用开发的最佳实用语言,并且很有可能成为编程语言历史上的第一个“全

    能”型语言。看过这篇简史,我们都应该明白,不要再把C#看成年轻后生了——只要是“马

    拉多纳”,就早晚当“球王”。

    C# 1.0,纯粹的面向对象

    当时间回溯到1998年底,微软正在忙于新一代COM的设计工作。此前,COM一直是组件化开发中非常成功的一种技术;但由于它仅提供了二进制层面上的统一,因此无法将类型信息和用于支持基础平台和开发工具的信息放到组件中。这时,Java正在逐步走向成熟。于是,微软学习Java

    的做法,将虚拟机的概念引入到了COM领域;同时,微软提出了“元数据”的概念,用于描述组件的类型信息和工具支持信息,并决定将其放入到组件当中。这种“COM虚拟机”的名字在经历了若干争论后,最终被定为CLR(Common Language Runtime,公共语言运行时)。与此同时,微

    软提出了在该运行时上运作的语言应该遵循的一些规则,以及该虚拟机的类型系统和指令集——所有这些规范形成了最终的C L I(Common Language Infrastructure,公共语言基础设施),并提交给了ECMA委员会。同时,微软开发了CLI的一个实现,这就是大名鼎鼎的.NET了。

    1998年12月,微软启动了一个全新的语言项目——COOL,这是一款专门为CLR设计的纯面向对象的语言,也正是本文的主角——C#的前身。历时

    半年有余,1999年7月份,微软完成了COOL语言的一个内部版本。直到2000年2月份,微软才正式将COOL语言更名为C#。据说起这个名字是因为C#开发小组的人很讨厌搜索引擎,因此把大部分搜索引擎无法识别的“#” 字符作为该语言名字的一部分;还有一种说法是在音乐当中“#”是升调记号,表达了微软希望它在C的基础上更上一层楼的美好愿望——当然这些都只是传说,无从考证。又是历经了一系列的修改,微软终于在

    2000年7月发布了C#语言的第一个预览版。因此人们一般认为C#是2000年发布的,并以此来计算它的“年龄”。在此后的一年多时间里,微软一直在修补各个测试版本中的BUG。直到2002年2月,微软终于推出了迟迟未上市的Visual Studio 7.0,并将其定名为“VisualStudio .NET 2002”。随着这套开发环境的出炉,开发者们终于看到了C#语言的第一个正式版本——C# 1.0。此后,微软马不停蹄,Visual Studio也恢复了往日

    的开发进度。在2003年5月,微软如期推出了Visual Studio .NET 2003,同时也发布了C#的改进版本——C# 1.1。这一时期的C#(以下称为C# 1.x)提出了纯粹的面向对象概念,并在语言特性中展现得淋漓尽致。C++并非纯面向对象的,为了和C兼容以及提供更高的执行效率,它保留了很多模块化的东西。Java尽管号称是面向对象的,但实际上,对于对象所应该具备的三种构成结构——属性、方法和事件,Java仅提供了方法,其它两种结构都要通过方法来模拟。在C# 1.x中,所有面向对象的概念都在语言中得到了非常好的体现。同时,C#还通过类类型、值类型和

    接口类型的概念形成了统一的类型系统。C#使用了大家所熟知的语法实现了方法,以至于很多人认为C#和Java、C++等面向对象语言“非常相像”,这使得从使用其他面向对象语言转到使用C#的过程非常简单。此外,C#还通过无参数列表的方法声名语法,结合get/set访问器实现了优雅的属性语法。其中的get访问器相当于获取属性值的方法,可以通过一些运算返回最终的结果,而不是简单地返回一个变量的值;而set访问器相当于设置属性值的方法,在其中可以进行一系列检测,最后将属性值赋给相应的变量。同时,通过同时提供get和set访问器、只提供get访问器和只提供set访问器,还可以很方便地实现可写、只读和只写的属性。C#的这种属性语法,使得一个属性在提供该属性的类的内部看来,非常像一组方法;而对于外部调用类看来,访问一个对象的属性和访问它的公共域没有任何区别。通过委托(稍后介绍),结合关键字event,C#提供了优雅的事件概念。使用+=运算符,开发者可以非常方便地将一个事件处理器关联到一个事件上,这个过程称之为“订阅”一个事件。由于委托内部封装了一个调用链表,因此可以方便地为一个事件添加多个事件处理器,这些处理器会自动地依次调用。多年的开发语言进化证明,函数指针是非常重要也是非常危险的语言特征之一。同时,基于函数指针的回调机制也Windows 核心概念之一。然而,由于函数指针很难验证参数的类型准确性,因此C#(确切地说是CLI)提出了“委托”的概念,这是一种类型安全的函数指针链表。这意味着,C#不仅可以提供回调机制,同时调用回调的一方还无需在其内部维护函数指针列表,所要做的仅仅是声名一个具有恰当委托类型的公共成员即可;而提供回调的一方也只需通过构造一个带有指定方法的相应委托实例,并通过“+=”运算符添加到回调列表即可。

    尽管C# 1.x提供了如此多的新鲜概念,但实际上,这些概念都是由CLI提出的。因此当将一个C#源程序编译为可执行文件时,编译器做的工作相对而言并不多。需要编译器代劳的是要将一个简单的委托定义语句翻译为一个继承System.MulticastDelegate类型定义。

    C# 2.0,泛型编程新概念

    微软本打算继续保证开发进度,并在2004年推出Visual Studio .NET 2004,但由于其间软件工程学尤其是软件管理学的大规模进步,微软所提供的这种仅具备开发和调试功能的IDE已经无法满足团队开发的需求。因此微软决定在项目设计和管理工具方面进行了进一步研发,并将其集成到Visual Studio中,以赢回原有的市场。因此,微软将Visual Studio.NET 2004“改名”为Visual Studio 2005,并决定推迟一年发布。不过,微软还是坚持在2004年的6月份发布了Visual Studio2005的第一个Beta 版,同时向开发者展示了C#语言的2.0版本。2005年4月,微软发布了

    Visual Studio 2005 Beta2,这已经是具备了几乎全部功能的VisualStudio,包括的产品有SQL Server2005、Team Foundation Server和TeamSuite。这时的C#编译器已经能够处理C# 2.0中所有的新特性。C# 2.0为开发者带来的最主要的特性就是泛型编程能力。和面向对象思想一样,泛型思想也是一种已经成熟的编程思想,但依然是没有哪一种主流开发语言能够支持完备的泛型概念。这主要是因为泛型的概念在一定程度上对面向对象概念进行冲击,同时,由于在编译期间对类型参数的完全检测很难做到,很多问题会被遗留到运行时。C# 2.0别出心裁,对泛

    型类型参数提出了“约束”的新概念,并以优雅的语法体现在语言之中。有了约束,结合编译器强大的类型推断能力,可以在编译时发现几乎所有“危险”的泛型应用。C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名方法结合泛型编程实现了函数式编程中的重要结构—— Lambda 表达式。尽管这种实现显得很繁琐而且不易理解,但毕竟是实现了。最终,函数式编程还是被引入到了C#语言中,这将在下一节中为大家讲述。

    此外,C# 2.0还进一步增强了语言的表达能力。在C# 2.0中,属性语法中的get和set访问器可以拥有不同的权限,这就使得定义一个在库的内部可读写,而在库的外部只读的属性成为可能。同时,C# 2.0还提供了迭代器的概念,这使得一个类无需实现IEnumerator 和IEnumerable接口即可实现一个可以进行遍历的类型,并且无需在类型中维护迭代状态。此时的.NET已经得到了很广泛的认可,并且因为元数据为组件带来了强大的自我描述能力,许多程序库厂商被吸引到.NET平台上来。随着.NET程序库数量的增长,逐渐暴露了命名的问题。在面向对象技术广泛发展

    后,人们就意识到名字的管理问题,因此几乎所有的面向对象语言都提出了“命名空间”的概念;

    而在C# 1.x时代,这个问题再一次出现。如果一个库厂商XX 希望以XX.System来命名他们自己的系统基础库,那么当开发者使用using System语句时就会产生歧义。为此。C# 2.0中提供了global关键字,这为.NET库中所有的命名空间提供了一个“根”,通过指定global::System和global::XX.System就可以区别两个库了。这一时期的C#编译器变得非常复杂,泛型的引入使得编译器不得不具备超强的类型推断能力。同时,迭代器的思想并非是在CLI层面上实现的,而是由编译器自动生成了实现I E n u m e r a t o r 和IEnumerable接口类型。C# 3.0,魔鬼在经历了一系列的改进和完善后,微软决定于2005年11月发布Visual Studio2005,该开发环境将正式支持C#2.0。由于此推出了数个预览版和测试版,大家的期待之情似乎已经不是那么强烈了。而2005年9 月份的PDC大会则为开发者们带来了另外的惊喜——C#3.0(研发代号“Orcas”——魔鬼)的技术预览版。

    说到C# 3.0,就不得不提一下微软的LINQ 项目,LINQ(语言集成查询,Language Integrated Query)提出了一种通过面向对象语法来实现对非面向对象数据源的查询技术,可查询的数据源从关系型数据库延伸到一般意义上的集合(如数组和列表)以及XML。而C# 3.0则是率先实现了LINQ的语言。在C# 3.0中,我们可以用类似于SQL语句的语法从一个数据源中轻松地得到满足一定条件的对象集合。例如要查找一个字符串

    数组names中所有长度大于5的字符串,就可以写: var longname = from n in names wheren.Length > 5 select n;这样我们就得到一个新的字符数组longname,其中包含了我们所需要的结果。这种语句称作查询语句,与SQL语句唯一的区别是C#中的查询语句往往把select子句放到最后(这反而倒有些类似于中文的阅读顺序了)。初次看到这样一个语句,我们可能会有很大疑问:这还是C#语言吗?这的确是合乎语法规则的C#代码,而且编译器可以识别这种语法。然而实际上,C#编译器并不会对这种语法进行实际的的编译,而是将其翻译为正常的方法调用:

    var longname = names.Where(n => n.

    Length > 5).Select(n);然后再进行进一步的编译。在上面的例子中已经说明,names是一个存放有字符串的数组,而数组类型并没有Where的方法。的确,Where并非names的成员方法,微软也没有对数组类型进行任何改动。这是C# 3.0中另外一个重要的新特性:扩展方法。扩展方法是定义在其他静态类中的静态方法,其第一个参数的类型就是希望扩展的类型,并且这个参数被冠以this修饰符。扩展方法是静态的,但可以像调用被扩展类型的实例方法那样进行调用,看起来好像是被扩展类型自己的方法一样。这就为语言带来了很大的灵活性,我们可以将一组近似的功能如上面的Where 和Select等(这在LINQ中被称作“标准查询表达式”)定义在一个外部类中,这样既无须修改现有类型,又可以将功能组织在一起。当然,为了做到面向对象的封装性,扩展方法只能在被扩展类型的公共成员上进行操作,如果需要从内部对类型进行改进,就必须改变现有类型的代码。在Where方法的参数列表里,我们又发现了一种奇怪的语法:n => n.Length > 5。这就是我们上文提到过的Lambda 表达式。微软的官方规范中称,Lambda 表达式是匿名方法的一种自然进化。因此Lambda 表达式其实也是一种特殊的委托,由编译器负责生成一个匿名的委托类型,它接受一个字符串类型的参数n;返回值为布尔类型,表示n的长度是否大于5;其中的参数类型和返回值类型都是由编译器推断而来的。说到类型推断,还要解释的一点就是上面的语句中出现的新关键字var。从出现的位置来看,var应该是一个类型。然而这又不是一个C#内建类型,也不是CLI提出的新类型;它只是一个“占位符”,它的确表示一个类型,但具体是什么类型需要编译器在编译期间进行推断。Lamda表达式的真正意义不仅仅在于简化了委托的编写方式,更重要的是它把代码表达式体现为了数据。换句话说,Lambda表达式不仅可以被编译为一段可以执行的代码(类似于匿名方法),也可以将其翻译为一个数据结构——表达式树。而如何处理Lambda 表达式,是由编译器根据Lambda表达式的使用方式来自动确定的。当把一个Lambda表达式赋给一个具有委托类型的域、属性或变量时,编译器像编译匿名方法

    一样将表达式体翻译成一段可执行代码;而当把一个L a m b d a 表达式赋给一个具有Expression<T>类型的域、属性或变量时,编译器就会将Lambda表达式解析为一个表达式树。对于翻译为代码的Lambda,可以向调用委托那样进行调用,而对于翻译为表达式树的Lambda表达式,就不可以了,会得到一个编译错误。但表达式树存在于一个由编译器生成的数据结构中,因此可以在运行时对其进行分析甚至修改。除了上面提到的一些重大改进之外,C# 3.0也对细微的语法进行了一些改进,使C#语言变得更加优雅和全面。值得说明的是,C# 3.0经过编译后生成的IL代码,完全是基于.NET 2.0的,C#语言已经远远跑在了他所栖生的平台前面。这一时期的C#语言离CLI已经越来越远了,编译器的工作也愈加繁重起来。首先很多语言结构(如查询表达式和Lambda 表达式)都不是CLI中提供的特性,因此需要编译器进行大量的转译工作;其次是这些语言结构带来的大量类型推断任务,也都是靠编译器来完成的。C#走到了3.0以后,已经完全不再是当年那个“简单”的语言了。它的开发者称其为“魔鬼”,而琳琅满目的新特性也的确让开发者们眼花缭乱,甚至感到恐惧。语言集成查询的引入,使得前一段时期内为开发者们广泛讨论的ORM概念得到了更加深入地体现,尤其是它所支持的数据源之

    广泛,让ORM理念变得已经不再必要了;而一些“.NET中的ORM实现”,似乎也成了完全不必要的扩展项目了。Lambda 表达式的引入,使得C#将可以轻松地完成特定领域(Domain-Specific)的开发。一个成功的开发人员在面对新鲜事物和新的困难时,兴奋是远大于恐惧的。让魔鬼来得更猛烈些吧!

    参考资料:http://ke.baidu.com/view/6590.htm

    字库网还为您提供以下相关内容希望对您有帮助:

    c#是什么

    说到C# 3。0,就不得不提一下微软的LINQ 项目,LINQ(语言集成查询,Language Integrated Query)提出了一种通过面向对象语法来实现对非面向对象数据源的查询技术,可查询的数据源从关系型数据库延伸到一般意义上的集合(如数组和列表)以及XML。

    .NET的3.5特性

    下面是我撰写的一些讨论这些新语言特性的文章(用C#作为示例):自动属性,对象初始化器,和集合初始化器扩展方法Lambda表达式查询句法匿名类型LINQ to SQL中的数据访问改进LINQ to SQL是.NET 3.5中内置的OR/M (对象关系映...

    C#到现在一共经历了几个版本?

    C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经...

    C# 3.0中的分部方法

    在看C#语言的What s New时 突然发现新特性列表的最后 多出了一个 Partial Method Definitions 但并不像其他新特性一样有超链接链接到其说明 上网搜索了一下 关于分部类型的信息非常少 尤其是中文信息 只有CSDN的 周融 在...

    Visual C# 是用来干什么的,对学Java有用吗?

    C# 2.0,泛型编程新概念 C#3.0(研发代号“Orcas”——魔鬼)C# 4.0的特性 列表 微软MSDN提供C#全系列课程 C#与C++、JAVA的区别 C#的前途如何?非Windows平台下的C#C#简介 C#从Java继承而来的特点 C#从C和C++继承的...

    get microsoft silverlight什么意思

    ◆LINQ。SilverLight包含集成查询(LINQ)语言。◆如果已经使用ASP.NET,可以将SilverLight集成到熟悉的ASP.NET服务器和客户端功能。可以在ASP.NET中创建基于服务器的资源,使用ASP.NET的AJAX特性与服务器端资源交互而不会打断用户...

    C#是什么东西?请高手指点。

    C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名...

    C#什么意思?

    C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名...

    谁给简单介绍一下C#?

    C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名...

    VisualC# 和Visual C功能一样吗?

    C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名...

    Top