Part VII: Leveraging the .NET Framework
CHAPTER 24 Working with Collections and Strings
24.1 Working with Collections
在c# 2.0中,使用范型编程,这三个集合类被使用的次数不多了,但是在Asp.Net Unleashed 2nd写作的时候,2.0的规范应该还没有发布,粗略说一下吧
Using the ArrayList Collection
ArrayList在c# 2.0中,已经有了范型版
ArrayList的背后,其实是一个数组,只不过ArrayList会自动扩充数组,以便能够装下更多的元素
Adding Items to an ArrayList
ArrayList.Add()方法,在ArrayList的末尾增加一个元素
ArrayList.Insert()方法,在指定的位置增加一个元素
ArrayList.Repeat()方法,加入指定重复次数的元素到ArrayList中
ArrayList.AddRange()/ArrayList.InsertRang()发放,加入一个其他ArrayList到当前的ArrayList中
Removing Items from an ArrayList
ArrayList.Remove(),移出一个元素
ArrayList.RemoveAt(),移除指定位置的元素
ArrayList.RemoveRange(),移除指定范围内的元素
ArrayList.Clear(),移除所有的元素
Iterating Through the Items in an ArrayList
For each循环完成迭代遍历
Sorting Items in an ArrayList
ArrayList.Sort()方法完成排序
Searching for Items in an ArrayList
ArrayList.Contains()方法,判断是否具有和给定参数同样值的元素
ArrayList.BinarySearch(),Contrains方法对于元素众多的ArrayList,效率很低,这个时候需要使用ArrayList.BinarySearch()进行二分法查找,当然,在使用二分法查找前,必须对ArrayList进行排序
ArrayList.IndexOf()方法,返回具有和给定参数同样值的元素的索引
Using the HashTable Collection
HashTable,存储键值对
Adding Items to a HashTable
HashTable.Add()方法,加入一个键值对
HashTable(key) = value,也可以增加一个键值对
Removing Items from a HashTable
HashTable.Remove()方法,和给定参数想等的键所属的键值对被移除
HashTable.Clear(),清空HashTable,移除其内存储的所有键值对
Searching for Items in a HashTable
HashTable.Contains()方法,将传入参数和每一个键值对的键进行比较
HashTable.ContainsValue()方法,将传入参数和每一个键值对的值进行比较,速度慢于HashTable.Contains()方法
Iterating Through the Items in a HashTable
For Each循环
Using the SortedList Collection
SortedList类,在c# 2.0版本中,也有了范型版
SortedList背后是两个数组,一个用于存放key,一个存放value
Adding Items to a SortedList
和HashTable的增加元素的方式相同,也是两种,不多说了
Removing Items from a SortedList
SortedList.Remove() / SortedList.RemoveAt() / SortedList.Clear()三个方法的解释看上面的ArrayList和HashTable
Iterating Through the Items in a SortedList
For Each循环
Finding Items in a SortedList
和HashTable类似
24.2 Working with Strings
Formatting Strings
String.Format()方法,在参数字符串中,使用{}作为占位符,代表了其他的参数
Formatting Numbers
使用Int变量的ToString()方法,并在其中传入参数,指定输出格式
Formatting Currency
使用Decimal变量的ToString()方法,在其中传入参数,指定输出格式
Formatting Dates and Times
使用DateTime变量的ToString()方法,在其中传入参数,指定输出格式
Formatting Strings for Different Cultures
使用ToString()方法,并指定CultureInfo类型的参数
Using String Methods and Properties
Comparing Two Strings
使用"=="就可以进行判等操作
使用String.Compare()方法,通过参数可以指定是否区分大小写,根据返回值可以确定两个字符串的大小相等关系
Removing Characters from a String
Trim() / TrimStart() / TrimEnd(),默认情况下,三个方法都会清除空格,Trim()方法清除首尾的空格,TrimStart()清除字符串头部的空格,TrimEnd()方法清除尾部的空格
Remove()方法,根据传入的参数移除相应的字符
Finding Characters in a String
IndexOf() / IndexOfAny() / LastIndexOf() / StartsWith() /EndsWith(),都是此类的方法
IndexOf()方法,返回第一个匹配传入参数的位置
IndexOfAny()方法,从字符串中找出匹配传入的数组参数中任何一个元素的位置
LastIndexOf()方法,返回最后一个匹配的元素的位置
StartsWith()方法,字符串头部是否匹配传入的字符串
EndsWith()方法,字符串尾部是否匹配传入的字符串
Modifying a String
String.Replace()方法,替换字符串中的某一个部分
String.Insert()方法,将参数插入到字符串中
String.SubString()方法,截取字符串中的某一个部分
String.ToUpper() / String.ToLower()方法,将字符串转换为大/小写
Splitting and Joining Strings
String.Split()方法,根据传入的字符数组参数,把字符串切分成若干小段字符串
String.Join()方法,把几个字符串拼成一个大的字符串,使用加号"+"也可以完成
Using the StringBuilder Class
在处理大尺寸的字符串的时候,使用StringBuilder类更高效
Appending Strings to a StringBuilder
使用StringBuilder.Append()方法,把传入的字符串参数插入到StringBuilder实例的末尾
Inserting and Removing Strings with a StringBuilder
StringBuilder.Insert()方法,在指定位置插入字符串
StringBuilder.Remove()方法,移除指定位置的字符串
Replacing Strings with a StringBuilder
StringBuilder.Replace()方法,替换字符串
Iterating Through the Contents of a StringBuilder
使用for循环,遍历StringBuilder
Converting a StringBuilder to a String
StringBuilder.ToString()方法,将StringBuilder转换为字符串
24.3 Working with Regular Expressions
正则表达式,可以用于复杂格式的操作,可以用于复杂模式的匹配,可以用于查找,可以用于替换
正则表达式,很厉害的技术,但是需要记忆的东西太多,放弃这部分的学习,用到的时候看看
Using Regular Expression Classes
Examining Elements of a Regular Expression
Matching Single Characters
Matching Special Characters
Matching Alternative Sequences of Characters
Matching with Quantifiers
Identifying Regular Expressions and Greed
Capturing and Backreferences
Using Replacement Patterns
Setting Regular Expression Options
CHAPTER 25 Working with the File System
25.1 Security and the File System
默认情况下,ASP.Net进程运行在ASPNET用户的安全Context中,所以没有权限将一个文件写入到目录中。这就需要设置。赋予ASPNET帐号对某一个目录的写权限
25.2 Using Files and Directories
Creating and Reading Text Files
Writing to a Text File
File.CreateText()方法,获得一个StreamWriter类的实例,调用StreamWriter.Write()方法,这样,创建了一个新的文本文件,并把内容写入到其中
File.AppendText()方法,获得一个StreamWriter类的实例,调用StreamWriter.Write()方法,这样,把内容增加到文本文件的末尾
Reading from a Text File
File.OpenText()方法,获得一个StreamReader类的实例,调用StreamReader.Read()方法,获取文本文件每一行的内容
Creating and Reading Binary Files
Writing to a Binary File
创建一个FileStream类的实例,
创建FileStream()类的实例的时候,通过指定FileMode,可以确定打开文件的方式,具体是,
FileMode.Append / FileMode.Create / FileMode.CreateNew / FileMode.Open / FileMode.OpenOrCreate / FileMode.Truncate,具体意思是,把内容插入到文件末尾或者创建新文件 / 覆盖已经存在的文件或者创建新文件 / 创建新文件,如果文件已经存在,报错 / 打开一个文件 / 打开一个文件,如果文件不存在,就创建一个 / 开发文件,移除文件中所有内容
创建了FileStream实例后,使用这个实例初始化一个BinaryWriter实例
使用BinaryWriter.Write()方法,写入文件
Reading from a Binary File
创建一个FileStream类的实例
使用FileStream实例初始化一个StreamReader类的实例
调用StreamReader.ReadInt32() / StreamReader.ReadByte() / StreamReader.ReadBoolean()方法来读取内容
Displaying the Contents of a Directory
可以使用Directory类的方法或者DirectoryInfo的方法完成特定目录的内容展现
使用Directory和DirectoryInfo的区别在于,前者是类方法,后者是实例方法
Retrieving Path Information
使用Path方法,可以获取路径信息
25.3 Using Serialization
Using Binary Serialization
BinaryFormatter,可以把单个对象或者一组对象序列化为二进制格式,BinaryFormatter类最重要的两个方法,
BinaryFomatter.Serialize(),序列化
BinaryFomatter.Deserialize(),逆序列化,反序列化
只有属性具有Serializable attribute的类或者实现了ISerializable接口的类才能够被序列化
BinaryFormatter类和XMLSerializer类的区别在于,
使用BinaryFomatter进行序列化的时候,对象的所有成员都会被序列化,无论是否是public的,而XMLSerializer只会序列化public成员
无法读取BinaryFomatter的输出,因为被序列化成了二进制格式,无法读取,同时,也意味着尺寸小于XMLSerializer序列化为xml文件的尺寸
Serializing an ArrayList
就是把ArrayList的实例和一个FileStream的实例传递给BinaryFormatter.Serialze()方法就可以了,其中,
ArrayList的实例,指定了要被序列化到文件中的内容
FileStream的实例,指定了文件的位置
Serializing a Class
被序列化的类必须有Serializable attribute声明或者实现了ISerializable接口
调用BinaryFomatter.Serialize()方法,进行序列化,就可以了
Using XML Serialization
可以把单个对象或者一组对象序列化为xml格式
Serializing a Class
使用XMLSerializer.Serialze()方法和XMLSerializer.Deserialze()方法完成序列化和逆序列化
在实例化XMLSerializer的时候,必须提供被序列化的对象的根类
Controlling Serialization
默认情况下,XMLSerializer把属性序列化为XML中的元素,但是,可能有的人或者有的需求需要把类中的属性转换为xml中的属性
可以通过在被序列化的类的属性上声明attribute,来更改被序列化后的格式,具体有
XmlArrayAttribute,表明代表了数组的类的属性被序列化为XML数组
XmlArrayItemAttribute,和XmlArrayAttribute一同使用,表明数组中元素如何被序列化
XmlAttributeAttribute,表明类的属性被序列化为Xml的属性
XmlElementAttribute,表明属性被序列化为XML的元素
XmlEnumArribute,指明了枚举值如何被序列化
XmlIgnoreArribute,指明了属性不被序列化
XmlIncludeAttribute,指明了属性需要被序列化
XmlRootAttribute,指明了类需要被序列化为xml文档的根元素
XmlTextAttribute,指明了属性需要被序列化为xml文本
XmlTypeAttribute,指明了属性需要被序列化为xml类型
CHAPTER 26 Sending Email and Accessing the Network
26.1 Sending Email From an ASP.NET Page
The Microsoft SMTP Service
MS的SMTP服务提供了基本的收发邮件的功能,但是不提供POP协议的支持。也就是说,不能够为多个用户创建邮箱帐号,不能够使用outlook之类的工具接收邮件
Configuring the Microsoft SMTP Service
How the Microsoft SMTP Service Works
Sending a Simple Email Message
可以使用SmtpMail类发送email,使用SmtpMail.Send()方法来完成
默认情况下,SmtpMail使用本地的电子邮件服务器发送email,通过设置SmtpMail.SmtpServer属性,可以使用网络上其它的邮件服务器发送邮件
Using the MailMessage Class
SmtpMail类非常的简单,只能够发送简单的邮件,复杂的还是需要MailMessage类来完成
MailMessage有很多属性,
Attachments,附件
Bcc/Cc,设置密送/抄送人员列表
Body,邮件正文
BodyEncoding,邮件正文编码方式
BodyFormat,正文的样式,或者是text文本或者是Html格式
From / To,发送人 / 接收人
Headers,用于email的头
Priority,优先级
Subject,主题
Adding Attachments to an Email Message
附件,使用MailAttachment类的实例来完成
MailAttachment类有两个重要属性,
FileName,作为附件的文件的位置
Encoding,编码方式
Sending HTML Email
默认,SmtpMail类发送的邮件是文本格式,设定SmtpMail.BodyFormat为MailFormat.Html,并且拼装SmtpMail.Body属性,可以发送HTML格式的正文
Using Links and Images in HTML Email
不用相对位置作为路径,应该是使用绝对定位,因为邮件接收者说不定在哪里呢
26.2 Using Message Queuing
Email实现了人与人之间的通讯,消息队列实现了应用程序之间的通讯
消息队列和web服务之间的异同
两者都是推动了应用程序之间的通讯
Web服务基于公开的标准,即使应用程序实现在不同的平台和操作系统之上,都无所谓,都是可以互相通讯的
消息队列,比Web服务更加成熟,但是,不是公开的
Configuring Microsoft Message Queuing
消息服务在windows中是可选项,需要自定义安装
还需要在web.config文件中进行设置
Working with Message Queues
消息队列支持两种类型的用户队列,
public queues,在一个域内所有的服务器上都是可用的
private queues,在本机的应用程序之间通讯
Retrieving a List of Queues
使用MessageQueue.GetPublicQueues()方法可以获取网络上所有公共对列的列表
Creating a New Queue
使用MessageQueue.Create()方法,可以创建一个队列
Sending Messages to a Queue
使用MessageQueue.Send()方法,可以把一个消息发送到对列中
Retrieving Messages from a Queue
使用MessageQueue.GetMessageEnumerator()方法,可以获得一个迭代器,从而根据优先级遍历所有的消息
Displaying the Body of a Message
默认情况下,消息的主体是被序列化为XmlMessageFormatter格式。序列化是在发送消息的时候自动完成的
但是,在接收消息的时候,需要开发员自己去处理逆序列化的问题了,需要告诉XmlMessageFormatter,消息的主题的类型
Sending and Receiving Complex Messages
复杂消息,也就是自定义对象也可以被发送到消息队列中,当然,也可以被接收回来,否则,消息队列还不被撑死?唯一的要求是,对象不能够大于4M
26.3 Accessing Other Web Sites with the HTTP Protocol
Using the WebClient Class
从其他站点抓取页面的最容易的办法就是用WebClient类,WebClient类有三个方法用于下载数据
WebClient.DownLoadData()方法,从一个网址返回一个byte数组
WebClient.DownLoadFile()方法,把从网址获得的文件保存在本地
WebClient.OpenRead()方法,从网址返回一个流
Using the HttpWebRequest Class
如果不使用WebClient类,可以使用HttpWebRequest和HttpWebResponse类来抓取页面,这两个类比webclient类难用,但是功能更强大
Resolving Domain Names
使用System.Net.Dns类,可以把IP地址和域名进行转换
Dns的方法有,
Dns.GetHostByAddress()方法,从Ip地址返回一个IPHostEntry
Dns.GetHostByName()方法,从域名返回一个IPHostEntry
Dns.Resolve()方法,从IP地址或者域名返回一个IPHostEntry
CHAPTER 27 Creating Graphics On-the-Fly with GDI+
27.1 Building Simple Images
书中举了一个简单的入门级别的例子,步骤如下,
设定页面的content type,通过形如
<%@ Page ContentType="image/gif? %>的指令,指定了页面的content type
创建一个代表了图像的bitmap
把bitmat保存到http输出流中
27.2 Drawing Objects with GDI+
Creating a Bitmap
Working with the Graphics Object
Setting Graphics Quality
Using Colors
Converting Colors
Setting a Color's Alpha Value
Using Brushes
Using the Standard Brushes
Using SolidBrush
Using HatchBrush
Using LinearGradientBrush
Using PathGradientBrush
Using TextureBrush
Using Pens
Using the Standard Pens
Creating Custom Pens
Setting Pen Styles
Setting Pen Cap Styles
Setting Pen Line Join Styles
Drawing a Rectangle
Drawing a Line
Drawing an Ellipse
Drawing a Curve
Drawing a Bezier Curve
Drawing an Arc
Drawing a Pie Section
Drawing a Polygon
Drawing an Image
27.3 Drawing a String of Text
使用Graphics.DrawString()方法,可以完成画一个文本的功能
27.4 Building Sample GDI+ Applications
Creating an ASP.NET Paint Application
讲了一个画图的页面的制作
Creating a Simple Chart Application
如果在一个控件中绘图,可能会有用得到的时候