C SHARP 练习题 2019-5-3AM
第一题:接口是一种引用类型,在接口中可以声明(),但不可以声明公有的域或私有的成员变量。 答:A
A.方法、属性、索引器和事件
B.方法、属性信息、属性
C.索引器和字段
D.事件和字段;
解释:
public string this(int index)
{ get{}; set{}; }
索引器实质是属性,属性实质是方法;
接口是一种引用类型,在接口中可以声明方法、属性、索引器、事件,但不可以声明公有的域或私有的成员变量。
第二题:C#程序段的结果: int[][] array = new int[3][]{ new int[3]{5,6,2},
new int[5]{6,9,7,8,3},
new int[2]{3,2} };
array[2][2] 返回() 答:溢出
解释:
与C/C++不同,C#有二维数组[,],还有锯状数组[][],本题是锯状数组,二维数组的第二维长度可以不同,即可以第一行两列,第二行三列
int[][] arr = {{1,2},{3,4,5}};
或
int[][] a = new int[2][];
a[0] = new int[]{1,2};
a[1] = new int[]{3,4,5};
第三题:以下的 c# 代码段:
Public struct Person{
String Name;
Int Age;
}
Public static void Main()
{
Hashtable A;
Person B;
// 其他处理代码
}
以下说法正确的是(B)
B: A为值类型的变量 ,B为引用类型的变量
解释:
在 C# 中,结构是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。
struct 关键字用于创建结构。 为了定义一个结构,必须使用 struct 语句。
struct 语句为程序定义了一个带有多个成员的新的数据类型。
第四题:
using System;
namespace Application
{
abstract class BaseClass
{
public virtual void MethodA()
{
}
public virtual void MethodB()
{
}
}
class Class1: BaseClass
{
public void MethodA(string arg)
{
}
public override void MethodB()
{
}
}
class Class2: Class1
{
new public void MethodB()
{
}
}
class MainClass
{
public static void Main(string[] args)
{
Class2 o = new Class2();
o.MethodA();
}
}
}
请问, o.MethodA 调用的是? 答: BaseClass.methondA()
解释:
若 Class1中的 MethodA(string arg)没参数则调用Class1,
(否则不管使用new还是override,还是都没用)
看清楚,这里有参数,则调用的是Base Class中的MethondA。
第五题:关于C#的委托代理模式,说法正确的是( ) 答:A
A. 委托实际上是一种引用方法的类型
B. 一旦程序中为委托分配了方法,委托将和该方法具有相同的行为
C. 委托可以是对类的抽象
D. 委托的实例代表一个具体的函数或方法
解释:
B错的原因,定义一个委托,实际上是创建了一个类的对象,给委托分配方法时,
就是将这个委托指向了这个方法的内存地址。当调用这个委托的时候,这个委托就会调用其指向的方法。
所以委托的行为和该方法的行为是两种不同的行为。
通过阅读选项,
委托是一个类,调用委托构造函数,传入委托所指向的方法。
得到的是一个委托类对象,那么D选项,就错误。
B选项,委托类实例对象与方法的行为,是不一样的,类对象与一个方法的行为不等价。
C选项委托作用于方法,也不是对类对象的抽象,故错误。
总结一下,具体点就是,委托的作用: 1.将方法做为参数 2.将方法作为返回值。
第六题:ASP中Session对象默认有效期为多少分钟? 答:20分钟
解释:
ASP中默认的时间20分钟
JSP使用TomCat服务器,默认是30分钟
第七题:下面不是面向对象的基本原则的是? 答: C
A.单一职责原则(Single-Resposibility Principle)
B.开放封闭原则(Open-Closed principle)
C.抽象类原则(Abstract-Class principle)
D.依赖倒置原则(Dependecy-Inversion Principle)
E.接口隔离原则(Interface-Segregation Principle)
解释:
五个基本原则:
单一职责原则(Single-Resposibility Principle):
一个类,最好只做一件事,只有一个引起它的变化。
单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,
将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。
开放封闭原则(Open-Closed principle):
软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
Liskov替换原则(Liskov-Substituion Principle):
子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,
才能保证系统在运行期内识别子类,这是保证继承复用的基础。
接口隔离原则(Interface-Segregation Principle):
使用多个小的专门的接口,而不要使用一个大的总接口
依赖倒置原则(Dependecy-Inversion Principle):
依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;
抽象不依赖于具体,具体依赖于抽象。
记忆技巧:立方体(solid)
s( Single-Resposibility Principle ): 单一职责原则
o( Open-Closed principle ): 开放封闭原则
l( Liskov-Substituion Principle ): 里氏原则
i( Interface-Segregation Principle ): 接口隔离原则
d( Dependecy-Inversion Principle ): 依赖倒置原则
第八题:在C#中,int[][]是定义一个int型的二维数组。 答:错。
解释:
int[][] 是锯齿数组必须一维度一维度的新建。
int[,]是二维数组。一个可以叫矩形数组,一个可以叫交错数组。只有矩形数组才能称作二维数组
第九题:下列关于C#中索引器理解正确的是? 答:C
A.索引器的参数必须是两个或两个以上
B.索引器的参数类型必须是整数型
C.索引器没有名字
D.以上皆非
解释:
索引器没有名字,this进行限定。
索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的。
索引器和数组比较:
(1)索引器的索引值(Index) 类型不受限制
(2)索引器允许重载
(3)索引器不是一个变量
索引器和属性比较:
(1)属性以名称来标识,索引器以函数形式标识
(2)索引器可以被重载,属性不可以
(3)索引器不能声明为static,属性可以
第十题:子类重写父类的构造无参构造,初始化子类时的运行结果是()?
答:父类的构造函数会执行,但是不执行父类的func函数。
解释:
众所周知,实例化子类时,先运行基类的构造参数,再运行子类的构造参数,
但是父类的构造参数中调用的func方法已经变了,所以相当于运行了两次sub.Func()。
注:这道题主要是类的继承和方法重写及构造参数调用顺序。
引用大神的总结,->>这里发生的行为不是构造函数覆盖的,是运行子类构造函数时,
子类构造函数的第一行默认隐藏了super(),所以先调用父类构造函数,父类构造函数中有func()函数,
而此时真正运行的是子类的构造函数,子类中中有覆盖父类的func()函数,
所以会找子类的func函数,而不会使用父类的func函数。
第十一题:以下关于 ref 和 out 描述哪些项是正确的?(ACD)
A.使用ref参数,传递到ref参数的参数必须是最先初始化
B.使用out参数,传递到out参数的参数必须最先初始化
C.使用ref参数,必须将参数作为ref参数显式传递到方法
D.使用out参数,必须将参数作为out参数显示传递到方法
解释:
out、ref都是引用传递,都需要显示传递变量到方法。
ref 是有进有出,即能将参数传进去,因此需要在传递进去前初始化。
out 是只出不进,out会把参数清空,所以无法将一个值从 out 传递进去。
out关键字与 ref 关键字类似,通过引用来传递参数,
不同之处在于 ref 要求变量必须在传递之前进行初始化,
相反out在调用方法使用之前会把参数值清空。
若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。