C#编程4.0

介绍C#

C#,读作“see sharp”——是专门为.NET平台设计的编程语言。从2002年首次发布以来,C#创建了许多角色。它广泛的应用于网站服务器端以及windows桌面应用程序的客户端和服务器上。你可以用C#编写智能手机的用户界面和Xbox 360游戏。最近,微软的Sliverlight平台使得可以用C#编写可以在网页浏览器上运行的Internet应用程序。

但是什么样的语言是C#?为了很好的了解一种语言并且有效的应用,仅仅专注于细节和机制是不够的,虽然在这本书中我们也将花费大量的时间来了解这些东西,但是同样重要的是了解这些细节之后的东西。因此,在本章中,我们将要了解C#建立一个什么样的问题解决机制。因此,我们将探讨这种语言的风格,并且通过各个方面来区别C#与其他语言。并且我们将在了解C#的最新演变——第四个版本,中结束此章节。

为什么是C#?为什么是.NET?

编程语言的存在,可以让开发人员的开发工作更加的有效率。许多成功的编程语言都简化或者自动化了以前要靠繁琐的步骤才能完成的任务。有些提供新技术,使得老问题可以比以前更加有效或者在更大的规模上得到解决。当然,C#可以给你带来多大的差异取决于你的编程背景,所以这值得考虑,语言设计人员在开发C#的时候考虑了哪些种类的人。

C#是针对windows平台上的开发的,并且其语法跟使用C、C++或者其他编程语言的编程人员的编程传统相似,如JavaScript和Java绘制。基本语言元素如语句、表达式、函数声明和流量控制,尽量与C家族语言接近。

当然,一个熟悉的语法这个理由并不足够来选择一个语法,所以C#提供了一个生产增强特性,这个特性在它之前的语言中并没有。垃圾回收机制把开发人员从常见的内存管理问题的暴政中解救出来,如内存泄漏和循环引用。编译代码可验证类型安全机制规则了广泛的错误和潜在的安全漏洞。但是C或C++的windows开发人员可能不习惯这些功能,他们觉得这是Java淘汰下来的旧帽子,但是无论在对象模型,XML或者数据库中,Java都没有任何东西能够媲美C#为搜集信息工作所提供的“LINQ”功能。即使用其他语言编写,从外部原件集成代码也是非常痛苦的。C#中还采用了功能编程的支持,这是以前学术语言中的一个非常强大的功能。

C#开发人员中使用的大多数有用的功能,许多都来自于.NET框架,它为C#提供运行环境、C#库以及所有其他.NET语言,就像VB.NET。C#是为.NET设计的,他们之间关系如此密切的一个主要好处是与框架功能的合作,就像类库一样感觉很自然。

.NET Framwork 类库

在C#中工作是指比语言用到的更多——.NET Framwork提供的类是开发人员日常经验(他们占了这本书很大一部分内容)的一个极其重要的组成部分。大多数的库的功能分为一下三类:编写实用的功能、.NET包装windows功能和框架。

第一组包括的实用工具如字典、列表和其他集合类,以及字符串处理工具如正规表达引擎。也有一些处理稍大规模的功能,例如对象模型,代表XML文档。

一些类的功能的特点是围绕底层的OS的包装,例如有用于访问文件系统的类,并使用网络功能如接口。也有书面向控制台输出的类,我们可以用在任何书上都可以看到的第一个例子说明,如示例1-1所示。

示例1-1。“Hello,world”示例

class Program

{

static void Main(){

System.Console.WriteLine("Hello, world");

}

}

我们将在适当的时候检查所有组件,但现在,即使是这个最简单的例子也需要调用库中的类(这个例子中的System.Console类)来做这个工作。

最后,类库提供整个框架以支持建设的某些种类应用。例如Windows Presentation Foundation (WPF)是建立windows桌面软件的框架;ASP.NET(这不是一个缩写,尽管出现)是一种用于构建WEB应用程序的框架。并不是所有框架都是关于用户界面的,例如Windows Communication Foundation (WCF)是专为在网络上访问其他计算机系统建立服务而设计的。

这三类划分并不严格,不少类适合一分为二。例如,类库提供访问文件系统的部分不只是薄的包装围绕现有的Win32 API。他们添加新的面向对象的抽象,提供超出了基本的文件I / O服务的重要功能,所以这些类型的融入第一类和第二类。同样,框架通常需要整合与相关服务为例,虽然在一定程度上的Windows窗体UI框架有其自身独特的API,很多的基本功能是所提供的Win32组件。因此,这里的三个类别是不严格。他们只是提供了一个什么东西,你可以在类库中找到各种有用的想法。

语言风格

C#并不是唯一一个在.NET Framwork上运行的语言。事实上,支持多种语言一直是.NET Framwork的一个主要特点,这体现在它运行环境引擎的名字上——CLR或者叫通用语言运行环境。顾名思义,.NET Framwork不只是支持一种编程语言,而是支持多种语言服务的.NET框架类库。你为什么会选择除了C#的其他语言呢?

我们已经提到了一个重要的原因:C#是专门为.NET设计的。如果您在C#工作中正在使用以.NET技术为基础的工具,如WPF或ASP.NET,那你就会说话他们的语言。与C++相比,它支持原始语言的.NET的扩展。扩展是经过深思熟虑的并且工作的很好,但是所调用.NET库的代码与C++并不相同。但是从正常使用,所以建立的贯通C#与标准化的C++之间的桥梁从来没有贯通过。同时这个犹如一把双刃剑,也面临着困境。比如说你能用标准的C++集合一个或者多个.NET类库中的类么?在本地.NET语言中,这些问题并不会出现。

但C#在这方面并不是独树一帜的。 Visual Studio 2010为.NET设计了三种语言:NET的C#,VB.NET和F#。 (虽然VB.NET从其如下非.NET Visual Basic的前辈,这是在一些重要方面截然不同。它是原生的。NET语言像VB的语法,而不是VB 6中。NET功能螺栓)。这些语言之间的选择归结到什么风格的需要的语言。

F#的奇特之处就在这里。这是一个功能性编程语言,严重影响由毫升语言。早在1991年,当你的作者是一年级学生,我们大学的计算机科学课程的选择毫升的第一编程语言

部分,因为它是如此的学术讲座,学生没有以前遇到这样的事情。 F#是在频谱的学术年底,尽管仍爬下象牙塔远远不够成为一个主流标准的一部分开发环境。擅长复杂的计算和算法,有一些特点,可以帮助并行执行。然而,与许多语言功能,使一些困难的问题更容易的成本是很多在更传统的语言很容易的事情是有显着努力,在F# - 功能性语言,善于在复杂的问题,但可以用简单的笨拙的。 F#将主要用于在科学或金融应用,它似乎进行计算的复杂性,复杂相形见绌代码需要采取行动对这些计算的结果。

虽然F#的感觉明显等,VB.NET和C#有很多相似之处。最在选择之间的这些明显的因素是,VB.NET有人更容易学习熟悉Visual Basic语法,而C#将是一个熟悉的人更容易C类语言。然而,有微妙的区别在于:在语言哲学超越语法。

组合性

设计C#编程语言的一个一致的主题是,它的开发者倾向于选择专门的通用功能。有关于这方面的一个最明显的例子就是LINQ,C#语言中新添加的语言集成查询功能。从表面上看,这似乎添加类似SQL的查询语言功能,提供了一个自然的方式融入你的代码数据库访问。例1-2显示了一个简单查询的功能。

示例1-2 使用LINQ的数据访问

var californianAuthors = from author in pubs.authors

where author.state == "CA"

select new

{

author.au_fname,

author.au_lname

};

foreach (var author in californianAuthors)

{

Console.WriteLine(author);

}

显而易见,C#不知道任何有关SQL或数据库的内容。为了使用此语法,C#3.0中添加了一个语言功能结合,让筏代码这种不只是用于数据库访问,而且还为XML解析,或工作对象模型。此外,许多个人的特点可以用在其他情况下,我们将在后面的章节中看到。 C#中喜欢小的,组合的,通用的超过单片式,专业化的特点。

这一理念的一个突出的例子就是在C#中证明原型的一个功能,但最终剩下的只有:XML文本。这一个实验的语法允许内嵌XML,用编译成代码,建立模型来来表该XML的方法。C#团队的决定是省略此功能,这说明风格的偏好超过了高度专业化这一一般性的特点。而XML有很多的应用,XML的文本语法不能用于其他任何XML,而这种高度专业化在C#中会感觉到很拘束。

托管代码

.NET Framework提供更多的不仅仅是一个类库。它还以一种微妙的方式不直接访问调用类库而提供服务。例如,早期我们提到,C#可以自动内存管理的某些方面,一个臭名昭著的C + +代码中的错误源。一旦你放弃堆分配对象他们是在C + +的,但它是正常的方式释放他们。NET编码错误。这CLR的。NET Framework的运行时环境提供服务。虽然C#编译器紧密合作,使这成为可能的运行,提供您的代码如何使用对象和数据的必要的信息,这是最终运行垃圾收集工作。

你以前工作时依赖什么语言,语言很大程度上依赖于运行这个想法似乎完全自然或有些令人不安。这当然是从C和C+ +的工作与不同这些语言编译器的输出可以直接执行,由计算机和虽然这些语言有一定的运行服务,它可以编写代码,没有他们可以运行。但C#代码甚至无法执行不运行时的帮助。完全取决于运行时的代码称为托管代码。

托管编译器不产生原始的可执行代码。相反,它们产生中间形式的代码称为白细胞介素,中间语言运行时决定。究竟如何转换成可执行的东西。一个实际结果的管理代码是一个已编译的C#程序可以运行32位和64位系统不修改,甚至可以运行在不同的处理器架构,它往往可能VB.NET支持XML文本代码上运行一个基于ARM的手持设备的运行在基于Intel的未修改个人电脑,或在Xbox360游戏机的PowerPC架构。

如CPU的独立有趣的可能是在实践中,最有用的方面的管理代码和IL。NET运行时,可以提供有用的服务,这都很难传统的编译系统要贯彻落实好。换句话说,这一点是使开发人员的生产力。只是前面提到的内存管理其中一个例子。其他包括安全模型,考虑到代码的起源而不是仅仅发生运行代码的用户的身份;灵活装载了强大的支持服务和版本的共享组件的机制;如何在实践中使用的代码正在运行时代码优化的基础上而不是编译器猜测它可能被使用;已经提到,符合CLR的能力,以验证该代码输入安全规则,在执行前,裁决了整体的安全和稳定的错误类。

如果你是一个Java开发人员,这一切听起来相当熟悉,刚刚替补字节码IL和故事非常相似。事实上,一个受欢迎的,但有些无知的“笑话”欠周到的Java社区成员之间形容为一个贫穷的C#仿爪哇。当第一个版本的C#出现,差异有微妙的,但事实上,Java的去复制几个特点,从C#说明的C#总是比只克隆。语言变得更加明显不同每个新版本,但一个区别,目前,从一开始就显得尤为重要Windows开发C#一直很容易得到的功能底层的Windows平台。

连续性和windows生态系统

没有成功的软件开发平台纯粹是对自己的优点上下文事项。例如,第三方组件和工具的广泛可用性平台明显更具吸引力。 Windows是也许最引人注目的这种现象的例子。任何试图获得认可的新的编程系统有相当大的优势,如果它可以插入一些现有的生态系统,C#和Java之间最大的区别之一是,C#和。NET框架积极拥抱Windows平台上,而Java超出其隔离方式从底层的操作系统的开发。

如果你正在编写一个特定的操作系统上运行的代码,它不是特别有用语言独特的工具和组件的削减你到您选择平台。而不是要求开发商与过去决裂NET提供的连续性它可能是内置的组件和服务直接或Windows内置。大多数时候,你不会需要使用这个类库提供了很多底层平台的功能的包装。然而,如果你需要使用一个第三方组件或功能的操作系统目前还没有。NET包装,工作能力等非托管功能直接从托管代码是无价的。

虽然.NET中提供的功能一体化的基础平台,仍然有支持非Windows系统。微软的Silverlight可以运行的Mac OS X以及Windows的C#和VB.NET代码。还有一个开源项目称为单使。NET代码在Linux上运行,以及相关的Moonlight项目是一个开源版本的Silverlight。因此,本地平台整合功能如果你不停止#从多个有用的C平台要针对多个操作系统,你将不只是选择使用任何特定于平台的功能。

因此,C#和Java之间的哲学最大的差异是C#提供平等的支持,直接使用操作系统特定功能和平台独立性。 Java使得前不成比例比后者更难。

最新版本的C#包含的功能,提高能力,进一步。几个新的C#4.0的特性使其更容易互动与Office和其他Windows使用COM自动化的应用程序,这是一个在C#3.0中的薄弱点。相对缓解,开发商可以达到托管代码,使边界之外C#的一个有吸引力的选择,它提供所有的管理执行的好处,但保留工作能力与在Windows环境中的任何代码,托管或没有。

C#4.0 NET 4和Visual Studio 2010

由于C#有利于通用的语言功能设计要与一个组成另外,它往往不使个别新功能来形容自己的感觉。因此,而不是致力于新功能的部分或全部章节,我们将介绍他们在情况下,适当地与其他旧的语言功能集成。本节您现在正在阅读的​​是一个例外,当然,最主要的原因是,我们期望与C#3.0已经熟悉的人通过这本书在书店浏览寻找我们的新功能的覆盖面。如果是你,欢迎书!如果您在“前言”,看看你会发现什么是在这本书中,包括一节的指南只为你,说明在哪里可以找到关于C#4.0的功能材料。

话虽这么说,一个主题团结在第4版的新的语言特性:它们支持动态规划,特别注重了对某些互操作性方案简单。例如,可以考虑在示例1-3 C#3.0的代码,使用部分Office对象模型读取Word文档的作者属性。

示例1-3 C#4.0之前的互操作集的复杂性

static void Main(string[] args)

{

var wordApp = new Microsoft.Office.Interop.Word.Application();

object fileName = @"WordFile.docx";

object missing = System.Reflection.Missing.Value;

C# 4.0, .NET 4, and Visual Studio 2010 | 7

Download from Library of Wow! eBook <www.wowebook.com>

object readOnly = true;

Microsoft.Office.Interop.Word._Document doc =

wordApp.Documents.Open(ref fileName, ref missing, ref readOnly,

ref missing, ref missing, ref missing, ref missing, ref missing,

ref missing, ref missing, ref missing, ref missing, ref missing,

ref missing, ref missing, ref missing);

object docProperties = doc.BuiltInDocumentProperties;

Type docPropType = docProperties.GetType();

object authorProp = docPropType.InvokeMember("Item",

BindingFlags.Default | BindingFlags.GetProperty,null, docProperties,new object[] { "Author" });

Type propType = authorProp.GetType();

string authorName = propType.InvokeMember("Value",

BindingFlags.Default |BindingFlags.GetProperty,null, authorProp,new object[] { }).ToString();

object saveChanges = false;

doc.Close(ref saveChanges, ref missing, ref missing);

Console.WriteLine(authorName);

}

这些代码相当可怕,因为很难看出这些代码在干嘛因为所有的目的都在细节中消失了。原因很不让人愉快因为办公编程模型是为动态语言而设计的,为了能在运行的时候填补很多细节。C#3.0中并不能够做到这一点,所以开发商不得不手动做这些所有的工作。

示例1-4显示了如何用C#4.0做同样的工作。这理解起来要简单的多,因为代码只包含有关细节。很容易看清楚操作的顺序——打开文件,获取属性,检索Author属性的值并且关闭该文件。C#4.0现在能够为我们填补所有的细节,这要归功于它新的动态语言功能。

示例1-4 office互操作与C#4.0

static void Main(string[] args)

{

var wordApp = new Microsoft.Office.Interop.Word.Application();

Microsoft.Office.Interop.Word._Document doc =

wordApp.Documents.Open("WordFile.docx", ReadOnly: true);

dynamic docProperties = doc.BuiltInDocumentProperties;

string authorName = docProperties["Author"].Value;

doc.Close(SaveChanges: false);

Console.WriteLine(authorName);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值