测绘《Visual C# 程序设计》复习思考题.docx
- 文档编号:26943488
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:114
- 大小:206.98KB
测绘《Visual C# 程序设计》复习思考题.docx
《测绘《Visual C# 程序设计》复习思考题.docx》由会员分享,可在线阅读,更多相关《测绘《Visual C# 程序设计》复习思考题.docx(114页珍藏版)》请在冰豆网上搜索。
测绘《VisualC#程序设计》复习思考题
一选择题(35)
(1)下面是关于委托实例的描述,不正确的有哪些?
(D)
A委托(delegate)实例可以认为是这样的对象,它包含具有相同签名和返回值类型的有序方法列表,该方法的列表称为调用列表(invocationlist);
B当委托实例被调用时,它调用列表中的每一个方法;
C由委托实例保存的方法可以来自任何类或结构,只要它们同时匹配委托的返回值和签名(包括ref和out修饰符);
D调用列表中的方法可以是实例方法,不可以是静态方法。
(2)下面是关于委托类型的描述,不正确的有哪些?
(D)
A委托是类型,委托类型必须在被用来创建变量以及类型的实例之前声明;
B委托类型声明和所有类型声明一样,不需要在类的内部声明;
C委托类型的声明看上去与方法的声明很相似,有返回类型和签名,返回类型和签名指定了委托接受的方法的形式;
D委托类型的声明以delegate关键词开头,有方法主体。
(3)下面是关于创建委托对象的描述,不正确的有哪些?
(B)
A委托是引用类型,因此有引用和对象,在委托类型声明之后,可以声明变量并创建类型的对象;
B可以使用带new运算符的对象创建表达式来创建委托对象,new运算符的操作数由委托类型名和一组方括号(包含作为调用列表中第一个成员的方法的名字)组成;
C可以使用快捷语法来创建委托对象,它仅由方法说明符构成,之所以能使用快捷语法是因为在方法名称和其相应的委托类型之间有隐式转换;
D除了为委托分配内存,创建委托对象还会把第一个方法放入委托的调用列表。
(4)下面是关于委托对象操作的描述,不正确的有哪些?
(B)
A由于委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的引用,旧的委托对象会被垃圾回收器回收;
B委托对象可以使用“-”运算符来“组合”,这个运算最终会创建一个新的委托对象,其调用列表是两个操作数的委托调用列表的副本的组合;
C尽管术语组合委托(combiningdelegate)让我们觉得好像操作数委托对象被修改了,其实它们并没有被修改,委托对象是恒定的,委托对象被创建后不会再被改变;
D我们可以通过使用+=运算符来为委托对象增加新的方法或另一个委托对象;
E我们还可以使用-=运算符从委托对象调用列表中移除方法或一个委托对象。
(5)下面是关于委托对象调用的描述,不正确的有哪些?
(C)
A可以像调用方法一样简单地调用委托对象;
B用于调用委托对象的参数将会用于调用列表中的每一个方法(输出参数例外);
C一个方法可以在调用列表中出现多次,当委托对象被调用时,这个方法只会被调用一次;
D如果委托有返回值并且在调用列表中有一个以上的方法,调用列表中最后一个方法返回的值就是委托调用返回的值,调用列表中所有其他方法的返回值都会被忽略;
E如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变,在调用委托列表中的下一个方法时,参数的新值(不是初始值)会传给下一个方法。
(6)下面是关于事件创建及使用的描述,不正确的有哪些?
(B)
A委托类型声明--事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型声明进行描述;
B事件处理程序声明--这些在订阅者类中的方法(事件处理程序)声明会在事件触发时被执行,它们需要有独立的方法,它们不可以是匿名方法或lambda表达式;
C事件声明--事件发布者类中的声明,用来保存并调用事件处理程序;
D事件注册--这段代码把事件处理程序添加到事件中;
E触发事件的代码--发布者类中的这段代码,用来调用事件处理程序。
(7)下面是关于事件声明的描述,不正确的有哪些?
(D)
A发布者类必须提供事件和触发事件的代码;
B创建事件比较简单——只需要委托类型和名字;
C可以通过使用逗号分隔的列表在一个声明语句中声明一个以上的事件;
D不可以使用static关键字让事件变成静态的。
(8)下面是关于事件的描述,不正确的有哪些?
(C)
A一个常见的误解是把事件认为是类型,然而它不是,事件是成员,我们不能使用对象创建表达式(new表达式)来创建它的对象;
B事件必须声明在类或结构中,和其他成员一样;
C能在一段可执行代码中声明事件;
D事件成员被隐式自动初始化为null。
(9)下面是关于触发和订阅事件的描述,不正确的有哪些?
(D)
A在触发事件之前和null进行比较,从而查看是否包含任何事件处理程序,如果事件是null,则表示没有;
B触发事件使用事件名称,后面跟的参数列表包含在圆括号中,参数列表必须匹配事件的委托类型;
C使用+=运算符来为事件增加事件处理程序;
D事件处理程序可以是实例方法、静态方法,但不能是匿名方法和lambda表达式。
(10)下面是关于接口的描述,不正确的有哪些?
(C)
A接口是表示一组函数成员而不实现成员的引用类型,其他类型——类和结构可以实现接口;
B类或结构要实现接口必须在基类列表后面列出接口名称,必须为接口的每一个成员提供实现;
C接口声明可以包含数据成员;
D接口声明只能包含方法、属性、事件和索引等成员。
(11)下面是关于接口的描述,不正确的有哪些?
(D)
A接口成员的声明不能包含任何实现代码,而在每一个成员声明的主体后必须使用分号;
B和类以及结构一样,接口声明还可以分隔成分部接口声明;
C接口声明可以有任何的访问修饰符public、protected、internal或private;
D接口的成员是隐式public的,允许有任何访问修饰符,包括public。
(12)下面是关于接口的描述,不正确的有哪些?
(A)
A只有类、数组和结构才能实现接口;
B如果类实现了接口,它必须实现接口的所有成员;
C如果类有基类又并需要实现接口,那么基类列表中的基类名称必须放在任何接口名称之前;
D接口不仅仅是类或结构要实现的成员列表。
它是一个引用类型。
(13)下面是关于接口的描述,不正确的有哪些?
(B)
A类或结构可以实现任意数量的接口;
B所有实现的接口必须列在基类列表中并以分号分隔(如果有基类名称,则在其之后);
C如果一个类实现了多个接口,其中有一些接口有相同签名和返回类型的成员,类可以实现单个成员来满足所有包含重复成员的接口;
D接口是引用类型,并且可以通过强制转换对象引用为接口类型来获取一个指向接口的引用,如果类实现了多个接口,我们可以获取每一个的独立接口类型的引用。
(14)下面是关于接口的描述,不正确的有哪些?
(D)
A实现接口的类可以把从它的基类继承的成员作为接口成员的实现;
B如果有显式接口成员实现,类级别的实现是允许的,但不是必须的;
C显式接口成员实现只可以通过指向接口的引用来访问;
D其他的类成员都可以直接访问显式接口成员实现。
(15)下面是关于接口的描述,不正确的有哪些?
(C)
A由于其他类不能直接访问显式接口成员实现,派生类的成员也不能直接访问它们,它们必须总是通过接口的引用来访问;
B要指定某个接口继承其他的接口,应在接口声明中把基接口以逗号分隔的列表形式放在接口名称的冒号之后;
C列表中的接口本身不可以有被继承的接口;
D接口包含它声明的所有成员和所有基接口的成员。
(16)下面是关于Main方法的描述,不正确的有哪些?
(A)
AstaticvoidMain{…}
BstaticvoidMain(string[]args){…}
CstaticintMain(){…}
DstaticintMain(string[]args){…}
(17)下面是关于Main方法的描述,不正确的有哪些?
(B)
AMain必须声明为static;
BMain可以被声明为类、枚举或结构的成员;
C如果Main被声明为private,其他程序集就不能访问它,只有执行环境才能启动程序;
D如果Main被声明为public,其他程序集和执行环境都可以调用它。
(18)下面是关于泛型的描述,不正确的有哪些?
(C)
A泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化;
B我们可以用“类型占位符”来写代码,然后在创建类的实例时提供真实的类型;
C类型不是对象而是对象的模板,同样地,泛型类型也不是对象,而是对象的模板;
DC#提供了5种泛型:
类、结构、接口、委托和方法,注意,前面4个是类型,而方法是成员。
(19)下面是关于泛型类声明的描述,不正确的有哪些?
(B)
A在类名之后放置一组尖括号;
B在尖括号中用句号分隔的占位符字符串来表示希望提供的类型,这被叫做类型参数(typeparameter);
C在泛型类声明的主体中使用类型参数来表示应该被替代的类型;
D在泛型类型声明中没有特殊的关键词或标志,尖括号中的类型参数列表是将泛型类声明与普通类声明区分开的标志。
(20)下面是关于构造类的描述,不正确的有哪些?
(B)
A我们不能直接从泛型类型创建类对象,首先,我们需要使用真实类型来替代占位符(类型参数)来创建构造类,然后从构造类创建一个真实类型对象;
B要从泛型类构建类类型,列出类名字并在方括号中提供真实类型来替代类型参数,要替代类型参数的真实类型叫做类型实参(typeargument);
C编译器接受了类型实参并且替换泛型类主体中的相应类型参数,产生了构造类型;
D可以从同一个泛型类型构建出很多不同的类型;每一个都是独立的类型,就好像它们都是独立的非泛型类型声明一样。
(21)下面是关于类型参数约束的描述,不正确的有哪些?
(C)
A要让泛型变得更有用,我们需要提供额外的信息让编译器知道参数可以接受哪些类型,这些额外的信息叫做约束(constrain);
B只有符合约束的实参才能用于类型参数;
C约束使用while子句列出;
D每一个有约束的类型参数有自己的where子句,如果形参有多个约束,它们在where子句中使用逗号分隔。
(22)下面是关于类型参数约束的where子句的描述,不正确的有哪些?
(B)
A它们在类型参数列表的关闭尖括号之后列出;
B它们使用逗号分隔
C它们可以以任何次序列出;
Dwhere是上下文关键词,所以可以在其他上下文中使用。
(23)下面是关于类型参数约束的描述,不正确的有哪些?
(E)
A类名约束--只有这个类型的类或从它继承的类才能用作类型实参;
Bclass约束--任何引用类型,包括类、数组、委托和接口都可以用作实参;
Cstruct约束--任何值类型都可以被用作类型实参;
D接口名约束--只有这个接口或实现这个接口的类型才能用作实参;
Enew()约束--任何带有公共构造函数的类型都可以用作实参,这叫做构造函数约束。
(24)下面是关于泛型类型的描述,不正确的有哪些?
(D)
A与泛型类相似,泛型结构可以有类型参数和约束;
B泛型结构的规则和条件与泛型类是一样的;
C泛型接口允许我们编写参数和接口成员返回类型是类型参数的接口;
D泛型接口的声明和非泛型接口的声明差不多,但是需要在接口名称之后的方括号中提供有类型参数。
(25)下面是关于泛型接口的描述,不正确的有哪些?
(B)
A类型参数不同的泛型接口是不同的接口;
B不可以在非泛型类型中实现泛型接口;
C实现泛型类型接口时,所有可能的类型实参组合必须不会在类型中产生两个重复的接口,泛型接口的实现必须唯一;
D泛型接口的名字不会和非泛型冲突。
(26)下面是关于泛型委托和泛型方法的描述,不正确的有哪些?
(C)
A要声明泛型委托,在委托名称后、委托参数列表之前的尖括号中放类型参数列表;
B泛型方法中类型参数的范围包括返回值、形参列表和约束子句;
C泛型方法只能在泛型类以及结构和接口中声明,不能在非泛型类以及结构和接口中声明;
D泛型方法和其他泛型一样,有类型参数列表和可选的约束。
(27)下面是关于类型转换的描述,不正确的有哪些?
(D)
A类型转换(conversion)是接受一个类型的值并使用它作为另一个类型的等价值的过程;
B有些类型的转换不会丢失数据或精度,语言会自动做这些转换,这叫做隐式转换;
C从位数更少的源类型转换为位数更多的目标类型时,目标中多出来的位需要用0或1填充;
D当从更小的无符号类型转换为更大的无符号类型时,目标类型多出来的最高位都以1进行填充,这叫做零扩展。
(28)下面是关于类型转换的描述,不正确的有哪些?
(D)
A对于有符号类型的转换而言,额外的高位用源表达式值的符号位进行填充,这样就维持了被转换的值的正确符号和大小,这被叫做符号扩展;
B对于源类型的任意值在被转换成目标类型时会丢失值的情况,语言是不会提供这两种类型的自动转换的,如果希望对这样的类型进行转换,就必须使用显式转换;
C如果我们使用强制转换表达式,就意味着我们要承担执行操作可能会引起的丢失数据的责任;
D除了标准转换,还可以为自定义类型定义显式转换,但是不可以为自定义类型定义隐式转换。
(29)下面是关于类型转换的描述,不正确的有哪些?
(A)
A还有一个预定义的转换类型,叫做装箱,它转换任何引用类型到object类型;
B拆箱将装箱的值转换到原始类型;
C引用类型转换接受源引用并返回一个指向堆中同一位置的引用,但是把引用“标记"为其他类型;
D所有引用类型可以被隐式转换为object类型。
(30)下面是关于类型转换的描述,不正确的有哪些?
(D)
A任何类型可以隐式转换到它继承的接口;
B类可以隐式转换到它继承链中的任何类和它实现的任何接口;
C从0bject至到任何引用类型的转换必须采用显式引用转换;
D从基类到从它继承的类的转换可以采用隐式引用转换。
(31)下面是关于类型转换的描述,不正确的有哪些?
(D)
A如果转换的类型不受限制,很可能会导致我们尝试引用在内存中实际并不存在的类成员,系统在运行时遇到它们则会抛出一个异常;
B一个有关装箱的普遍误解是在被装箱的项上发生了一些操作,其实不是,它返回了副本的值的引用类型;
C在装箱产生之后,有两份值——原始值类型和副本的引用类型,每一个都可以独立操作;
D装箱是显式转换。
(32)下面是关于类型转换的描述,不正确的有哪些?
(B)
A拆箱(unboxing)是把装箱后的对象转换回值类型的过程;
B拆箱是隐式转换;
C拆箱时,系统会首先检测要拆箱的对象实际是否是值类型的装箱值;
D拆箱时,系统会把对象里面的值类型的值复制到变量。
(33)下面是关于类型转换的描述,不正确的有哪些?
(B)
A只可以为类或结构定义用户自定义转换;
B能重定义标准隐式转换或显式转换;
C对于相同的源和目标类型,我们不能声明两个转换,一个是隐式转换而另外一个是显式转换;
D隐式和显示转换的声明语法都需要public和static修饰符;
E除了implicit和explicit关键词之外,隐式和显示转换的声明语法是一样的。
(34)下面是关于自定义隐式和显示类型转换的条件的描述,不正确的有哪些?
(D)
A源类型和目标类型必须是不同类型;
B源类型和目标类型不能通过继承关联,即源类型不能继承自目标类型,而目标类型也不能从源类型继承;
C源类型和目标类型都不能是接口类型或object类型;
D转换运算符必须是源类型和目标类型的成员。
(35)下面是关于is运算符和as运算符的描述,不正确的有哪些?
(A)
Ais运算符只可以用于引用转换以及装箱和拆箱转换,能用于用户自定义转换;
Bas运算符和强制转换运算符类似,只是它不抛出异常;
C如果转换失败,as运算符把目标引用设置为null而不是抛出异常;
D由于as运算符返回引用表达式,它可以用作赋值中的源;
Eas运算符只能用于引用转换和装箱转换,它不能用于用户自定义转换或到值类型的转换。
二判断题(33全对)
(1)接口的成员是在接口中和该接口的所有基接口中声明的成员。
严格地说,类object中的成员不是任何接口的成员。
但是,在任何接口类型中都可访问类object中的成员。
(2)接口成员隐式地具有public已声明可访问性。
在接口成员声明中不允许使用访问修饰符。
(3)C#语言的类型划分为两大类:
值类型(Valuetype)和引用类型(referencetype)。
值类型和引用类型都可以为泛型类型(generictype),泛型类型采用一个或多个类型参数。
类型参数可以指定值类型和引用类型。
(4)引用类型包括类类型、接口类型、数组类型和委托类型。
(5)abstract修饰符用于表示所修饰的类是不完整的,并且它只能用作基类。
(6)抽象类不能直接实例化,并且对抽象类使用new运算符会导致编译时错误。
虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类型派生的)。
(7)允许(但不要求)抽象类包含抽象成员,抽象类不能被密封。
(8)当从抽象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有抽象成员,从而重写那些抽象成员。
(9)sealed修饰符用于防止从所修饰的类派生出其他类。
如果一个密封类被指定为其他类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
(10)静态类不能显式指定基类或所实现接口的列表。
静态类隐式从object类型继承。
(11)静态类只能包含静态成员,静态成员的可访问性不可为protected或protectedinternal。
常量和嵌套类型归为静态成员。
(12)静态类中不能声明实例构造函数,并且对于静态类也不提供任何默认实例构造函数。
(13)每个类型形参最多只能有一个where子句,并且where子句可以按任何顺序列出。
(14)where子句中给出的约束列表可以包括以下任一依此顺序排列的组成部分:
一个主要约束、一个或多个次要约束以及构造函数约束new()。
主要约束可以是类类型、引用类型约束(referencetypeconstraint)class,也可以是值类型约束(valuetypeconstraint)struct。
次要约束可以是类型形参(type-parameter),也可以是接口类型(interface-type)。
(15)引用类型约束指定用于类型形参的类型实参必须是引用类型。
所有类类型、接口类型、委托类型、数组类型和已知将是引用类型(将在下面定义)的类型形参都满足此约束。
(16)值类型约束指定用于类型形参的类型实参必须是不可以为null值的类型。
所有不可以为null的结构类型、枚举类型和具有值类型约束的类型形参都满足此约束。
注意,虽然可以为null的类型被归为值类型,但是不满足值类型约束。
具有值类型约束的类型形参还不能具有constructor-constraint。
(17)如果约束是类类型、接口类型或类型形参,则该类型指定的是用于该类型形参的每个类型实参必须支持的最低“基类型”。
(18)如果类型形参的where子句包括构造函数约束(即具有new()的形式),则可以使用new运算符创建该类型的实例。
用于具有构造函数约束的类型形参的任何类型实参都必须具有公共的无形参构造函数(任何值类型都隐式地存在此构造函数),或者是具有值类型约束或构造函数约束的类型形参。
(19)如果一个实例构造函数中没有构造函数初始值设定项,将会隐式地添加一个base()形式的构造函数初始值设定项。
(20)当实例构造函数没有构造函数初始值设定项时,或仅具有base(...)形式的构造函数初始值设定项时,该构造函数就会隐式地执行在该类中声明的实例字段的初始化操作,这些操作由对应的字段声明中的variable-initializers指定。
这对应于一个赋值序列,它们会在进入构造函数时,在对直接基类的构造函数进行隐式调用之前立即执行。
这些变量初始值设定项按它们出现在类声明中的文本顺序执行。
(21)销毁一个实例时,按照从派生程度最大到派生程度最小的顺序,调用该实例的继承链中的各个析构函数。
(22)在结构的实例构造函数内,this相当于一个结构类型的out形参,而在结构的实例函数成员内,this相当于一个结构类型的ref形参。
在这两种情况下,this本身相当于一个变量,因而有可能对该函数成员调用所涉及的整个结构进行修改。
(23)结构的默认值就是将所有值类型字段设置为它们的默认值并将所有引用类型字段设置为null而产生的值。
由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。
此限制只适用于实例字段。
在结构的静态字段声明中可以含有变量初始值设定项。
(24)一个接口定义一个协定。
实现某接口的类或结构必须遵守该接口定义的协定。
一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。
(25)接口可以包含方法、属性、事件和索引器。
接口本身不提供它所定义的成员的实现。
接口只指定实现该接口的类或结构必须提供的成员。
(26)如果一个类或结构实现某接口,则它还隐式实现该接口的所有基接口。
(27)一个接口声明可以声明零个或多个成员。
接口的成员必须是方法、属性、事件或索引器。
接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。
(28)所有接口成员都隐式地具有public访问属性。
接口成员声明中包含任何修饰符都属于编译时错误。
(29)在方法调用、属性访问或索引器访问中,不能直接访问“显式接口成员实现”的成员,即使用它的完全限定名也不行。
“显式接口成员实现”的成员只能通过接口实例来访问,并且在通过接口实例访问时,只能用该接口成员的名称来引用。
(30)显式接口成员实现中包含访问修饰符属于编译时错误,而且如果包含abstract、virtual、override或static修饰符也属于编译时错误。
(31)类的基类成员参与接口映射。
(32)继承的公共成员声明和继承的显式接口成员声明可以参与重新实现接口的接口映射过程。
(33)当类实现接口时,它还隐式实现该接口的所有基接口。
与此类似,接口的重新实现也同时隐式地对该接口的所有基接口进行重新实现。
三写出运行结果题(10)
(1)
usingSystem;
namespacePage_237
{
classProgram
{
staticvoidMain(string[]args)
{
for(intx=4;x<6;x++)
{
switch(x)
{
case2:
Console.WriteLine("2");
break;
case5:
Console.WriteLine("5");
break;
default:
Console.WriteLine("0");
break;
}
}
}
}
}
(2)
usingSystem;
namespacePage_240
{
classProgram
{
staticvoidMain(string[]args)
{
intx=2;
while(x>0)
{
Console.WriteLine("{0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual C# 程序设计 测绘Visual C# 程序设计复习思考题 测绘 Visual 程序设计 复习 思考题