资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第6章 域、属性与事件本章要点:l 域的定义及使用l 属性的概念l 委托的概念与使用l 事件6.1 域 域(Field)又称成员变量(Member Variable),它表示类属性的存储 位置,是C#类中不可缺少的一部分。域的声明格式如下:域修饰符 域类型 域名域的修饰符包括new、public、protected、internal、private、 static、readonly等,分别代表不同的含义。6.1 域 6.1.1 域的初始化 C#编译器缺省将每一个域初始化为它的默认值。C#推荐的做法是在实例化对象的同时对对象域进行初始化。C#中对域进行初始化有两种: l 声明的同时进行初始化 l 在构造器内进行初始化。域的默认初始化将分为两种情况。对于静态域,类在装载时对其进 行初始化;而对于非静态域,在类的实例创建时进行初始化。在默 认的初始化之前,域的值是不可预测的。 6.1 域 6.1.2 只读域与readonly关键字 域的声明中如果加上了readonly修饰符表明该域为只读域。只读域 只能在域的定义中和它所属类的构造函数中进行修改,在其它情况下是 只读的。 只读域具有如下特征: l 只读域只能在初始化(声明初始化或构造器初始化)的过程中赋值 ,其他地方不能进行对只读域的赋值操作,否则编译器会报错。 l 只读域可以是实例域也可以是静态域。 l 只读域的类型可以是C#语言的任何类型。6.2 属性 属性是对现实世界中实体特征的抽象,它提供了一种对类或对象的 特性的访问机制。属性所描述的是状态信息,在类的某个实例中,属性 的值表示该对象相应的状态值。属性是C#中独具特色的新功能。通过属性来读写类中的域,这种机 制具有一定的保护功能。在其它语言中,对域的访问功能通常是通过实 现特定的getter和setter方法来实现的。6.2 属性 6.2.1 属性的声明 C#中属性采用如下方式进行声明:属性修饰符 属性的类型 属性名称访问声明 set;get;属性的修饰符包括:static:静态属性,一个静态属性与特定的实例无关,并且在静态 属性的访问符中使用this是错误的。在一个静态属性中包括virtual、 abstract或override 修饰符也是错误的。一个非静态(实例)属性与一 个类中特定的实例相关,并且这个实例可以被属性访问符中的this访问 。6.2 属性 6.2.1 属性的声明 virtual:虚拟属性,虚拟属性的执行可以被派生类改变。改变一 个继承的虚拟方法执行的过程被称为属性重载。 相反,非虚拟属性的 执行是不变的:不管属性是否在所声明的类的实例或派生类的实例中被 访问,执行都是相同的。override:覆盖属性,一个覆盖属性用相同的签名覆盖一个继承的 虚拟属性。然而一个虚拟属性声明引入一个新属性,一个覆盖属性声明 通过提供这个属性访问符或访问符的新执行来对存在的继承德虚拟属性 进行特殊化。 6.2 属性 6.2.1 属性的声明 abstract:抽象属性。一个抽象属性隐含的也是一个虚拟属性。一个抽象属性声明引入一个新虚拟属性,但是没有提供属性访问符 或访问符的执行。作为替代,非抽象派生类需要为访问符或覆盖的属性 的访问符提供它们自己的执行。因为一个抽象属性声明的访问符不提供 实际执行,它的访问符主体就完全由分号组成。抽象属性声明只被允许存在于抽象类中,一个抽象属性声明包括 static或virtual修饰符是错误的。6.2 属性 6.2.1 属性的声明 根据get和set访问器是否存在,属性可分成如下类型。 l 读写(read-write)属性:同时包含 get 访问器和 set 访问器 的属性。 l 只读(read-only)属性:只具有 get 访问器的属性。将只读属 性作为赋值目标会导致编译时错误。 l 只写(write-only)属性:只具有 set 访问器的属性。除了作 为赋值的目标外,在表达式中引用只写属性会出现编译时错误。6.2 属性 6.2.2 属性的访问 在属性的访问声明中,对属性的读操作用get访问符标出,而对属 性的写操作用set访问符标出。 请参考示例,体会属性的访问。由于属性的set访问器中可以包含大量的语句,因此可以对赋予的 值进行检查及进行一些其他必要操作,如果值不安全或者不符合要求, 就可以进行提示。这样就可以避免因为给类的数据成员设置了错误的值 而导致的错误。 6.2 属性 6.2.2 属性的访问 class ageprivate int _age; /私有int类型域_agepublic int AttributeAge /定义AttributeAge属性封装 _age域Get /Get访问器return _age;set /set访问器,在设置属性值时进行有效性验证if(value 0)Console.WriteLine(“输入值非法!“);else_age = value; 6.2 属性 6.2.2 属性的访问 class TestAge static void Main(string args)age Age = new age();Console.WriteLine(“Please input age“);/设置属性值,可以通过输入非法值检验其有效性验证功能Age.AttributeAge = Int32.Parse( Console.ReadLine();/输出属性值Console.WriteLine(“Age is 0“,Age.AttributeAge);Console.ReadLine();6.3 事件 6.3.1 委托 委托是一种特殊的类型(class),用途是来实现对一种方法的“ 封装”。在某种事件发生时,自动调用该方法。好处显然易见,它使用 户可以自定义自己的方法实现,通过封装,CLR会在相应事件激发时调 用你定义的方法,实现自定义的功能。C#中的委托类似于C或C+中的函数指针,但两者有本质区别:C或 C+不是类型安全的,但C#中的委托是面向对象的,而且是类型安全的 。从某种角度来讲,委托是一个引用类型,用来封装带有特定签名和返 回类型的方法。 6.3 事件 6.3.1 委托 声明委托C#使用关键字delegate来声明委托类型,具体格式如下: 访问修饰符 delegate 结果类型 委托标识符(形参列表);委托类型可以在声明类的任何地方声明。 实例化委托委托使用new运算符来实例化且新创建的委托实例所引用的对象为 以下情形之一: l 委托创建表达式中引用的静态方法 l 委托创建表达式中引用的目标对象(此对象不能为null)和实例 方法 l 另一个委托6.3 事件 6.3.1 委托 (3) 使用委托实例化一个委托后,可以通过委托对象的名称及放入括号的要传递 给委托的参数来调用委托对象。调用委托时,调用表达式的主表达式必 须是委托类型的值。 参考示例代码,理解委托6.3 事件 6.3.2 事件的声明 事件的声明分为两种,声明事件域的格式如下:事件修饰符 event 事件类型 事件名;声明事件属性的格式如下:事件修饰符 event 事件类型 事件名访问符;其中事件修饰符就是以前常提到的访问修饰符,如:new、public、 protected、internal、private、static。事件所声明的类型(type) 则必须是一个代表delegate类型。而此代表类型应预先声明如:public delegate void EventHandler6.3 事件 6.3.3 事件的订阅与取消 (1) 订阅事件事件的订阅是通过为事件加上左操作符“+=”来实现的,如:MyString mystring = new MyString();mystring.Changed += new EventHandler(mystring_Changed(object sender, EventArgs e);只要事件被触发,所订阅的方法就会被调用。 (2) 取消订阅事件的撤消则采用左操作符“- =”来实现的:mystring.Changed -= new EventHandler(mystring_Changed); 请参考示例代码体会事件的用法。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号