【MCTS】Application Development Foundation 学习笔记---

来源:互联网 发布:淘宝联盟自动发链接 编辑:程序博客网 时间:2024/06/16 00:25

Focus 4 使用通用的引用类型

其实.NET Framework中大部分的类型都是引用类型。
引用类型提供了很强的灵活性,当他们被传入方法时拥有极好的执行效果。

 

那引用类型到底是什么呢?
引用类型在栈(stack)中存储着他们数据的存放地址,也就是所谓的指针。
而真正的数据被存储在一个叫堆(heap)的内存区域中,运行时通过一个叫垃圾收集的进程管理堆。
垃圾收集器会预先检查所需要的内存大小,然后释放不再被使用的内存,已分配给新的需要。
注意垃圾收集器执行释放无用的内存只有在需要时才发生,这个过程 是由GC.Collect监控的。

比较值类型和引用类型的变量间赋值过程我们就能发现值类型和引用类型的区别:
值类型是复制自身存储到新变量中,而引用类型则是复制其数值存贮的地址给新的变量。

 

内建的引用类型
在.NET Framework中大约有2500个内建的引用类型。继承自基类System.ValueType以外的所有类型都是引用类型。
下面是常用的应用类型:

System.Object         所有类都继承于它,是Framwork中最顶层的类,提供ToString(),GetType()和Equals()等成员方法。
System.String          文本数据类型
System.Text.StringBuilder   动态的文本数据类型
System.Array          所有数组的基类
System.IO.Stream    用于文件,终端 和网络输入/输出的缓存的抽象基类型。
System.Exception    用于处理系统和应用程序异常的基类型。

 

String 和 StringBuilder:
他们不只提供字符数据的存储容器还提供了大量的字符串处理的基本方法。
其中String是不可变的,这就意味着修改它时,系统会废弃以前的字符串而重新创建一个新的字符串。


如下过程系统将创建四次字符串,其中前3次的字符串将被当作垃圾抛弃:
s="wombat";        //"wombat"
s+=" kangaroo";    //"wombat kangaroo"
s+=" wallaby";     //"wombat kangaroo wallaby"
s+=" koala";       //"wombat kangaroo wallaby koala"


所以我们应该尽量的避免这样造成不必要垃圾的操作过程。
我们应该学会用 String类提供的Concat,Join 或者Format等方法来连接多个子字符串。
另一种解决方法就是用StringBuilder类来创建动态的字符串。

在StringBuilder类创建时会首先创建一个16字节的缓存,然后根据需要增长,或者用户自己指定初始长度和最大长度。


System.Text.StringBuilder sb = new System.Text.StringBuilder(30);
sb.Append("wombat"); // 创建字符串.
sb.Append(" kangaroo");
sb.Append(" wallaby");
sb.Append(" koala");
string s = sb.ToString(); // 把缓存中的字符串转化成string字符串.
Console.WriteLine(s);

 

另外,String类对System.Object类中的操作符进行了重写:
我们可以直接运用+,==,!=和= 直接进行字符串间的连接,等同判断,不等判断和赋值。

 

如何创建和排序数组?
数组定义一系列的同质元素集合存储区域,并包含对这些元素的基本操作方法。

 

int[] ar={3,1,2};//定义并初始化数组
Array.Sort(ar); //给ar数组排序
Console.Write("{0},{1},{2}",ar[0],ar[1],ar[2]);

 

怎样使用流?
流是另一个通用的类型,因为从硬盘上读取和写入以及在网络中传输数据都离不开它。
System.IO.Stream类是一个所有具体流类型的基础类型。


下面是常用的具体的流类型:
FileStream                 用于创建从文件读写数据的基本流对象
MemoryStream        用于创建从内存中读写数据的基本流对象
StreamReader           用于创建从流中读取数据的对象
StreamWriter           用于创建向流中写入数据的对象

 

如:

// 创建一个文本文件并写入数据
StreamWriter sw = new StreamWriter("text.txt");
sw.WriteLine("Hello, World!");
sw.Close();

// 读取一个文本文件的数据并显示
StreamReader sr = new StreamReader("text.txt");
Console.WriteLine(sr.ReadToEnd());
sr.Close();

 

如何抛出并捕获异常?
异常是打破一个程序集正常执行的一些意外事件。
我们不能让异常的发生使的我们的程序彻底失败,而是预先的计划它的发生的可能,捕获它,并对其进行处理。
如下为处理异常的方法体:
try
{
 StreamReader sr = new StreamReader(@"C:/boot.ini");
 Console.WriteLine(sr.ReadToEnd());
}
catch (Exception ex)
{
 // 如果在读取文件过程中发生异常就显示异常的描述信息
 Console.WriteLine("Error reading file: " + ex.Message);
}
finally
{
 // 无论是否发生过异常,异常是否得到处理 都要进行关闭流操作
 sr.Close();
}

 

其中Exception基类包含异常的描述信息和其他的应用程序数据。
.NET Framwork 中定义了近百个异常类来描述各种不同的异常事件,同时还提供了另一个基类:System.ApplicationException
通过继承它我们可以定义更加细致的描绘用户自定义异常的类。

当在Catch块中定义多个处理时,运行时会只执行相应的错误处理,所以catch块中处理的顺序应该是有具体到概括形成异常过滤层次。
finally块进行善后处理。

 

 

 

简单学习了通用的引用类型,接下来该看怎么构造类了,希望能坚持学习下去。

原创粉丝点击