**************************
***第一章FRAMEWORK基础*****
**************************
.NET Framework 是 Microsoft Windows 组件旨在支持下一代应用程序和服务的整数。 .NET 很多基础知
识框架将开发人员曾在其他面向对象的开发环境中所熟悉 ; 但是,.NET Framework 还包括到甚至最有
经验的开发人员的新的很多新的元素。本章概述了包括这本书中的每个其他章所需的知识的.NET
Framework 编程。
--------------------------------------------------------------------------------
注意:
如果您曾与版本的.NET Framework 2.0 版之前公布,大部分这将熟悉。 但是,.NET Framework 2.0 版
包括若干新功能: 泛型、 分部类和类型转发 (所有 “ 构造类 ” 第 3 课中所述)。
--------------------------------------------------------------------------------
本章中的考试目标:
一:通过使用.NET Framework 2.0 系统类型管理.NET Framework 应用程序中的数据。 (请参阅 System
命名空间)
1、值类型
2、引用类型
3、属性
4、泛型类型
5、异常类
6、装箱和拆箱
7、TypeForwardedToAttribute 类
二:实现.NET Framework 接口要遵守标准的组件。 (请参阅 System 命名空间)
1、IComparable 接口
2、IDisposable 接口
3、IConvertible接口
4、ICloneable 接口
5、IEquatable 接口
6、IFormattable接口
三:控制通过使用事件和委托的.NET Framework 应用程序组件之间的交互。 (请参阅 System 命名空间
)
1、委托类
2、事件类
3、EventHandler 委托
在开始之前
本书假定您使用.NET Framework 1.0、 NET Framework 1.1 和 NET Framework 2.0 有最少两至三年
的经验开发基于 Web 的 Microsoft 基于 Windows 或分布式应用程序。 候选人应把有工作知识的
Microsoft Visual Studio 2005。 在开始之前您应该熟悉 Microsoft Visual Basic 或 C#,属熟悉下列
任务:
1、在 Visual Studio 使用 Visual Basic 或 C# 中创建控制台或 WindowsForms 应用程序。
2、将命名空间和系统类库的引用添加到项目。
3、在 Visual Studio 中运行项目设置断点、 逐句通过代码,观看变量的值。
====================
====第 1 课: 使用值类型===
====================
在.NET Framework 主要数字和布尔的类型中,最简单类型是值类型。 值类型是包含其数据直接而不
是包含对其他地方存储在内存中数据的引用的变量。 值类型的实例存储在内存调用堆栈的运行库可以创
建、 读取、 更新,和与最低开销快速删除它们的区域。
--------------------------------------------------------------------------------
关于参考类型更多信息
有关引用类型相关的信息请参阅第 2 课。
--------------------------------------------------------------------------------
有三种一般值类型:
1、布尔类型
2、用户自定义类型
3、枚举类型
每一种类型都是从 System.Value 基类型派生的。 以下各节介绍如何使用这些不同类型。
本课程后您将能够:
1、选择最有效的内置值类型
2、声明值类型
3、创建你自己的类型
4、使用枚举类型
估计课时间: 30 分钟
内置值类型
内置类型是生成其他类型的基类型。所有内置数值类型都是值类型。您选择基于您希望使用的值的大小和
精度您需要的级别为数值类型。
这些数值类型被如此频繁使用 Visual Basic 和 C# 为它们定义别名。 使用别名等同于使用完整的
类型名称,因此大多数程序员使用较短的别名。 除了,数值类型列出在表 1-2 中,非数值数据类型也是
值类型。在框架有近 300 多个值类型,基本满足了需要。值类型变量之间分配时,数据和变量在不同的
堆栈上。此行为是不同的和第 2 课中讨论的引用类型。
即使值类型通常表示简单值,他们仍作为对象。 换句话说,您可以对它们调用方法。其实,它是通用的
显示值作为文本时使用 ToString 方法。 从基本 System.Object 类型重写 ToString
注意 对象基类
在.NET Framework 中所有类型都派生自 System.Object。 这种关系有助于建立使用整个 Framework
通用类型系统。
如何声明值类型
如果要使用一个类型,你必须生命一个该类型的实例。值类型有一个隐式的构造函数,因此它们自动声明
实例化类型;不必像类那样包含new关键字。构造函数分配默认值通常是NULL或0到新实例。但下面的代码
所示应始终显式在声明变量块初始化内:
bool b = false;
如果要能够确定是否尚未分配一个值,声明为空的变量。例如如果您存储数据是从窗体和用户没有问题并
没有回答问题,您应存储空值。 以下代码允许为是 true、 false,或其他的布尔变量:
// C#
Nullable<bool> b = null;
//简写表示法
bool? b = null;
作为空启用 HasValue 和 Value 成员声明变量。 有值用于检测已设置一个值:
// C#
if (b.HasValue)Console.WriteLine("b is {0}.", b.Value);
else Console.WriteLine("b is not set.");
怎样创建用户自定义类型
用户定义的类型也称为结构或只是结构,用于创建它们在语言关键字后。与其它值用户定义类型的实
例存储在堆栈上,并且他们直接包含其数据。 在大多数其它方面几乎与类的行为相同。
结构是一个复合使其易于使用的相关数据的其他类型。最简单的例子是 System.Drawing.Point 其中
包含定义水平和垂直坐标的一点的 X 和 Y 整数属性。 Point 结构简化使用坐标通过提供构造函数和此
处显示的成员:
// C# - Requires reference to System.Drawing
// Create point
System.Drawing.Point p = new System.Drawing.Point(20, 30);
// Move point diagonally
p.Offset(-1, -1);
Console.WriteLine("Point X {0}, Y {1}", p.X, p.Y);
通过使用 Visual Basic 中的结构关键字或 struct 关键字在 C# 中的定义您自己的结构。 例如以
下代码创建一个类型,由构造函数设置的最小和最大值之间循环通过一套整数:
// C#
struct Cycle
{
// Private fields
int _val, _min, _max;
// Constructor
public Cycle(int min, int max)
{
_val = min;
_min = min;
_max = max;
}
public int Value
{
get { return _val; }
set
{
if (value > _max)
_val = _min;
else
{
if (value < _min)
_val = _max;
else
_val = value;
}
}
}
public override string ToString()
{
return Value.ToString();
}
public int ToInteger()
{
return Value;
}
// Operators (new in .NET 2.0)
public static Cycle operator +(Cycle arg1, int arg2)
{
arg1.Value += arg2;
return arg1;
}
public static Cycle operator -(Cycle arg1, int arg2)
{
arg1.Value -= arg2;
return arg1;
}
}
您可以使用此结构来表示项目,如程度的旋转或宿舍一足球场游戏一个固定范围内重复,如下所示:
// C#
Cycle degrees = new Cycle(0, 359);
Cycle quarters = new Cycle(1, 4);
for (int i = 0; i <= 8; i++)
{
degrees += 90; quarters += 1;
Console.WriteLine("degrees = {0}, quarters = {1}", degrees, quarters);
}
周期示例可以轻松地转换至为引用类型的值类型通过类更改结构/结构关键字。 如果进行的更改则应周期
类的实例会拨在托管堆上而不是 12 字节上堆栈 (为每个专用整数字段的 4 个字节) 和两个变量结果
在两个变量指向同一个实例之间的分配。
类似功能时结构是通常比类更有效。
您应定义一个结构而不是如果该类型将执行的类作为值更好地键入比引用类型。 具体来说,结构类
型应满足所有这些准则:
1、逻辑上表示单个值
2、有一个实例大小小于 16 字节
3、将创建后不会更改
4、不会被转换为引用类型
怎样创建枚举类型
枚举是具有固定值的相关的符号。 使用枚举来使用您的类的开发人员提供的选择列表。 例如以下枚
举包含一组的标题:
// C#
enum Titles : int { Mr, Ms, Mrs, Dr };
如果您创建了标题类型实例的 Visual Studio 将显示可用值的列表时将一个值分配给变量,。 但变量的
值是一个整数,是易于输出而它的值如下所示的符号名称在这里:
// C#
Titles t = Titles.Dr;
Console.WriteLine("{0}.", t); // 显示 "Dr."
枚举旨在简化编码和改善代码可读性,使您可以使用有意义的符号而不是简单的数值。 时使用您的
类型的开发人员必须从一组有限的一个值,选择的选择,请使用枚举。
声明和使用值类型
以下练习演示如何创建和使用结构以及如何创建枚举。 如果遇到完成一次,已完成的问题项目有代码文
件夹中附带 CD 上:
行使 1: 创建一个结构
在本练习您将创建一个简单的结构与多个公共成员。
1.使用 Visual Studio 创建新的控制台应用程序项目。 该项目命名为CreateStruct。
2.创建新的结构名为 Person,按下面的代码演示。
// C#
struct Person
{
}
3.在Person结构里生命三个公共成员
❑ firstName (a String)
❑ lastName (a String)
❑ age (an Integer)
以下代码演示了这一点:
// C#
public string firstName;
public string lastName;
public int age;
创建一个构造函数定义所有三个成员变量,如下面的代码演示
// C#
public Person(string _firstName, string _lastName, int _age)
{
firstName = _firstName;
lastName = _lastName;
age = _age;
}
.重写 ToString 方法以显示Person firstName、 lastName和age。 以下代码演示了这一点:
public override string ToString()
{
return firstName + " " + lastName + ", age " + age;
}
6.在控制台应用程序主方法编写代码以创建结构的一个实例,并将该实例传递给该 Console.WriteLine
方法 下面的代码演示了:
// C#
Person p = new Person("Tony", "Allen", 32);
Console.WriteLine(p);
7.运行控制台应用程序以验证正确工作。
行使 2: 将枚举添加到一个结构
在本练习您将扩展运动 1 中创建加入枚举结构。
1.打开计划 1 中创建的项目。
2.声明人结构中的新枚举。 名称,枚举Genders并指定两个可能值: 男性和女。 下面的代码示例
演示了这种情况:
// C#
public enum Genders : int { Male, Female };
3.添加公共成员的键入Genders,和修改Person构造函数接受的性别实例。 以下代码演示了这一点:
// C#
public string firstName;
public string lastName;
public int age;
public Genders gender;
public Person(string _firstName, string _lastName, int _age, Genders _gender)
{
firstName = _firstName;
lastName = _lastName;
age = _age;
gender = _gender;