关于.NET的委托

合集下载

.NET开发人员面试题(含答案)

.NET开发人员面试题(含答案)

.NET开发人员试题(综合)每题5分1、用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?2、软件开发过程一般有几个阶段?每个阶段的作用?3、请列举一些您用到过的设计模式以及在什么情况下使用该模式?4、您对编程的兴趣如何?工作中遇到不懂的问题是怎样去解决的?您一般怎样去提高自己的编程水平?5、您离职的原因是什么?.NET开发人员试题(基础)一、填空:每题2分1.面向对象的语言具有继承性、封装性、多态性。

2. 能用foreach遍历访问的对象需要实现 IEnumerable _接口或声明3.委托声明的关键字是delegate ?4.在.Net托管代码中我们不用担心内存漏洞,这是因为有了gc __?5.当类T只声明了私有实例构造函数时,则在T的程序文本外部,不可以(可以or 不可以)从T派生出新的类,不可以(可以or 不可以)直接创建T的任何实例。

二、单选:每题2分6.在对SQL Server 数据库操作时应选用(A)。

a)SQL Server .NET Framework 数据提供程序;b)OLE DB .NET Framework 数据提供程序;c)ODBC .NET Framework 数据提供程序;d)Oracle .NET Framework数据提供程序;7.以下描述错误的是(A)a)在C++中支持抽象类而在C#中不支持抽象类。

b)C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。

c)在C#中可使用new 修饰符显式隐藏从基类继承的成员。

d)在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。

8.C#的数据类型有(A)a)值类型和调用类型;b)值类型和引用类型;c)引用类型和关系类型;d)关系类型和调用类型;9.下列描述错误的是(D)a)类不可以多重继承而接口可以;b)抽象类自身可以定义成员而接口不可以;c)抽象类和接口都不能被实例化;d)一个类可以有多个基类和多个基接口;10.在DOM中,装载一个XML文档的方法(D)a)save方法b)load方法c)loadXML方法d)send方法三、不定项选择:每题3分11. 以下叙述正确的是:B CA. 接口中可以有虚方法。

c#笔试题经典50题(含答案)

c#笔试题经典50题(含答案)

uanji内测/月考类型:(笔试)范围:内测/月考日期:时长:1小时总分数:100 分姓名:准考证号:证件号码:理论部分注意:考试结束试卷必须交回,答案填写在答题卡上1.( )关键字用于在C#中从派生类中访问基类的成员。

(选一项)A、newB、superC、thisD、base2.C#程序可以依据()来进行方法重载。

(选一项)A、不同的参数个数B、不同的参数名称C、不同的返回值D、不同的方法名称3.C#中的方法重写使用关键字(选一项)A、overrideB、overloadC、staticD、inherit4.C#中关于委托,下面说法正确的是(选一项)A、委托是一种类的成员B、委托必须定义在类中C、定义委托需要使用delegate关键字D、委托是一种数据类型5.System.String类的()方法不能删除字符串中的空格。

(选一项)A、Replace()B、Trim()C、Remove()D、EndsWith()6.关于抽象类下面说法错误的是(选一项)A、抽象类可以包含非抽象方法B、含有抽象方法的类一定是抽象类C、抽象类不能被实例化D、抽象类可以是密封类7.关于接口的使用,说法错误的是(选一项)A、接口可以作为参数进行传递B、接口可以作为方法的返回值C、接口可以实例化D、同时实现多个接口是变相实现了多重继承8.下列泛型集合声明正确的是(选一项)A、List<int> f = new List<int>()B、List<int> f = new List()C、List f = new List()D、List<int> f = new List<int>9.下列关于C#索引器理解正确的是(选一项)A、索引器的参数必须是两个或两个以上B、索引器的参数类型必须是整数型C、索引器没有名字D、以上皆是10.已知C#某接口中有一个Show( )方法,下面对该方法原型的定义正确的是(选一项)A、public void Show( )B、public virtual void Show( )C、void Show( )D、virtual void Show( )11.以下的C#程序:public class A{}public class B:A{}public class Test{public static void Main(){A myA = new A ();B myB = new B ();A myC = myB;Console.WriteLine(myC.GetType());}}运行时将输出(选一项)A、AB、BC、objectD、将报告错误信息,提示无效的类型转换12.以下的C#程序:public static void Main(){int[] A = new int[5]{1,2,3,4,5};Object[] B = new Object[5] {6,7,8,9,10};Array.Copy(A,B,2);}运行后数组A中的数值为(选一项)A、1、2、3、4、5B、1、2、8、9、10C、1、2、3、9、10D、6、7、8、9、1013.以下的C#程序:using System;using System.Cillections;public class SamplesHashtable{public static void Main(){Hashtable myHT = new Hashtable();myHT.Add("A","AA");myHT.Add("B","BB");myHT.Add("C","CC");Console.WriteLine(myHT.Count);myHT.Remove("BB");Console.WriteLine(myHT.Count);}}运行输出为(选一项)A、33B、32C、22D、运行时错误,提示无效的键值14.以下的C#代码段:public struct Person {string Name;int Age;}public static void Main() {Hasbtable A;Person B;}以下说法正确的是(选一项)A、A为引用类型的变量,B为值类型的变量B、A为值类型的变量,B为引用类型的变量C、A和B都是值类型的变量D、A和B都是引用类型的变量15.以下定义雇员类的代码:class Employee{private string id;public string Id{_________//请填写正确的代码行{ return id; }set{if(id.Length>2)id = value;}}}应填写的正确的代码为(选一项)A、letB、setC、getD、put16.以下关于C#中方法重载的说法正确的是(选两项)A、如两个方法名字不同,而参数的数量不同,那么它们可以构成方法重载B、如两个方法名字相同,而返回值的数据类型不同,那么它们可以构成方法重载C、如两个方法名字相同,而参数的数据类型不同,那么它们可以构成方法重载D、如两个方法名字相同,而参数的数量不同,那么它们可以构成方法重载17.阅读以下的C#代码:class A {public A( ) {Console.WriteLine("A");}}class B:A {public B() {Console.WriteLine("B");}}class Program {public static void Main() {B b = new B();Console.ReadLine();}}上述代码运行后,将在控制台窗口输出(选一项)A、AB、BC、A BD、B A18.在.NET框架类库中,所有与多线程机制应用相关的类都放在( )命名空间中。

.Net笔试题1

.Net笔试题1

.Net笔试题1:说说什么叫字符串不可变?string s="abc";s="123"字符串s不就变了吗?答:String 对象是不可改变的。

每次使用System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。

String是不可变的。

在这段代码中,s原先指向一个String对象,内容是 "abc",然后我们将s指向"123",那么s所指向的那个对象是否发生了改变呢?答案是没有。

这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"123",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

扩展:在需要对字符串执行重复修改的情况下,与创建新的String 对象相关的系统开销可能会非常昂贵。

如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder 类。

例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder类可以提升性能。

.net笔试题2:BS与CS的联系与区别?答:C/S是Client/Server的缩写。

客户端需要安装专用的客户端软件。

B/S是Brower/Server的缩写,客户机上只要安装一个浏览器。

在这种结构下,用户界面完全通过浏览器实现,一部分事务逻辑在前端实现,但是主要逻辑在服务器端实现。

浏览器通过Web Server 同数据库进行数据交互。

C/S 与B/S 区别:1).硬件环境不同:C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.B/S 一般建立在广域网之上的, 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行。

2).对安全要求不同C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

.NET开发工程师招聘笔试题及解答2024年

.NET开发工程师招聘笔试题及解答2024年

2024年招聘.NET开发工程师笔试题及解答(答案在后面)一、单项选择题(本大题有10小题,每小题2分,共20分)1、以下哪个技术不是.NET平台的一部分?A、B、CC、JavaD、2、在.NET中,以下哪个类用于处理文件输入输出?A、FileStreamB、StreamReaderC、StreamWriterD、File3、以下哪个不是.NET平台的核心框架之一?A. .NET FrameworkB. .NET CoreC. .NET 5D. Java Platform4、在C中,以下哪个属性是用于指定一个字符串变量的值是否可以改变?A. readonlyB. constC. sealedD. volatile5、在.NET框架中,以下哪个类是用来处理文件输入/输出的?A. FileInfoB. FileStreamC. DirectoryInfoD. StreamWriter6、在C中,以下哪个关键字用于声明一个异步方法?A. asyncB. awaitC. async/awaitD. task7、以下哪种编程语言是.NET平台的宿主语言?A. JavaB. CC. PythonD. Ruby8、在C中,以下哪个属性可以用来检查一个字符串是否为空或者仅包含空白字符?A. IsEmptyB. IsNullC. IsNullOrWhiteSpaceD. IsBlank9、在.NET框架中,以下哪个组件负责处理和响应应用程序的UI事件?A. B. C. Windows FormsD. WPF 10、在C中,以下哪种数据类型表示32位的带符号整数?A. byteB. shortC. intD. long二、多项选择题(本大题有10小题,每小题4分,共40分)1、以下哪些技术或框架是.NET开发工程师在开发过程中可能用到的?()A、 CoreB、Entity Framework CoreC、WPFD、DockerE、Vue.js2、以下关于.NET Core的特点,哪些是正确的?()A、跨平台B、高性能C、支持多种编程语言D、完全开源E、只适用于Web应用程序开发3、以下哪些技术或框架是.NET开发工程师在项目中可能会使用到的?(多选)A. CoreB. Entity Framework CoreC. Windows Communication Foundation (WCF)D. MVC (Model-View-Controller)E. jQuery4、以下关于 .NET 核心概念的描述,哪些是正确的?(多选)A. .NET Core 是一个开源、跨平台的框架。

c#多线程与委托(转)

c#多线程与委托(转)

c#多线程与委托(转)⼀:线程在.net中提供了两种启动线程的⽅式,⼀种是不带参数的启动⽅式,另⼀种是带参数的启动的⽅式。

不带参数的启动⽅式如果启动参数时⽆需其它额外的信息,可以使⽤ThreadStart来实例化Thread:带参数的启动⽅法带参数,就不能⽤ThreadStart委托作为构造函数的参数来实例化Thread了,⽽要 ParameterizedThreadStart委托,和ThreadStart⼀样的是它也是线程启动时要执⾏的⽅法,和ThreadStart不同的是,它在实例化时可以⽤⼀个带有⼀个Object参数的⽅法作为构造函数的参数,⽽实例化ThreadStart时所⽤到的⽅法是没有参数的。

为什么是Object这样的参数呢?很简单,因为在.net中Object是所有类型的基类,⽤它可以表⽰Array(数组)、Interface(接⼝)、ValueType(值类型,如bool,byte,char,short,int,float,long,double等)、class(类)等.net中的类型。

当然,这也意味着如果你要启动⼀个线程,给它传递⼀个int类型参数时,必须在启动⽅法中进⾏相应的类型转换。

这种object类型的参数可以定义⼀个有多个属性的类来进⾏,或者⽤$隔开的字符串,使⽤的时候分解为数组来⽤简单实例代码://不带参数ThreadStart ts = new ThreadStart(ThreadFunc);Thread t = new Thread(ts);t.Start();//带参数ParameterizedThreadStart ParStart = new ParameterizedThreadStart(GoTo);Thread myThread = new Thread(ParStart);object o = (object)txt_url.Text;myThread.Start(o);详细实例代码:Program p = new Program();Thread nonParameterThread = new Thread(new ThreadStart(p.NonParameterRun));nonParameterThread.Start();Thread parameterThread = new Thread(new ParameterizedThreadStart(p.ParameterRun)); = "Thread A:";parameterThread.Start(30);/// <summary>/// 不带参数的启动⽅法/// </summary>public void NonParameterRun(){for (int i = 0; i < 10; i++){Console.WriteLine("系统当前时间毫秒值:"+lisecond.ToString());Thread.Sleep(200);//让线程暂停}}/// <summary>/// 带参数的启动⽅法/// </summary>/// <param name="ms">让线程在运⾏过程中的休眠间隔</param>public void ParameterRun(object ms){int j = 10;int.TryParse(ms.ToString(), out j);//这⾥采⽤了TryParse⽅法,避免不能转换时出现异常for (int i = 0; i < 10; i++){Console.WriteLine(+"系统当前时间毫秒值:" + lisecond.ToString());Thread.Sleep(j);//让线程暂停}}⼆:委托委托就是讲⽅法以参数的形式进⾏传递private static void WriteStrToFile(string txt){write(txt);}private delegate void WriteStrToFileDelegate(string txt);//定义委托new WriteStrToFileDelegate(WriteStrToFile).BeginInvoke(txt, null, null);//异步使⽤委托再举⼀例:public delegate void GreetingDelegate(string name);//定义委托//定义两⽅法private static void EnglishGreeting(string name){Console.WriteLine("Morning, " + name);}private static void ChineseGreeting(string name) {Console.WriteLine("早上好, " + name);}使⽤:private static void GreetPeople(string name, GreetingDelegate MakeGreeting){MakeGreeting(name);//这⾥默认同步⽅式,与MakeGreeting.Invoke(name)效果⼀样}//使⽤GreetPeople("Jimmy Zhang", EnglishGreeting);GreetPeople("张⼦阳", ChineseGreeting);实际上,我们可以也可以绕过GreetPeople⽅法,通过委托来直接调⽤EnglishGreeting和ChineseGreeting:GreetingDelegate delegate1; delegate1 = EnglishGreeting; // 先给委托类型的变量赋值 delegate1 += ChineseGreeting; // 给此委托变量再绑定⼀个⽅法 // 将先后调⽤ EnglishGreeting 与 ChineseGreeting ⽅法 delegate1 ("Jimmy Zhang"); Console.ReadKey();委托的Invoke⽅法⽤来进⾏同步调⽤。

.net面试题及答案3篇

.net面试题及答案3篇

.net面试题及答案3篇.net面试题及答案11.JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?JIT:Just in time,C#或者是的代码首先被编译为IL存储在本地,当要运行这些代码的时候,CLR对IL进行第二次编译转换成机器码运行。

好处:可移植性,而且IL在加载到内存中时将受到类型安全性方面检查,这实现了更好的安全性和可靠性。

GC:垃圾回收(garbage collection),是根据程序的需要自动分配和回收内存的过程。

垃圾回收器处理的是引用对象,而且只回收堆上的内存。

这意味着假如维持对一个对象的引用,就会阻止GC重用对象使用的内存。

在.NET中,垃圾回收器采用的是mark-and-pact算法。

在一次垃圾回收周期开始的时候,它要识别对象的所有跟引用,根据这个引用可以遍历每个根引用所标识的一个树形结构,并递归确定所有引用指向的对象。

这样一来,垃圾回收器就可以识别所有可达的对象,在执行回收的时候,GC 不是枚举所有访问不到的对象,相反,通过压缩所有相邻的可达的对象来执行垃圾回收。

不可访问的对象就会被覆盖。

垃圾回收的宗旨是提高内存的利用率,它并不是用来清理文件句柄,和数据库连接字符串,端口或者其他有限的资源(终接器finalizer,不能被显示调用,不能传递任何参数,即不能被重载,只有垃圾回收器才能调用终接器,使用Using语句进行确定性终结2.类(class)和结构(struct)的区别是什么?它们对性能有影响吗?01. 值类型与引用类型结构是值类型:值类型在栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,通过使用结构可以创建更多的值类型类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。

所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用注:1.虽然结构与类的'类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用02.继承性结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承注:虽然结构不能被继承可是结构能够继承接口,方法和类继承接口一样03.内部结构:结构:没有默认的构造函数,但是可以添加构造函数没有析构函数没有abstract 和sealed(因为不能继承)不能有protected 修饰符可以不使用new 初始化在结构中初始化实例字段是错误的类:有默认的构造函数有析构函数可以使用abstract 和sealed 有protected 修饰符必须使用new 初始化.net面试题及答案21.什么是元编程,.NET有哪些元编程的手段和场景?什么是反射?能否举一些反射的常用场景?有人说反射性能较差,您怎么看待这个问题?有什么办法可以提高反射的性能吗?学着做OA的时候,动态加载不同的DataProvider(Oracle和Sqlserver),方便,可以随时替换不用重新编译程序2.委托是什么?匿名方法是什么?在C#3.0中,Lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您*时最常用哪些?委托可以把一个方法作为参数代入另一个方法。

委托和事件的区别

委托和事件的区别(讲的很详细)--转委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。

它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。

本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。

将方法作为方法的参数我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语:public void GreetPeople(string name) {// 做某些额外的事情,比如初始化之类,此处略EnglishGreeting(name);}public void EnglishGreeting(string name) {Console.WriteLine("Morning, " + name);}暂且不管这两个方法有没有什么实际意义。

GreetPeople用于向某人问好,当我们传递代表某人姓名的name参数,比如说“Jimmy”,进去的时候,在这个方法中,将调用EnglishGreeting方法,再次传递name参数,EnglishGreeting则用于向屏幕输出“Morning, Jimmy”。

现在假设这个程序需要进行全球化,哎呀,不好了,我是中国人,我不明白“Morning”是什么意思,怎么办呢?好吧,我们再加个中文版的问候方法:public void ChineseGreeting(string name){Console.WriteLine("早上好, " + name);}这时候,GreetPeople也需要改一改了,不然如何判断到底用哪个版本的Greeting问候方法合适呢?在进行这个之前,我们最好再定义一个枚举作为判断的依据:public enum Language{English, Chinese}public void GreetPeople(string name, Language lang){//做某些额外的事情,比如初始化之类,此处略swith(lang){case Language.English:EnglishGreeting(name);break;case Language.Chinese:ChineseGreeting(name);break;}}OK,尽管这样解决了问题,但我不说大家也很容易想到,这个解决方案的可扩展性很差,如果日后我们需要再添加韩文版、日文版,就不得不反复修改枚举和GreetPeople()方法,以适应新的需求。

.NET面试题汇总(带答案)

.NET⾯试题汇总(带答案)1.维护数据库的完整性、⼀致性、你喜欢⽤触发器还是⾃写业务逻辑?为什么?答:尽可能⽤约束(包括CHECK、主键、唯⼀键、外键、⾮空字段)实现,这种⽅式的效率最好;其次⽤触发器,这种⽅式可以保证⽆论何种业务系统访问数据库都能维持数据库的完整性、⼀致性;最后再考虑⽤⾃写业务逻辑实现,但这种⽅式效率最低、编程最复杂,当为下下之策。

2.什么是事务?什么是锁?答:事务是指⼀个⼯作单元,它包含了⼀组数据操作命令,并且所有的命令作为⼀个整体⼀起向系统提交或撤消请求操作,即这组命令要么都执⾏,要么都不执⾏。

锁是在多⽤户环境中对数据的访问的限制。

SqlServer⾃动锁定特定记录、字段或⽂件,防⽌⽤户访问,以维护数据安全或防⽌并发数据操作问题,锁可以保证事务的完整性和并发性。

3.什么是索引,有什么优点?答:索引象书的⽬录类似,索引使数据库程序⽆需扫描整个表,就可以在其中找到所需要的数据,索引包含了⼀个表中包含值的列表,其中包含了各个值的⾏所存储的位置,索引可以是单个或⼀组列,索引提供的表中数据的逻辑位置,合理划分索引能够⼤⼤提⾼数据库性能。

4.视图是什么?游标是什么?答:视图是⼀种虚拟表,虚拟表具有和物理表相同的功能,可以对虚拟表进⾏增该查操作;视图通常是⼀个或多个表的⾏或列的⼦集;视图的结果更容易理解(修改视图对基表不影响),获取数据更容易(相⽐多表查询更⽅便),限制数据检索(⽐如需要隐藏某些⾏或列),维护更⽅便。

游标对查询出来的结果集作为⼀个单元来有效的处理,游标可以定位在结果集的特定⾏、从结果集的当前位置检索⼀⾏或多⾏、可以对结果集中当前位置进⾏修改、5.什么是存储过程?有什么优点?答:存储过程是⼀组予编译的SQL语句它的优点:1.允许模块化程序设计,就是说只需要创建⼀次过程,以后在程序中就可以调⽤该过程任意次。

2.允许更快执⾏,如果某操作需要执⾏⼤量SQL语句或重复执⾏,存储过程⽐SQL语句执⾏的要快。

.NET面试题大全(C#面试题)2020更新

.NET⾯试题⼤全(C#⾯试题)2020更新⽬录:⼀、笔试⾯试题⼆、问答⾯试题⼀、笔试⾯试题:1. 简述 private、 protected、 public、 internal 修饰符的访问权限。

答 . private : 私有成员, 在类的内部才可以访问。

protected : 保护成员,该类内部和继承类中可以访问。

public : 公共成员,完全公开,没有访问限制。

internal: 在同⼀命名空间内可以访问。

2 .列举 页⾯之间传递值的⼏种⽅式。

答. 1.使⽤QueryString, 如....?id=1; response. Redirect()....2.使⽤Session变量3.使⽤Server.Transfer4.使⽤Application5.使⽤Cache6使⽤HttpContext的Item属性7.使⽤⽂件8.使⽤数据库9.使⽤Cookie3. ⼀列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,⽤递归算法实现。

答:public class MainClass{public static void Main(){Console.WriteLine(Foo(30));}public static int Foo(int i){if (i <= 0)return 0;else if(i > 0 && i <= 2)return 1;else return Foo(i -1) + Foo(i - 2);}}4.C#中的委托是什么?事件是不是⼀种委托?答:委托可以把⼀个⽅法作为参数代⼊另⼀个⽅法。

委托可以理解为指向⼀个函数的引⽤。

是,是⼀种特殊的委托5.override与重载的区别答:override 与重载的区别。

重载是⽅法的名称相同。

参数或参数类型不同,进⾏多次重载以适应不同的需要Override 是进⾏基类中函数的重写。

c#试题集锦

C#试题集锦一、选择题(40分,每小题1分)1、在C#中,下列常量定义正确的是()。

A.Const double PI 3.1415926;B.Const double e=2.7C.define double PI 3.1415926D.define double e=2.72、在.NET中,从属性的读写特性上来进行分类,可以划分为以下三种,除了()。

A.只读属性B.只写属性C.读写属性D.不可读不可写的属性3、在C#中,一个类().A.可以继承多个类B.可以实现多个接口C.在一个程序中只能有一个子类D.只能实现一个接口4、以下的C#代码:static void Main(string[] args){Console.WriteLine("运行结果: {0}",Console.ReadLine());Console.ReadLine();}代码运行结果为()。

A.在控制台窗口显示“运行结果:”B.在控制台窗口显示“运行结果:{0}”C.在控制台窗口显示“运行结果:,Console.ReadLine”D.如果用户在控制台输入“ A”,那么程序将在控制台显示“运行结果:A”5、在C#中定义一个数组,正确的代码为()。

A.int arraya = new int[5];B.int[] arraya = new int[5];C.int arraya = new int[];D.int[5] arraya = new int;6、在C#语言中,下列关于属性的描述正确的是().A.属性系是以public关键字修饰的字段,以public关键字修饰的字段也可称为属性B.属性是访问字段值的一种灵活机制,属性更好地实现了数据的封装和隐藏C.要定义只读属性只需在属性名前加上readonly关键字D.在C#的类中不能自定义属性7、程序运行过程中发生的错误,叫作().(选择一项)A.版本B.断点C.异常D.属性8、在.NET中,以下关于命名空间的描述,正确的是()。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于 NET的委托
public delegate void ProcessBookDelegate(Book book); 声明一个新的委托类型。每个委托类型都描述参数的数目和 类型,以及它可以封装的方法的返回值类型。每当需要一组新 的参数类型或新的返回值类型时,都必须声明一个新的委托类 型。 实例化委托 声明了委托类型后,必须创建委托对象并使之与 特定方法关联。与所有其他对象类似,新的委托对象用 new 表达式创建。但是当创建委托时,传递给 new 表达式的参数 很特殊:它的编写类似于方法调用,但没有方法的参数。下列 语句:
委托 委托是回调函数的类型安全包装。C++编写的非托管程序进行回调时很 容易出错。由于委托的存在,托管应用程序不会出现这样的情况。委托 通常用来定义响应事件的回调方法的签名。 C#中的委托类似于C或C++中的函数指针。使用委托使程序员可以 将方法引用封装在委托对象内( 所以这里的“引用”不是原始内存地址, 而是包装了方法的内存地址的委托实例 )。然后可以将给委托对象传 递可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与 C或C++中的函数指针不同,委托是面向对象、类型安全的,并且是安 全的。 委托声明定义一种类型,它用一组特定的参数以及返回类型封装方 法。 对于静态方法,委托对象封装要调用的方法。 对于实例方法,委托对象同时封装一个实例和该实例上的一个方 法。 如果你有一个委托对象和一组适当的参数,则可以用这些参数调用 该委托。 委托的一个有趣且有用的属性是: 它不知道或不关心自己引用的对 象的类。任何对象都可以,知识方法的参数类型必须与委托的参数类型 和返回类型相匹配。这是的委托完全适合“匿名”调用。 到现在已经说得不少了,现在开始用例子说明如何声明、实例化和 调用委托: 下面的示例中,BookDB 类封装一个书店数据库,它维护一个书籍数 据库。它公开 ProcessPaperbackBooks 方法,该方法在数据库中查找所 有平装书,并为每本书调用一个委托。所使用的 delegate 类型称为 ProcessBookDelegate。Test 类使用该类输出平装书的书名和平均价 格。委托的使用促进了书店数据库和客户代码之间功能的良好分隔。客 户代码不知道书籍的存储方式和书店代码查找平装书的方式。书店代码 也不知道找到平装书后将对平装书进行什么处理。 // bookstore cs using System; //此命名空间中的几个类用以维护书籍数据库:
list Add(new Book(title, author, price, paperBack)); } // 对于每一本平装书调用ProcessBookDelegate这个委托,以对平 装书进行处理: public void ProcessPaperbackBooks(ProcessBookDelegate processBook) { foreach (Book b in list) { if (b Paperback) // Calling the delegate: processBook(b); } } } } // 使用Bookstore命名空间里的类: namespace BookTestClient { using Bookstore; // 具有统计平装书并求出平装书的平均价格功能的类: class PriceTotaller { int countBooks = 0; decimal priceBooks = 0 0m; internal void AddBookToTotal(Book book) { countBooks += 1; priceBooks += book Price; }
于方法调用,但没有方法的参数。 下列语句: bookDB ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle)); 创建与静态方法 Test PrintTitle 关联的新的委托对象。 下列语句: bookDB ProcessPaperbackBooks(new ProcessBookDelegate(totaller AddBookToTotal)); 创建与对象 totaller 上的非静态方法 AddBookToTotal 关联的新的委托 对象。在例子中,新的委托对象都立即传递给 ProcessPaperbackBooks 方法。 请注意一旦创建了委托,它所关联到的方法便永不改变:委托对象不可 改变。 调用委托 创建委托对象后,通常将委托对象传递给将调用该委托的其他代码。通 过委托对象的名称(后面跟着要传递给委托的参数,括在括号内) 调用委托对象。下面是委托调用的示例: processBook(b);
internal decimal AveragePrice() { return priceBooks / countBooks; } } // 用以测试书籍数据库的类: class Test { // 打印书籍题目的静态方法 static void PrintTitle(Book b) { Console WriteLine(" {0}", b Title); } // 程序执行的入口: static void Main() { BookDB bookDB = new BookDB(); // 用几本书来输初始化书籍数据库: AddBooks(bookDB); // 打印平装书的题目: Console WriteLine("Paperback Book Titles:"); // 创建与静态方法 Test PrintTitle 关联的新的委托对象: bookDB ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle)); // 通过PriceTotaller的实例获取平装书的平均价格: PriceTotaller totaller = new PriceTotaller(); // 创建与对象 totaller 上的非静态方法 AddBookToTotal 关联的 新的委托对象: bookDB ProcessPaperbackBooks(new ProcessBookDelegate(totaller AddBookToTotal));
namespace Bookstore { using System Collections; // 描述数据库中每一本书具有的属性: public struct Book { public string Title; // 书的题目 public string Author; // 书的作者 public decimal Price; // 书的价格 public bool Paperback; // 是不是平装书? public Book(string title, string author, decimal price, bool paperBack) { Title = title; Author = author; Price = price; Paperback = paperBack; } } // 为处理平装书的类声明一个委托类型(delegate类型): public delegate void ProcessBookDelegate(Book book); // 维护书籍的数据库 public class BookDB { // 数据库中所有书籍的清单: ArrayList list = new ArrayList(); // 向数据库中添加一本书: public void AddBook(string title, string author, decimal price, bool paperBack) {
调用委托 创建委托对象后,通常将委托对象传递给将调用该 委托的其他代码。通过委托对象的名称(后面跟着要传递给委 托的参数,括在括号内)调用委托对象。下面是委托调用的示 例: processBook(b);
例子 using System; using System.Collections.Generic; using System.Text; namespace Delegate { //定义委托,它定义了可以代表的方法的类型 public delegate void GreetingDelegate(string name); class Program { private static void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } private static void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name);
bookDB ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle)); 创建与静态方法 Test PrintTitle 关联的新的委托对象。下列语 句: bookDB ProcessPaperbackBooks(new ProcessBookDelegate(totaller AddBookToTotal)); 创建与对象 totaller 上的非静态方法 AddBookToTotal 关联的 新的委托对象。在例子中,新的委托对象都立即传递给 ProcessPaperbackBooks 方法。 请注意一旦创建了委托,它所关联到的方法便永不改变:委托 对象不可改变。
} //注意此方法,它接受一个GreetingDelegate类 型的方法作为参数 private static void GreetPeople(string name, GreetingDelegate MakeGreeting) { MakeGreeting(name); } static void Main(string[] args) { GreetPeople("Jimmy Zhang", EnglishGreeting); GreetPeople("张子阳", ChineseGreeting); Console.ReadKey(); } } } 输出如下: Morning, Jimmsole WriteLine("平装书的平均价格: ${0:# ##}", totaller AveragePrice()); } // 向数据库添加书以初始化书籍数据库: static void AddBooks(BookDB bookDB) { bookDB AddBook("The C Programming Language", "Brian W Kernighan and Dennis M Ritchie", 19 95m, true); bookDB AddBook("The Unicode Standard 2 0", "The Unicode Consortium", 39 95m, true); bookDB AddBook("The MS-DOS Encyclopedia", "Ray Duncan", 129 95m, false); bookDB AddBook("Dogbert's Clues for the Clueless", "Scott Adams", 12 00m, true); } } } 输出: Paperback Book Titles: The C Programming Language The Unicode Standard 2 0 Dogbert's Clues for the Clueless 平装书的平均价格: $23 9 声明委托 以下语句: public delegate void ProcessBookDelegate(Book book); 声明一个新的委托类型。每个委托类型都描述参数的数目和类型,以及 它可以封装的方法的返回值类型。每当需要一组新的参数类型或新的 返回值类型时,都必须声明一个新的委托类型。 实例化委托 声明了委托类型后,必须创建委托对象并使之与特定方法关联。与所有 其他对象类似,新的委托对象用 new 表达式创建。 但是当创建委托时,传递给 new 表达式的参数很特殊:它的编写类似
相关文档
最新文档