Net软件工程师面试题Word文档下载推荐.docx
《Net软件工程师面试题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Net软件工程师面试题Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
声明一个委托publicdelegateintmyCallBack(intx);
则用该委托产生的回调方法的原型应该是
1.voidmyCallBack(intx)
2.intreceive(intnum)
3.stringreceive(intx)
不确定的
Question4
下列描述错误的是()
a)
类不可以多重继承而接口可以;
b)
抽象类自身可以定义成员而接口不可以;
c)
抽象类和接口都不能被实例化;
d)
一个类可以有多个基类和多个基接口;
Question5
下列关于构造函数的描述正确的是()
构造函数可以声明返回类型。
构造函数不可以用private修饰
构造函数必须与类名相同
构造函数不能带参数
Question6
接口是一种引用类型,在接口中可以声明(
),但不可以声明公有的域或私有的成员变量。
方法、属性、索引器和事件;
方法、属性信息、属性;
索引器和字段;
事件和字段;
Question7
以下的C#代码,试图用来定义一个接口:
publicinterfaceIFile
{
intA;
intdelFile()
A=3;
}
voiddisFile();
关于以上的代码,以下描述错误的是()。
以上的代码中存在的错误包括:
不能在接口中定义变量,所以intA代码行将出现错误;
接口方法delFile是不允许实现的,所以不能编写具体的实现函数;
代码voiddisFile();
声明无错误,接口可以没有返回值;
应该编写为voiddisFile(){};
Question8.
classClass1
{
publicstaticintCount=0;
staticClass1()
Count++;
}
publicClass1()
Class1o1=newClass1();
Class1o2=newClass1();
请问,Class1.Count的值是多少?
()
1.1
2.2
3.3
4.4
Question9
abstractclassBaseClass
publicvirtualvoidMethodA()
Console.WriteLine("
BaseClass"
);
publicvirtualvoidMethodB()
classClass1:
BaseClass
publicvoidMethodA()
Class1"
publicoverridevoidMethodB()
classClass2:
Class1
newpublicvoidMethodB()
classMainClass
publicstaticvoidMain(string[]args)
Class2o=newClass2();
o.MethodA();
请问,此程序输出结果是:
1.BaseClass
2.BassClassClass1
3.Class1
4.Class1BassClass
(解析,三重继承问题,孙类只是继承父类,而不是直接继承祖父类)
三.问答题(每题3分,共15分)
1.
简述
private、
protected、
public、
internal
修饰符的访问权限。
private:
私有访问,它只能在声明自身的类中进行访问。
protected:
表示受保护的访问,该类内部和继承类中可以访问
.public:
表示公共访问,在代码任何位置都可对其进行访问
internal表示内部成员,在同一命名空间内可以访问。
2.C#中的委托是什么?
事件是不是一种委托?
委托是指具有相同属性(也称具有相同的函数签名:
返回类型相同,参数类型、参数顺序及参数个数相同)的函数或方法的抽象,关键字为delegate。
主要用途是三个:
1)函数回调;
2)传递方法;
3)事件机制
事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托,对事件的声明,
实际是声明一个私有的委托变量,对委托变量进行封装,即委托变量加上event关键字后,不管其前面的访问修饰符是public还是private,编译器都会将其编译为private。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
以委托为参数的函数具有一定的通用性。
使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
3.
abstract
可以和
virtual
一起使用吗?
override
不可以一起使用,但是可以和override一起使用。
请叙述属性与索引器的区别。
属性:
它是存取类的字段,索引器:
Indexer它是特殊的属性,用它可以使用户像访问数组一样访问类的成员。
请详述在dotnet中类(class)与结构(struct)的异同。
类class可以进行实例化,它是引用类型,内存分配在栈中,效率高,它有默认的构造函数,有析构函数可以使用
和
sealed,
protected
修饰符。
要用new进行初始化,
结构它是属于值类型,内存分配在堆中,效率低,它没有默认的构造函数,但是可以添加构造函数,没有析构函数没有
sealed(因为不能继承)
不能有protected
修饰符可以不使用new
初始化,但是可以在结构中初始化实例字段。
四.分析程序(每题5分,共25分)
(此题不能调试,若发现调试,扣除分数)
写出程序的输出结果
classClass1
privatestringstr="
Class1.str"
;
privateinti=0;
staticvoidStringConvert(stringstr)
str="
stringbeingconverted."
staticvoidStringConvert(Class1c)
c.str="
staticvoidAdd(inti)
i++;
staticvoidAddWithRef(refinti)
staticvoidMain()
inti1=10;
inti2=20;
stringstr="
str"
Class1c=newClass1();
Add(i1);
AddWithRef(refi2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
10
21
str
stringbeingconverted
2.写出程序的输出结果
publicabstractclassA
publicA()
Console.WriteLine('
A'
publicvirtualvoidFun()
A.Fun()"
publicclassB:
A
publicB()
B'
publicoverridevoidFun()
B.Fun()"
publicstaticvoidMain()
Aa=newB();
a.Fun();
解析:
主函数
Aa=newB();
首先声明了一个A的对象a,但被赋给不同于A的对象B,在此期间分别调用了A类的构造函数和B类的构造函数,然后调用a的fun()函数,因为a的fun()函数是虚函数,被b的fun()的函数覆盖,所以实际执行的是b的fun().
答案:
A
B
B.Fun()
3.写出程序的输出结果:
publicclassA
publicvirtualvoidFun1(inti)
Console.WriteLine(i);
publicvoidFun2(Aa)
a.Fun1
(1);
Fun1(5);
publicclassB:
publicoverridevoidFun1(inti)
base.Fun1(i+1);
Bb=newB();
Aa=newA();
b.Fun2(a);
a.Fun2(b);
输出结果为:
2
5
1
6
(一个函数的执行必须在一个具体的对象中实现,如果函数明确告诉是哪个对象,则在改该对象下执行;
如果没有,则在默认的对象下执行)
在下面的例子里
usingSystem;
classA
publicA()
PrintFields();
publicvirtualvoidPrintFields(){}
classB:
intx=4;
inty;
y=-1;
publicoverridevoidPrintFields()
x+=1;
x={0},y={1}"
x,y);
y+=1;
当使用Bb=newB()创建的实例时,产生什么输出?
b.PrintFields();
结果是什么?
X=5,y=0
b.PrintFields
结果是x=6;
y=1
下面的例子中
publicstaticintX;
staticA()
X=B.Y+1;
classB
publicstaticintY=A.X+1;
staticB()
{}
staticvoidMain()
X={0},Y={1}"
A.X,B.Y);
产生的输出结果是什么?
X=2,Y=1
五.程序设计(每题7分,共28分)
请编程实现一个冒泡排序算法?
//比较法
using
System;
System.Collections.Generic;
System.Text;
namespace
test1
class
Program
static
void
Main(string[]args)
int[]Array={6,18,12,23,19,28,30};
排序前的数组:
"
foreach(int
n
in
Array)
Console.Write(n+"
"
Console.WriteLine();
for
(int
i=1;
i<
Array.Length;
i++)
//控制趟数
j=0;
j<
Array.Length-i;
j++)
if
(Array[j]>
Array[j+1])
//交换
int
temp=Array[j];
Array[j]=Array[j+1];
Array[j+1]=temp;
//排序后
排序后的数组:
n=0;
n<
n++)
Console.Write(Array[n]+
2.
编程程序实现委托,事件。
delegateDemo
Cat
cat=
Cat();
Mouse
mouse=
Mouse();
Master
master=
Master();
cat.Calling+=
EventHandler(mouse.Escape);
EventHandler(master.Wakened);
cat.Call();
public
sealed
//猫类
event
EventHandler
Calling;
Call()
猫开始叫了……"
if(Calling!
=null)
//检查事件是否被注册
Calling(this,EventArgs.Empty);
//调用事件注册的方法
//老鼠类
Escape(object
sender,
EventArgs
e)
老鼠逃跑了..."
//主人
Wakened(object
主人惊醒了..."
写一个程序,语言不限,打印出100的阶乘(即1*2*3*…*100)的精确数值结果(不能是浮点数)。
如5的阶乘是1*2*3*4*5=120。
//,打印出100的阶乘(即1*2*3*…*100)的精确数值结果(不能是浮点数)。
如5的阶乘是1*2*3*4*5=120
shuzu
请输入一个正数"
n=
int.Parse(Console.ReadLine());
{0}的阶乘1*2*3*…*{1}={2}"
n,n,Fn(n));
double
Fn(int
n)
(n==1)
return
1;
else
n*Fn(n-1);
写一个程序,语言不限,能将人民币金额从阿拉伯数字转换为大写汉字表示。
例如,把1234.56转换为壹仟贰佰叁拾肆圆零伍角陆分。
ConsoleApplication1
请输入数字:
string
s=
Console.ReadLine();
Console.Write("
转换后¥:
i=0;
s.Length;
i++)
//switch(Convert.ToInt32(Console.Read