也许你也认同,与记事本和命令提示符相比,TextPad是更好用的工具。但是,TextPad(目前)还不能对C#代码、GUI(图形用户界面)设计人员、项目模板或数据库操作工具提供智能感知(IntelliSense)的能力。
此时,可以运行程序了(使用Debug→Run菜单项)。毫无疑问,当单击按钮时,窗体的标题将如期进行更新。 现在对于启用和运行SharpDevelop IDE,已经讲得足够多了。尽管对于这个工具还有很多内容可以讲,但我希望你现在对基本知识有了良好的理解。
至此,对读者来说,创建单文件程序集和多文件程序集都已不在话下。但老实说,可能99.99%的程序集都是单文件程序集。虽然如此,多文件程序集可以帮助我们把大的二进制程序集分拆为更细的单元(这对于远程下载非常有用)。接下来,我们开始学习私有程序集的概念。
注解 在第22章ADO.NET的研究中,我们将学习<connetionStrings>配置元素和对应的System. Configuraion命名空间中的新类型。这些.NET2.0新引入的机制为处理连接字符串数据提供了统一的方式。
我们首先要讨论的用于I/O的类型是DirectoryInfo类。它包含一组用来创建、移动、删除和枚举所有目录/子目录的成员。表
有必要知道,大部分FileInfo类的成员返回一个I/O相关的特定对象(FileStream、StreamWriter等),让我们以不同格式从关联文件读或向关联文件写数据。下面会谈到这些类型,不过现在先来研究使用FileInfo类类型来获取一个文件句柄的各种方法。
使用这么多看上去差不多的方法实现文件I/O操作虽说让我们有点困惑,但是这样的确增加了很多灵活性。无论如何,已经看到了怎样使用StreamWriter和StreamReader类型从指定文件写入、读取信息,下面再来研究StringWriter和StringReader类的作用。
使用StringWriter和StringReader类型我们可以将文本信息当作内存中的字符一样来处理。当想为基层缓冲区添加基于字符信息的时候,它们就非常有用。在
最后研究的读取器/编写器组是BinaryReader和BinaryWriter,它们都从System.Object直接派生。这些类型可以让我们从基层流中以简洁的二进制格式读取或写入离散数据类型。
如果读者能回想起委托的运行过程,那么这个例子(对读者来说)的唯一兴趣点是为了让 FileStream 类型支持异步处理,必须使用一个(这里所显示的)特殊的构造函数。最后一个System.Boolean类型的参数(当它的值设置为true时)告诉FileStream对象在次线程上执行I/O的处理。
回想一下,如果有一些不想被持久化到对象图中的数据点,可以有选择地把公共或私有字段标记为[NonSerialized],像对Radio类型中的字符串域所做的那样。
注意当调用Deserialize()时,传递了stream派生的类型,它表示被持久化的对象图的位置(在这个例子中也是文件流)。简而言之,用[Serializable]特性标记每个你希望持久化到流中的类。
当一个格式化程序反序列化一个不包含这样的OptionalField属性的对象时,不会再抛出运行时异常,被保存的数据将被映射回已存在的域中(在这个例子中是BackgroudColor和ForegroundColor),而剩下的字段就设置为默认值。
当然,有大量其他的特性可被用来控制XmlSerializer生成最终的XML文档的方式。如果你希望了解所有的选项,请在.NET Framework 2.0 SDK文档中查找System.Xml.Serialization命名空间。
下一个格式化程序的选择是SoapFormatter类型。SoapFormatter类型将把对象图持久化为一个SOAP消息,当希望使用HTTP协议远程分派对象时,这个方式是一个可靠的选择。
至此,我们的整个开发流程到此结束。当然,开发中还会有一些细节问题,比如大数据传输,还有DataSet数据带出等等。将在后面完成项目进行补充。