C#综合笔试题(上)

来源:百度文库 编辑:神马文学网 时间:2024/04/27 19:59:45
1.面向对象的思想主要包括什么?
继承多态封装
●封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
●继承:子类拥有父类的所有数据和操作。
●多态:一个程序中同名的不同方法共存的情况。
有两种形式的多态–重载与重写。
 
2.什么是ASP.net中的用户控件
用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成
用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方
法调整.
问这样的问题,一般是迷惑你.因为新手还是分不清楚用户控件和服务器控件(也称自定义控件)..用户控件一般用在内容多
为静态,或者少许会改变的情况下..用的比较大..类似ASP中的include..但是功能要强大的多..
在C#中,string str = null 与 string str = “”的区别。
答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间
请详述在dotnet中类(class)与结构(struct)的异同
Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的.
DataReader和DataSet的异同
DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection
的操作都会引发DataReader的异常..因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因
为DataReader的特殊性和高性能.所以DataReader是只进的..你读了第一条后就不能再去读取第一条了..
DataSet则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接..因为DataSet将数据全部加载在
内存中.所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作.
8.C#中的接口和类有什么异同。
接口和类都是类,不同的事,接口只包含方法或属性的声明,不包含具体实现方法的代码,接口可以实现多继承,而类
只能是单继承,继承接口的类必须实现接口中声明的方法或属性。接口主要定义一种规范,统一调用方法,在大型项目
中接口正发挥日益重要的作用
类是方法功能的实现和集合,接口是规范类.约束类.
接口,是可以多继承,类只有单继承.接口强调了你必须实现,而没有具本实现的方法和虚类有点相似
Override与重载有什么区别?
一个是重写父类函数,一个是同一个函数的几种形式
触发器的作用
触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。触发器还有助于
强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。
保证数据库操作变更能接到通知
<%# %> 和 <% %> 有什么区别?
<%# %>表示绑定的数据源
<% %>是服务器端代码块
常见的设计模式
抽象工厂模式、适配器模式、外观模式 command命令模式,桥接模式,组合模式,装饰模式,状态模式,备忘录模式等。
软件设计模式太多,就我的理解简单说一下最常见的MVC模式。
MVC模式是1996年由Buschmann提出的:
模型(Model):就是封装数据和所有基于对这些数据的操作。
视图(View):就是封装的是对数据显示,即用户界面。
控制器(Control):就是封装外界作用于模型的操作和对数据流向的控制等。
 
3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分
别作何解释?
 
4.列举一下你所了解的XML技术及其应用
 
5.值类型和引用类型的区别?写出C#的样例代码。
在dotnet中有两大类数据类型,即值类型和引用类型,值类型存贮在栈中,而引用类型存贮在动态的堆中,栈是先进先
出的有系统管理的空间,而堆是由应用程序控制的可随时申请和释放该空间,在Donnet中一般情况下有垃圾收集器处理
,他们的不同导致在编程上的不同。
例:                     StringBuilder a=new StringBuilder();//将StringBuilder的一个首地址传给a
StringBuilder b=a;//将StringBuilder的一个首地址传给b
b.Append("mxh");
Console.WriteLine(a);
a=null;
Console.WriteLine(b);
输出结果:mxh
mxh
"a=null"的意思是:a的引用置为空但此时StringBuilder的堆空间并没有被释放,因此在此之后,输出b时,仍然可以
输出mxh
 
6.ADO.net中常用的对象有哪些?分别描述一下。
DataSet对象:表示内存中数据的缓存,可以把它想像成一个临时的数据库,它里可以存多个表(DataTable),而且是断开式的,不用每进行一次操作就对数据库进行更新,从而提高了效率。
DataReader对象:它与DataSet最大的不同是有连接式的,每次对数据库进行存取都会影响到数据库。
Connection对象:用于连接数据库的对象,表示到数据源的一个唯一的连接。
Command对象:表示要对数据库执行的一个SQL语句或一个存储过程。
DataAdapter对象:该对象是与DataSet配合使用的对象,用于把表填充到DataSet,和更新DataSet等。
 
7.如何理解委托?
 
C# 中的委托类似于 C 或 C++ 中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托
对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与 C 或 C++ 中的函数指针不同,委托是
面向对象、类型安全的,并且是安全的。
 
9.。net中读写数据库需要用到哪些类?他们的作用
 
10.UDP连接和TCP连接的异同。
 
11.ASP.net的身份验证方式有哪些?分别是什么原理?
window验证:为每个用户开启window帐号,验证其身份.安全性较高.
forms验证:为每个登陆用户写入一个身份验证票据..在web使用最广的验证方式..灵活方便.
 
12.进程和线程分别怎么理解?
 
13.什么是code-Behind技术。
新建一个VS.NET下的项目..看到ASPX,RESX和CS三个后缀的文件了吗??这个就是代码分离.实现了HTML代码和服务器代
码分离.方便代码编写和整理.
 
14.活动目录的作用。
活动目录是window2000的最重要的功能.可以将用户信息全部集成起来,登陆以后可以访问多个不同的网络服务..
.
15..net中读写XML的类都归属于哪些命名空间?
System.XML类
 
16.解释一下UDDI、WSDL的意义及其作用。
 
17.什么是SOAP,有哪些应用。
simple object access protocal,简单对象接受协议.以xml为基本编码结构,建立在已有通信协议上(如http,不过据说ms在搞最
底层的架构在tcp/ip上的soap)的一种规范
是微软大力推广的Web Service使用的协议..
 
18.如何部署一个ASP.net页面。
 
19.如何理解.net中的垃圾回收机制。
 
如果发现内存不够,则垃圾回收器,将全部对象作为无效对象(被回收对象),然后先将全局变量,static,处于活动中的局部变
量,以及当前CG指针指向的对象放入一个表中.然后
会搜索新列表中的对象所引用的对象.加入列表中,其他没有被加入列表的对象都会被回收.
 
20.常用的调用webservice方法有哪些?
我一般用的是WSDL..或者web引用..
 
21列举一下你所了解的XML技术及其应用
.xml可以用来做网页(xslt) xml可以当作数据库 xml可以用来保存对象的系列化
xml用于配置,用于保存静态数据类型.接触XML最多的是web Services..和config
 
C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质
 
C#可否对内存进行直接的操作?
可以
维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么
 
触发器,性能好,事务性
ADO。NET相对于ADO等主要有什么改进?
新增dataset等,不需要随时保持连接,性能提高
 
ASP。NET与ASP相比,主要有哪些进步?
asp解释型,aspx编译型,性能提高,有利于保护源码
 
C#中的委托是什么?事件是不是一种委托?
委托是一种安全的函数指针,事件是一种消息机制
 
你对XMLHTTP、WEBSERVICE 了解吗?简单描述其特点、作用
xmlhttp可以主动获取远端web代码,类似HttpWebRequest
接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?
接口用于规范,抽象类用于共性。
存储过程和函数的区别
存储过程是编译好的存储在数据库的操作,函数不用说了.
事务是什么?
具有原子性特点
游标的作用?如何知道游标已经到了最后?
指示当前记录的位置,检查NULL
触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。
一个是操作前,一个是操作后
请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
session(viewstate) 简单,但易丢失
application 全局
cookie 简单,但可能不支持,可能被伪造
input type="hidden" 简单,可能被伪造
url参数 简单,显示于地址栏,长度有限
数据库 稳定,安全,但性能相对弱
请说明.net中的错误处理机制,并举例
try catch final
请说出强名的含义
具有自己的key,可以在GAC为公用
请列出c#中几种循环的方法,并指出他们的不同
for wile foreach
请指出.net中所有类型的基类
object
请指出GAC的含义
全局程序集缓存
值类型与引用类型有什么区别?
值和指针的区别
怎样理解静态变量?
所有实例公用一个的变量
向服务器发送请求有几种方式?
get post
如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理

input type=""
url
数据库
用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
三层,表现,逻辑,数据, 安全性,维护性
软件开发过程一般有几个阶段?每个阶段的作用?
需求分析,架构设计,代码编写,QA,部署
通过超链接怎样传递中文参数?
URLEncode URLDecode
请编程遍历页面上所有TextBox控件并给它赋值为string.Empty
foreach
有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.
同一个名称控件直接,或者反射
如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明.
const static int classNum=0;
classNum++;
A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.
构造先父后子,析够反之
需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允
许字符串中间有多个空格,但连续的空格数不可超过一个.
string inputStr=" xx xx ";
inputStr=Regex.Replace(inputStr.Trim()," *"," ");
在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?
using 指令 和语句 new 创建实例 new 隐藏基类中方法
using 引入名称空间或者使用非托管资源
new 新建实例或者隐藏父类方法
谈谈类和结构的区别?
类是引用类型、结构是值类型
什么叫做SQL注入,如何防止?请举例说明。
利用sql关键字对网站进行攻击。过滤关键字'等
下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设计测试用例
inputStr=inputStr.ToCharArray().Reverse().ToString();
什么是反射?
动态获取程序集信息
用Singleton如何写设计模式
static属性里面new ,构造函数private
C#中的垃圾回收机制是怎样的?
三个generation,当每个generation内存满了的时候检查引用,无引用就回收内存
什么是Application Pool?
Web应用,类似Thread Pool,提高并发性能
链表和数组的区别,各有什么优缺点.
一个可以动态增长,一个固定(VB中可以Redim),性能数组教好
什么是友元函数?
friendly声明,可以访问protect级别方法
什么是虚函数?
可以被重写
什么是抽象函数?
必须被重写
什么是内存泄漏,怎样最简单的方法判断被存泄漏 ?
C++,C中忘了释放内存,内存不会再次分配
1SQL Server的两种索引是何形式?索引的作用?索引的优缺点?
cluster和非cluster,加速查找,占用额外控件,维护索引耗费时间
什么是XML?
可扩展标记语言,可以做配置文件,可以传输数据,可以存储数据
简述 private、 protected、 public、 internal 修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。
进程和线程的区别
进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个
进程的资源。
成员变量和成员函数前加static的作用
它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以
用来统计类实例的数量,类成员函数负责这种统计的动作。
malloc和new的区别
new是C++的关键字。malloc在分配内存时必须按给出的字节分配,new可以按照对象的大小自动分配,并且能调用构造
函数。可以说new是对象的对象,而malloc不是。本质上new分配内存时,还会在实际内存块的前后加上附加信息,所
以new所使用的内存大小比malloc多。
堆和栈的区别
栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。
栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数
据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一
定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变
量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序
起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统
,但是精确的申请内存/释放内存匹配是良好程序的基本要素。
在.Net中,类System.Web.UI.Page 可以被继承么?
可以
你觉得ASP.NET 2.0(VS2005)和你以前使用的开发工具(.Net 1.0或其他)有什么最大的区别?你在以前的平台上使
用的哪些开发思想(pattern / architecture)可
1 ASP.NET 2.0 把一些代码进行了封装打包,所以相比1.0相同功能减少了很多代码.
2 同时支持代码分离和页面嵌入服务器端代码两种模式,以前1.0版本,.NET提示帮助只有在分离的代码文件,无法在页面嵌
入服务器端代码获得帮助提示,
3 代码和设计界面切换的时候,2.0支持光标定位.这个我比较喜欢
4 在绑定数据,做表的分页.UPDATE,DELETE,等操作都可以可视化操作,方便了初学者
5, 在ASP.NET中增加了40多个新的控件,减少了工作量
.net的错误处理机制是什么
.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。
重载与覆盖的区别
1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的
实参表与形参表来选择方法体的。
简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。
C#中的委托是什么?事件是不是一种委托?
委托是一种安全的函数指针,事件是一种消息机制
new有几种用法
第一种:new Class();
第二种:覆盖方法
public new XXXX(){}
第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。
如何把一个array复制到arrayList里
foreach( object o in array )arrayList.Add(o);
datagrid.datasouse可以连接什么数据源
dataset,datatable,dataview , IList
概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使
用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问
其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客
户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
概述o/r mapping 的原理>
利用反射,配置 将类于数据库表映射
用sealed修饰的类有什么特点
sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派
生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别
作何解释?
答:装箱就是把值类型转成引用类型,从MS IL角度看好像是boxing,没记错的话是把值从堆栈转到堆中.拆箱相反,重载就是
指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚.
如何理解委托?
答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法.
委托具有以下特点:
委托类似于 C++ 函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。
C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。
UDP连接和TCP连接的异同。
前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结.
进程和线程分别怎么理解?
进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以成为别人的儿子,一个老子也可以
为别的老子生儿子.
什么是SOAP,有哪些应用。
答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用
的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任
何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息.
1. 填空: (1)面向对象的语言具有___继承性、封装性、多态性。
(2)能用foreach遍历访问的对象需要实现 IEnumerable接口或声明GetEnumerator 方法的类型
(3)列举ADO.net中的五个主要对象
Command、Connection、DataSet、DataAdapter、DataReader。
 
2. 不定项选择:
 
(1) 以下叙述正确的是:
 
A. 接口中可以有虚方法。     B. 一个类可以实现多个接口。
C. 接口不能被实例化。       D. 接口中可以包含已实现的方法。
 
(2) 从数据库读取记录,你可能用到的方法有:
 
A. ExecuteNonQuery            B. ExecuteScalar
 
C. Fill                        D. ExecuteReader
 
3. 简述 private、 protected、 public、 internal 修饰符的访问权限。
 
 
4. 写出一条Sql语句:取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键, 注意:ID
可能不是连续的。)
 
 
5 .列举ASP.NET 页面之间传递值的几种方式。
 
三种比较常见的方式,一种是可以通过用QueryString来传送相应的值,再一种是通过session变量来传送相应的值,还有
就是通过Server.Transfer方法来实现
 
(1)queryString
(2)session
(3)cookie
(4)server.transfer
(5)hidden   control/view   state
(6)static   member.
(7)cache
(8)application
(9)DataBase
(10)xml   or   other   Files
(11)XMLHTTP   or   Hidden   iFrame/frame
(12)Context.user.identity
我正在做一个通用提示叶面,所有叶面出现问题都要,传递几个变量字符串到同一个叶面 hitMsg.aspx 变量字符串包括
提示语言,即将跳转的叶面,跳转时间。在1-11种方案中哪个更好些?
(1)queryString的毛病是无法传递很长字符串,比如系统错误信息往往就一整个屏幕。
(2)session的毛病是不能过多使用,依赖Cookie,容易丢失。
(3)cookie的毛病是依赖客户端设置,不可靠。
(4)server.transfer的毛病是接收叶面要为发送叶面准备好,只能定制专门一个叶面接受定制好的叶面。
不能是一个叶面接受任何叶面。
(5)hidden   control/view   state只能传递本页。除非特殊制作。
(6)static   member.无法保证线程安全,可能会此处栽瓜他处得豆。
(7)cache不适合使用一次就扔的变量。
(8)application全局的,开销大。
(9)DataBase全局固化的,开销更大,除非做日志跟踪。
(10)xml   or   other   Files全局固化的,开销大,除非做日志跟踪。
(11)XMLHTTP   or   Hidden   iFrame/frame,做这个过于烦琐。
(12)Context这个占用了用户id,不适合做这个。
 
6. 写出程序的输出结果
 
class Class1 {
private string str = "Class1.str";
private int i = 0;
static void StringConvert(string str) {
str = "string being converted.";
}
static void StringConvert(Class1 c) {
c.str = "string being converted.";
}
static void Add(int i) {
i++;
}
static void AddWithRef(ref int i) {
i++;
}
static void Main() {
int i1 = 10;
int i2 = 20;
string str = "str";
Class1 c = new Class1();
Add(i1);
AddWithRef(ref i2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
}
}
 
 
7.写出程序的输出结果
 
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
 
public class B: A
{
public B()
{
Console.WriteLine('B');
}
 
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
 
public static void Main()
{
A a = new B();
a.Fun();
}
}
 
 
8.      写出程序的输出结果:
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
 
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
 
 
public class B : A
{
public override void Fun1(int i)
{
base.Fun1 (i + 1);
}
 
public static void Main()
{
B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
}
}
 
 
 
9. 一列数的规则如下: 1、1、2、3、5、8、13、21、34......
求第30位数是多少,用递归算法实现。(C#语言)
-------------------------------------------
a0   =   0,a1   =   1,An   =   An-1   +   An-2(n>=2)
int[]   iArray   =   new   int[31];
iArray[0]   =   0;
iArray[1]   =   1;
for   (int   i   =   2;   i   <=   30;   i++)
{
iArray[i]   =   iArray[i   -   1]   +   iArray[i   -   2];
}
---------------参考答案二---------------------------------
int   i=0,ii=1,s=1,num=0;
while(num<=30)
{
s=i+ii;
Response.Write(i+"+"+ii+"="+s+"
");
if(s==1)
{
i=1;
}
else
{
i=s-i;
}
ii=s;
num++;
}
========================
 
10. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
 
要求: 1.要有联动性,老鼠和主人的行为是被动的。
 
2.考虑可扩展性,猫的叫声可能引起其他联动效应。
三个类,猫,老鼠和主人

 
public sealed class Cat
{
// 猫叫时引发的事件
public event EventHandler Calling;
 
public void Call()
{
Console.WrietLine("猫叫了...");
if(Calling != null) // 检查是否有事件注册
Calling(this, EventArgs.Empty); // 调用事件注册的方法。
}
}
// 老鼠,提供一个方法表示逃跑
public sealed calss Mouse
{
public void Escape(object sender, EventArgs e)
{
Console.WriteLine("老鼠逃跑了...");
}
}
 
// 主人,发生猫叫的时候惊醒
public sealed class Master
{
public void Wakened(object sender, EventArgs e)
{
Console.WriteLine("主人惊醒了...);
}
}
// 用于测试的执行方法
// 程序入口点
public static Program
{
public static int Main(string[] args)
{
// 建立猫
Cat cat = new Cat();
// 建立老鼠
Mouse mouse = new Mouse();
// 建立主人
Master master = new Master();
// 注册事件
cat.Calling += new EventHandler(mouse.Escape);
cat.Calling += new EventHandler(master.Wakened);
 
// 猫开始叫
cat.Call();
}
}
 
要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象
评分标准: <1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)
<2>从Mouse和Master中提取抽象(5分)
<3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分)
public interface Observer
{
void Response();    //观察者的响应,如是老鼠见到猫的反映
}
public interface Subject
{
void AimAt(Observer obs); //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject subj)
{
this.name = name;
subj.AimAt(this);
}
public void Response()
{
Console.WriteLine(name + " attempt to escape!");
}
}
public class Master : Observer
{
public Master(Subject subj)
{
subj.AimAt(this);
}
public void Response()
{
Console.WriteLine("Host waken!");
}
}
public class Cat : Subject
{
private ArrayList observers;
public Cat()
{
this.observers = new ArrayList();
}
public void AimAt(Observer obs)
{
this.observers.Add(obs);
}
public void Cry()
{
Console.WriteLine("Cat cryed!");
foreach (Observer obs in this.observers)
{
obs.Response();
}
}
}
class MainClass
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1", cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
}
}