第6章 .NET框架.ppt_第1页
第6章 .NET框架.ppt_第2页
第6章 .NET框架.ppt_第3页
第6章 .NET框架.ppt_第4页
第6章 .NET框架.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章.NET框架,本章要点: .NET框架概观 如何获取系统信息 如何访问文件系统 使用容器 接触XML,6.1 .NET框架概观,.NET公共语言运行时体系结构,.NET应用程序的执行,在说明了公共语言运行库之后,我们可以更好地理解 .NET框架类库了。 .NET框架类是生成 .NET应用程序、组件和控件的基础。它们包括下列功能: (1)表示基础数据类型和异常; (2)封装数据结构; (3)执行 I/O; (4)访问关于加载类型的信息; (5)调用 .NET框架安全检查; (6)提供数据访问、多客户端 GUI 和服务器控制的客户端 GUI。 .NET框架提供了一组丰富的接口以及抽象类和具体

2、(非抽象)类。程序员既可以按原样使用这些具体的类,也可以(可能多数是)从这些类派生自己的类。若要使用接口的功能,既可以创建实现接口的类,也可以从某个实现接口的 .NET框架类中派生类。,6.2 获取系统信息,System命名空间包含许多基本类,这些类定义了常用的值和引用数据类型、事件和事件处理程序、接口、属性和异常处理。其实,这些服务以前都已经接触过了,例如字符串String类、控制台Console类和异常Exception类等。 System命名空间还提供了许多系统服务类,用这些系统服务类可以获得系统信息和管理应用程序运行的环境和状态。,6.2.1系统信息实用程序 本节的任务是开发一个显示系

3、统信息的小应用程序,例如图6.4中Windows自带的“系统信息”实用程序。 本节将要设计的程序与Windows的系统信息实用程序有些类似,当然,不像它这么强大和复杂,而只是能显示一些基本信息。这些信息全部都通过System命名空间中的类来获取,十分方便。,6.2.2开始建立一个系统信息实用程序 Dim sysInfo As String sysInfo += 计算机名称: & Environment.MachineName _ & Environment.NewLine sysInfo += 用户名: & Environment.UserName & Environment.NewLine

4、sysInfo += 系统文件夹: _ & Environment.GetFolderPath(Environment.SpecialFolder.System) & Environment.NewLine sysInfo += 应用程序文件夹: _ & Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)& Environment.NewLine sysInfo += 操作系统版本: & Environment.OSVersion.Version.ToString() _ & Environment.NewLine

5、 sysInfo += 系统已经启动了: & Environment.TickCount & 毫秒 _ & Environment.NewLine sysInfo += 当前时区: & TimeZone.CurrentTimeZone.StandardName _ & Environment.NewLine sysInfo += Environment.NewLine Dim envvar As Collections.DictionaryEntry For Each envvar In Environment.GetEnvironmentVariables() sysInfo += envv

6、ar.Key & : & envvar.Value & Environment.NewLine Next rtbSysInfo.Text = sysInfo,6.2.3System命名空间 在这个程序中,主要利用的类是System.Environment,它提供有关当前环境和平台的信息以及操作它们的方法。例如MachineName属性提供计算机名,UserName属性提供当前用户的名字等,实际上程序本身就说明了一切,无须在这里多加解释了。 获取环境变量的时候使用的是GetEnvironmentVariables方法,它返回一个IDictionary,这是一个集合接口,属于System.Coll

7、ections命名空间,以后大家会了解这个命名空间。 System命名空间中包括了近100个类,表6.1中列出了一些最常用的类和对它们的简要说明。,System命名空间中的常用类,System命名空间中的常用类,(续上表),System命名空间中的常用类,System命名空间中的常用类,System命名空间中的常用类,6.3 读写文本文件,文件的读写是软件中经常要用到的功能,在以前的程序中,早已多次访问过文件系统了,当时使用的是File类。在这一节中我们会综合运用一下这些知识,同时熟悉.NET框架的输入输出功能。 6.3.1记事本 本节的任务是编写一个类似Windows记事本的小程序,但是为了

8、突出重点,这个程序不会有搜索、调整格式等功能,它所具有的仅仅是打开文本文件、编辑文本和保存文本文件功能。,6.3.2如何建立一个简单的记事本 6.3.3使用自己的记事本程序,6.3.4System.IO命名空间 程序中,在读写文件的时候,主要用到的是System.IO命名空间中的StreamReader和StreamWriter两个类,.NET框架把几乎所有的输入和输出都看做是Stream(流),对于文件有文件流、对于网络有网络流等。这种统一看待不同事物的方式称为“抽象化”,把输入输出抽象化为流有很多好处。例如,可以用统一的操作去处理这些不同的事物。,流类型,6.4 监视文件系统的变化,Win

9、dows 2000和Windows XP平台有一个很好的特点,就是提供了监视文件系统变化的服务。也就是说,系统可以在有文件的创建、删除和重命名等事件发生的时候,通知应用程序,而应用程序也可以采取相应的措施来处理这些事件。 本节要建立的程序可以在有文件创建和删除的时候,把消息列在窗体上,为了达到这个目的,我们在程序中会使用.NET框架提供的FileSystemWatcher(文件系统监视器)控件。,6.4.1文件系统监视器 建立一个新的Windows窗体应用程序Case6_4,在窗体中加入一个列表框控件,最好把它调整得大一点,让它充满整个窗体,将它命名为lstEvents。 在窗体中放入一个Fi

10、leSystemWatcher控件,命名为fsw。这个控件并不在Windows窗体工具箱中,而是在组件工具箱中。 由于FileSystemWatcher是一个不可见控件,所以把它放到窗体上之后,它会出现在不可见控件区。 随后双击窗体的标题栏,在出现的Form1_Load事件处理过程中写入如下代码: fsw.Path = C: fsw.IncludeSubdirectories = True fsw.NotifyFilter = IO.NotifyFilters.FileName,接下来,在类Form1的定义中,加入一个自定义的过程,它既会响应文件的创建,也会响应文件的删除操作。 Private

11、 Sub fsw_CreateAndDelete(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles fsw.Created, fsw.Deleted Dim sChange As String If e.ChangeType = IO.WatcherChangeTypes.Created Then sChange = 被创建 ElseIf e.ChangeType = IO.WatcherChangeTypes.Deleted Then sChange = 被删除 End If ls

12、tEvents.Items.Add(e.FullPath & sChange) End Sub 这时就可以运行程序了。,6.4.2程序运行,6.5 访问Windows注册表,系统的注册表有点像一个文件系统,它有很多注册表项(RegistryKey),就像是文件夹一样;而每个注册表项之下还可以有注册表项,就像是子文件夹;在注册表项之下还可以有一些数值(Value),就像是文件;这些值有自己的名字,像是文件名,还有自己的值,像是文件内容。它们在一起就可以记录系统、用户和软件等信息。 .NET框架对访问系统注册表提供了内在的面向对象支持,这些支持位于Microsoft.Win32命名空间中。这个命名

13、空间提供了两种类型服务,第一类服务处理操作系统引发的事件,第二类服务就是对操作系统注册表进行操作。 下面简单地介绍一下Windows注册表的结构。 前面讲过,系统的注册表有点像一个文件系统,文件系统有几个驱动器根(A盘、C盘、D盘),同样,注册表也有几个根注册表项,它们是注册表的最上层,一共有7个,不会多也不会少。,根注册表项,6.5.1注册表编辑器,6.5.2简化版的注册表编辑器,6.5.3使用简化版的注册表,6.5.4点评:Registry类和RegistryKey类,6.6使用集合,如果你对数据结构有所了解,就应该知道编写一个安全、通用、高效的链表(或者堆栈、队列),并不是一件很容易的事

14、。幸运的是,面向对象的程序设计,让我们可以把这些事情交给系统程序员(类库的编写者)去伤脑筋,而我们就好好享受他们的劳动成果吧。 在现代面向对象程序设计语言中,包含基本数据结构(链表、堆栈、队列、哈希表)的类库(或者模板库),都是作为语言的一部分提供给使用者的。而Visual Basic .NET使用的.NET框架类库当然也包含这些,它们位于System.Collections命名空间。,6.6.1System.Collections命名空间 System.Collections既提供了可以直接使用的数据结构,也提供了可扩展的接口。可以直接使用的数据结构包括堆栈、队列、有序表和哈希表等,本节将通

15、过展示最常用的数据结构之一哈希表的用法,来学习.NET集合类。 本节要做的事情很简单:在窗体上显示一张列表,在表中列出一些书籍的名字、价格和作者,用户可以从列表中删除书、也可以自己为列表加上书。而在整个过程中,书的数据保存在一个哈希表中。,6.6.2自定义的Book(书籍)类,6.6.3书籍信息编辑程序 Private hashTable As Collections.Hashtable = New hashTable() Private Sub ReloadList() lstBooks.Items.Clear() 告诉列表框:在元素添加的时候,应该显示它们的DisplayBook属性 此属

16、性定义在Book类中 lstBooks.DisplayMember = DisplayBook 获得该哈希表的遍历器,用它可以一个一个的访问哈希表的所有元素 Dim myEnumerator As IDictionaryEnumerator = hashTable.GetEnumerator() 利用遍历器在哈希表中移动,把每个元素加入到列表框中 While myEnumerator.MoveNext() lstBooks.Items.Add(myEnumerator.Value) End While End Sub,Private Sub Form1_Load(ByVal sender As

17、 System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim b As Book 加入几个初始值 b = New Book() b.Name = 射雕英雄传 b.Price = 20 b.Author = 金庸 hashTable.Add(b.Name, b) b = New Book() b.Name = A Room of Ones Own b.Price = 30 b.Author = Virginia Woolf hashTable.Add(b.Name, b) b = New Book() b.Name =

18、Thinking in Java b.Price = 60 b.Author = Bruce Eckel hashTable.Add(b.Name, b),ReloadList() End Sub Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click Dim b As Book 从列表框中得到被选择的书 b = CType(lstBooks.SelectedItem, Book) 在哈希表中移除它 hashTable.Remo

19、ve(b.Name) ReloadList() End Sub Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click If txtName.Text And txtPrice.Text And txtAuthor.Text Then,Dim b As Book = New Book() b.Name = txtName.Text b.Price = Integer.Parse(txtPrice.Text) b.Author = txtAu

20、thor.Text 以下的判断并没有必要,只是为了演示Contain方法的使用 If hashTable.Contains(b.Name) Then hashTable.Item(b.Name) = b Else hashTable.Add(b.Name, b) End If ReloadList() End If End Sub,6.6.4运行书籍信息编辑程序,6.6.5 哈希表 程序中多次用到了哈希表,那么哈希表究竟是什么呢?简单地说,它有点像一个数组,但是数组只能够以整数为下标,例如对于一个数组array,只能有array(3)这样的语法。但是哈希表可以以任何东西为下标。在程序中使用的是

21、以书名(一个字符串)为下标,例如 hashTable.Item(b.Name) = b 这是很方便的。而且,除了方便以外,哈希表还有一个很好的特性,就是它即使在包含很多元素的时候,查找某一个元素的速度也非常快,查找时间可以认为接近于恒定。 程序中,在哈希表中添加一本书的时候,用了这样的语句: If hashTable.Contains(b.Name) Then hashTable.Item(b.Name) = b Else hashTable.Add(b.Name, b) End If 首先判断哈希表中是否已经有了某本书,有则修改,没有则添加。这样做只是为了演示如何判断哈希表中是否包含某个元素

22、,事实上这个判断是没有必要的,可以直接写成: hashTable.Item(b.Name) = b 因为哈希表会直接把一个元素放到表中,如果放置元素的位置有数据,就会把原来的覆盖掉,如果没有,就会添加进去。,6.7更多了解集合,在上一节中,程序使用哈希表来存储书的数据。为了通用,哈希表中的数据一律是Object类型,所以这样的哈希表才可以放入任何类型的数据。但是这样也产生了一个问题:把数据放进哈希表的时候,它是Book类型,而把数据取出来的时候,它成了Object类型。如果要使用它们,就需要使用CType函数把Object类型转换成Book类型。这种转换是强迫性的,而且并不安全。比如,如果有人

23、把一个字符串或者一个整数或者别的什么数据放进了同一个哈希表,而我们并不知情,那么当这个数据被取出来的时候,我们还试图用CType函数把这个数据转换成Book类型就会出现错误。,6.7.1关于类型安全 以上阐述的这个问题是在面向对象程序设计领域由来已久的类型安全(Type-safe)问题,它往往出现在集合中。集合为了保证通用性,一般都使用Object作为元素的数据类型,而这样一来,数据一旦放进了集合,就都成了Object类型,没办法知道它原来的类型了。 解决类型安全问题有很多方法,而.NET框架在这个方面也提供了比较好的支持。本节采取的方法是通过继承一个集合,使它特定于某个类型,这样做需要一定的

24、编码量,但是可以提供比较好的解决方法。 本节中要设计一个类型安全的哈希表,它只容纳Book类型的数据,如果想要把其他类型的数据放入表中,就没有办法通过编译。,6.7.2设计一个类型安全的哈希表 6.7.3展示类型安全概念的程序 6.7.4运行,6.7.5为什么要让它出错 使用BookHashTable的程序响应,应该是在意料之中的,BookHashTable只允许存放Book类型的数据,断绝了由于类型不相符而引发错误的可能性。而这种错误在使用HashTable的时候就表现出来了。首先,一个字符串被放进了哈希表中: ht.Add(aString, 一个字符串) 如果知道这是一个字符串,并且把它当

25、作一个字符串取出来,那么程序工作得很好: MessageBox.Show(ht.Item(aString) 如果不知道这是一个字符串,而以为这个元素是Book类型的,那么程序就出错了,图6.34中的第3个对话框所报告的异常,实际上是由下面的代码引起的: b = ht.Item(aString),由于HashTable并不是一个类型安全的集合,程序在编译的时候,这种错误是没有办法被发现的。所以直到运行的时候,错误才显现出来,而且是否出错还取决于哈希表中放了什么数据。如果在管理航天飞机飞行的软件中有这样的语句,它可能在整个测试过程中都潜伏着不出错,而等到航天飞机上了天,错误却暴露出来,这样的结果会

26、很可怕。 在BookHashTable的实现中使用了Shadows关键字,它让派生类的方法可以完全“遮蔽”基类中的方法。例如在基类HashTable中,Add方法接受Object类型的对象作为参数,也就是说,可以放入任何类型的数据;而派生类BookHashTable的Add方法只接受Book类型的数据,而且由于使用了Shadows关键字,基类的Add方法相当于完全不存在,于是在BookHashTable中就不能放入其他类型的数据了。,6.8 接触XML,6.8.1XML是什么 XML是近几年计算机界最热门的话题之一,甚至有人认为XML将成为今后所有计算机的公共“语言”,成为所有计算机相互交流的

27、工具。 那么,XML到底是什么?下面先展示一下XML的样子,再慢慢解释。下面就是一段标准的XML文档。, 鹿鼎记 20 金庸 A Room of Ones Own 30 Virginia Woolf Java编程思想 60 Bruce Eckel ,这是一个典型的XML文档,编辑好后可以保存为一个以.xml为后缀的文件。我们可以将此文档分为文档序言(Prolog)和文档主体两大部分。 此文件的第一行即是文档序言。该行是一个XML文档必须要声明的内容,而且也必须位于XML文档的第一行。在这里它声明了XML文档遵循的版本和使用的编码。在文档序言部分还可以有一些其他声明,这里就不多介绍了。 文档的其

28、余部分都属于文档主体,XML文档的内容信息存放在此。可以看到,文档主体是由开始的和结束的控制标记组成,这个称为XML文档的“根元素”。是作为直属于根元素下的“子元素”,在下又有、这些子元素,而信息就由这些元素组织起来。 可以看到,XML文件是相当简单的。同HTML一样,XML文件也是由一系列的标记组成,不过,XML文件中的标记是自定义的标记,具有明确的含义,我们可以对标记中的内容的含义做出说明。,6.8.2引用以前程序的代码 6.8.3为书籍信息编辑程序加上XML支持 6.8.4程序运行,6.8.5小结:如何处理XML文档 程序中用到了许多System.Xml命名空间中的类,而这些类与我们在本节开始时介绍的XML文档的特性有很多对应之处。首先是XmlDocument类。 Dim xmlDoc As New XmlDocument() xmlDoc.Load(.Books.xml) 顾名思义,XmlDocument代表一篇XML文档,此类的一个重要用途就是可以从文件系统中或者网络上装入XML文档。 在有了XmlDocument对象以后,就可以从中得到XML节点了,这

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论