C#相关试题.docx
- 文档编号:23273199
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:21
- 大小:20.54KB
C#相关试题.docx
《C#相关试题.docx》由会员分享,可在线阅读,更多相关《C#相关试题.docx(21页珍藏版)》请在冰豆网上搜索。
C#相关试题
1. 传入某个属性的set方法的隐含参数的名称是什么?
value,它的类型和属性所声名的类型相同。
2. 如何在C#中实现继承?
在类名后加上一个冒号,再加上基类的名称。
3. C#支持多重继承么?
不支持。
可以用接口来实现。
4. 被protected修饰的属性/方法在何处可以访问?
在继承或间接继承与这个类的子类中可以访问。
5. 私有成员会被继承么?
会,但是不能被访问。
所以看上去他们似乎是不能被继承的,但实际上确实被继承了。
6. 请描述一下修饰符protectedinternal。
被protectedinternal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。
7. C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。
这样我应该写几个构造函数?
两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。
8. C#中所有对象共同的基类是什么?
.
9. 重载和覆写有什么区别?
重载提供了对一个方法签名的不同参数调用的实现。
覆写提供了子类中改变父类方法行为的实现。
10. 在方法定义中,virtual有什么含意
被virtual修饰的方法可以被子类覆写。
11. 能够将非静态的方法覆写成静态方法么?
不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。
12. 可以覆写私有的虚方法么?
不可以,甚至子类中无法访问父类中的私有方法。
13. 能够阻止某一个类被其他类继承么
可以,使用关键字sealed。
14. 能够实现允许某个类被继承,但不允许其中的某个方法被覆写么
可以,标记这个类为public,并标记这个方法为sealed。
15. 什么是抽象类(abstractclass)?
一种不可以被实例化的类。
抽象类中一般含有抽象方法,当然也可有具体实现。
继承类只有实现过所有抽象类的抽象方法后才能被实例化。
16. 何时必须声明一个类为抽象类
当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。
17. 接口(interface)是什么?
只含有共有抽象方法(publicabstractmethod)的类。
这些方法必须在子类中被实现。
18. 为什么不能指定接口中方法的修饰符
接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。
他们默认为公有方法。
19. 可以继承多个接口么
当然。
20. 那么如果这些接口中有重复的方法名称呢
这种情况中你可以决定如何实现。
当然需要特别得小心。
但是在编译环节是没有问题的。
21. 接口和抽象类的区别是什么
接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。
抽象类中可以有方法的实现,也可以指定方法的访问修饰符。
22. 如何区别重载方法
不同的参数类型,不同的参数个数,不同的参数顺序。
23. const和readonly有什么区别?
const关键字用来声明编译时常量,readonly用来声明运行时常量。
24. 和有什么区别?
是不可变的字符串。
存放了一个可变的字符串,并提供一些对这个字符串修改的方法。
1.静态成员和非静态成员的区别?
和staticreadonly区别?
是什么意思?
是什么意思?
修饰符起什么作用?
修饰符是干什么的?
和overload的区别?
8.什么是索引指示器?
修饰符是起什么作用?
关键字的含义?
11.可以使用抽象函数重写基类中的虚函数吗?
12.密封类可以有虚函数吗?
13.什么是属性访问器?
可以和virtual一起使用吗可以和override一起使用吗?
15.接口可以包含哪些成员?
16.类和结构的区别?
17.接口的多继承会带来哪些问题?
18.抽象类和接口的区别?
19.别名指示符是什么?
20.如何手工释放资源?
Invoke是什么?
和String的区别?
和implicit的含义?
有什么用?
25.什么是反射
以下是我做的一份参考答案(C#语言范畴之内),如果有不准确、不全面的,欢迎各位朋友指正!
1.静态成员和非静态成员的区别
答:
静态变量使用static修饰符进行声明,在类被实例化时创建,通过类进行访问
不带有static修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问
一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值
静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等
示例:
usingSystem;
using
using;
namespaceExample01
{
classProgram
{
classClass1
{
publicstaticStringstaticStr="Class";
publicStringnotstaticStr="Obj";
}
staticvoidMain(string[]args)
{
i++)
{
(((DeriveClass)sender)[i]);
}
}
staticvoidMain(string[]args)
{
DeriveClasstmpObj=newDeriveClass();
="1234567";
;
();
newA().G();
newB().F();
newB().G();
newC().F();
newC().G();
();
}
}
}
结果:
类B在继承类A时可以重写两个虚函数,如图所示:
由于类B中对F方法进行了密封,类C在继承类B时只能重写一个函数,如图所示:
控制台输出结果,类C的方法F只能是输出类B中对该方法的实现:
和overload的区别
答:
override表示重写,用于继承类对基类中虚成员的实现
overload表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现
示例:
usingSystem;
using
using;
namespaceExample07
{
classProgram
{
classBaseClass
{
publicvirtualvoidF()
{
("");
}
}
classDeriveClass:
BaseClass
{
publicoverridevoidF()
{
();
("");
}
publicvoidAdd(intLeft,intRight)
{
("AddforInt:
{0}",Left+Right);
}
publicvoidAdd(doubleLeft,doubleRight)
{
("Addforint:
{0}",Left+Right);
}
}
staticvoidMain(string[]args)
{
DeriveClasstmpObj=newDeriveClass();
();
(1,2);
,;
();
}
}
}
结果:
AddforInt:
3
Addforint:
8.什么是索引指示器
答:
实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于int
简单来说,其本质就是一个含参数属性
示例:
usingSystem;
using
using;
namespaceExample08
{
publicclassPoint
{
privatedoublex,y;
publicPoint(doubleX,doubleY)
{
x=X;
y=Y;
}
{0}MSEL",-vTickCount);
}
publicstringTest2()
{
longvTickCount=;
for(inti=0;i<;i++)
value=();
return("Don'thavethis.:
{0}MSEL",-vTickCount);
}
}
classUnitTransClass
{
publicstaticdoubleC2F(Class1value)
{
4375MSEL
Don'thavethis.:
4406MSEL
11.可以使用抽象函数重写基类中的虚函数吗
答:
可以
需使用new修饰符显式声明,表示隐藏了基类中该函数的实现
或增加override修饰符,表示抽象重写了基类中该函数的实现
示例:
classBaseClass
{
publicvirtualvoidF()
{
("");
}
}
abstractclass DeriveClass1:
BaseClass
{
publicabstractnewvoidF();
}
封类可以有虚函数吗
答:
可以,基类中的虚函数将隐式的转化为非虚函数,但密封类本身不能再增加新的虚函数
示例:
classBaseClass
{
publicvirtualvoidF()
{
("");
}
}
sealedclassDeriveClass:
BaseClass
{
么是属性访问器
答:
属性访问器(PropertyAccessor),包括get访问器和set访问器分别用于字段的读写操作
其设计目的主要是为了实现面向对象(OO)中的封装思想。
根据该思想,字段最好设为private,一个精巧的类最好不要直接把字段设为公有提供给客户调用端直接访问
另外要注意属性本身并不一定和字段相联系
可以和virtual一起使用吗可以和override一起使用吗
答:
abstract修饰符不可以和static、virtual修饰符一起使用
abstract修饰符可以和override一起使用,参见第11点
示例:
usingSystem;
using
using;
namespaceExample14
{
classBaseClass
{
publicvirtualvoidF()
{
("");
}
}
abstractclassDeriveClass1:
BaseClass
{
口可以包含哪些成员
答:
接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员
16.类和结构的区别
答:
类:
类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
类有构造和析构函数
类可以继承和被继承
结构:
结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
结构没有构造函数,但可以添加。
结构没有析构函数
结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口
示例:
根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。
如:
Geoemtry(GIS里的一个概论,在OGC标准里有定义)最好使用类,而Geometry中点的成员最好使用结构
usingSystem;
using
using;
namespaceExample16
{
interfaceIPoint
{
doubleX
{
get;
set;
}
doubleY
{
get;
set;
}
doubleZ
{
get;
set;
}
}
口的多继承会带来哪些问题
答:
C#中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。
但如果两个父成员具有同名的成员,就产生了二义性(这也正是C#中类取消了多继承的原因之一),这时在实现时最好使用显式的声明
示例:
usingSystem;
using
using;
namespaceExample17
{
classProgram
{
ount);
("Countfunction:
{0}",((IB)tmpObj).Count());
();
}
}
}
结果:
Countproperty:
100
Countfunction:
10000
18.抽象类和接口的区别
答:
抽象类(abstractclass)可以包含功能定义和实现,接口(interface)只能包含功能定义
抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性
分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”
为外部提供调用或功能需要扩充时优先使用接口
19.别名指示符是什么
答:
通过别名指示符我们可以为某个类型起一个别名
主要用于解决两个命名空间内有同名类型的冲突或避免使用冗余的命名空间
别名指示符在所有命名空间最外层定义,作用域为整个单元文件。
如果定义在某个命名空间内,那么它只在直接隶属的命名空间内起作用
示例:
:
usingSystem;
using
using;
namespace
{
classClass1
{
publicoverridestringToString()
{
return"'sClass1";
}
}
}
:
usingSystem;
using
using;
namespace
{
classClass1
{
publicoverridestringToString()
{
return"'sClass1";
}
}
}
主单元():
usingSystem;
using
using;
何手工释放资源
答:
.NET平台在内存管理方面提供了GC(GarbageCollection),负责自动释放托管资源和内存回收的工作。
但在以下两种情况需要我们手工进行资源释放:
一、由于它无法对非托管资源进行释放,所以我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象;二、你的类在运行是会产生大量实例(象GIS中的Geometry),必须自己手工释放这些资源以提高程序的运行效率
最理想的办法是通过实现一个接口显式的提供给客户调用端手工释放对象,System命名空间内有一个IDisposable接口,拿来做这事非常合适,省得我们自己再声明一个接口了
示例:
usingSystem;
using
using;
namespaceExample20
{
classProgram
{
classClass1:
IDisposable
{
.
}
ispose();
}
}
}
Invoke是什么
答:
在受控代码与非受控代码进行交互时会产生一个事务(transition),这通常发生在使用平台调用服务(PlatformInvocationServices),即P/Invoke
如调用系统的API或与COM对象打交道,通过命名空间
虽然使用Interop非常方便,但据估计每次调用事务都要执行10到40条指令,算起来开销也不少,所以我们要尽量少调用事务
如果非用不可,建议本着一次调用执行多个动作,而不是多次调用每次只执行少量动作的原则
和String的区别
答:
String在进行运算时(如赋值、拼接等)会产生一个新的实例,而StringBuilder则不会。
所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用StringBuilder,不要使用String
另外,对于String我们不得不多说几句:
1.它是引用类型,在堆上分配内存
2.运算时会产生一个新的实例
对象一旦生成不可改变(Immutable)
3.定义相等运算符(==和!
=)是为了比较String对象(而不是引用)的值
示例:
usingSystem;
using
using;
namespaceExample22
{
classProgram
{
staticvoidMain(string[]args)
{
constintcycle=10000;
longvTickCount=;
Stringstr=null;
for(inti=0;i str+=(); ("String: {0}MSEL",-vTickCount); vTickCount=; 么是反射 答: 反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件 通过对类型动态实例化后,还可以对其执行操作 简单来说就是用string可以在runtime为所欲为的东西,实际上就是一个framework内建的万能工厂 一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情(前面好象见过一位高人用反射调用一个官方类库中未说明的函数。 。 。 ) 示例: usingSystem; using using; namespaceExample25Lib { publicclassClass1 { privatestringname; privateintage; if(tmpParamInfos[i].=="") { tmpParams[i]="Clark"; } } if(tmpParamInfos[i].=="") { tmpParams[i]="ClarkZheng"; } if(tmpParamInfos[i].=="") {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 相关 试题
![提示](https://static.bdocx.com/images/bang_tan.gif)