完整版二NETOOP面向对象编程的面试题.docx
- 文档编号:26930917
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:27
- 大小:151.76KB
完整版二NETOOP面向对象编程的面试题.docx
《完整版二NETOOP面向对象编程的面试题.docx》由会员分享,可在线阅读,更多相关《完整版二NETOOP面向对象编程的面试题.docx(27页珍藏版)》请在冰豆网上搜索。
完整版二NETOOP面向对象编程的面试题
.NETOOP面向对象编程
1.面向对象的三大基本原则?
封装,继承,多态。
(1)封装:
隐藏内部实现,稳定外部接口;好处:
保证对象自身数据的完整性和安全性
(2)继承:
子类继承父类的成员;好处:
实现代码复用,方便系统的扩展
(3)多态:
A:
不同子类对象同一个消息(方法调用);做出不同的反映;
B:
同一个类在不同情况下表现出不同的行为。
静态方法和实例方法:
(1)静态方法里面不能直接调用实例方法(不能直接写方法名),需要实例化对象,然后再用对象
方法名去调用。
静态方法中不能用this关键字直接调用实例方法。
(2)实例方法里面可以直接使用静态方法
(直接写静态方法名)
2..传入某个属性的set(设置器)方法的隐含参数的名称是什么?
value,它的类型和属性所声名的类型相同。
3.c#中字段和属性的区别
字段是变量;属性是对字段的封装,对外提供的访问,保证数据的安全
4..请叙述属性与索引器的区别。
属性a通过名称标识
b通过简单名称或成员访问来访问。
c可以为静态成员或实例成员
d属性的get访问器没有参数
e属性的set访问器包含隐式value参数
索引器a通过签名标识。
b通过元素访问来访问。
c必须为实例成员。
d索引器的get访问器具有与索引器相同的形参表
e除了value参数外,索引器的set访问器还具有与索引器相同的形参表
5.如何在C#中实现继承?
在类名后加上一个冒号,再加上基类的名称。
6.C#支持多重继承么?
不支持多继承。
可以用接口来实现。
7.被protected修饰的属性/方法在何处可以访问?
在继承或间接继承与这个类的子类中可以访问。
8.私有成员会被继承么?
会,但是不能被访问。
所以看上去他们似乎是不能被继承的,但实际上确实被继承了。
9.简述private、protected、public、internal修饰符的访问权限。
private:
私有成员,在类的内部才可以访问。
Protected:
保护成员,该类内部和继承类中可以访问。
public:
公共成员,完全公开,没有访问限制。
internal:
在同一命名空间内(同一个程序集中)可以访问。
10.可访问性级别有哪几种?
public访问不受限制。
protected访问仅限于包含类或从包含类派生的类型。
internal访问仅限于当前程序集。
protectedinternal访问仅限于从包含类派生的当前程序集或类型。
private访问仅限于包含类型。
11.请描述一下修饰符protectedinternal。
被protectedinternal修饰的属性方法只能在它的在同一个
程序集(Assembly)中的子类被访问。
12.C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,
还想保留这个无参数的构造函数。
这样我应该写几个构造函数?
两个,一旦你实现了一个构造函数C#就不会再提供默认的构造函数了,所以需要手动实现那
个无参数构造函数。
13.C#中所有对象共同的基类是什么?
System.Object.
14..重载Overload和覆写Override(重写)有什么区别?
(1)重载:
针对一个类来说,当定义两种或多种具有相同名称的方法时,就称作重载。
只要方法名相同,别的可以不同,方法的重载一般满足2个条件
⑴返回类型相同,参数类型相同,参数个数不同;
⑵返回类型不同,参数类型不同,参数个数相同
⑶参数加ref或者out,与不加ref或out也可以构成重载,但是参数加ref和out不能同时一起构
成重载的。
(2)重写:
一般用于有继承关系的类(针对多个类),多数情况下是父类中有抽象方法或者虚方法,在
子类中使用override关键字重写父类的方法,而且重写方法的名称,方法的返回类型,参数类型,
参数个数都要和基类一致。
15.在方法定义中,virtual(虚有的方法)有什么含意?
被virtual修饰的方法可以被子类覆写。
16.能够将非静态的方法覆写成静态方法么?
不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。
17.可以覆写私有的虚方法么?
不可以,甚至子类中无法访问父类中的私有方法。
18.能够阻止某一个类被其他类继承么?
可以,使用关键字sealed。
(密封类:
不能被其他类继承)
19sealed关键字有什么特点?
sealed修饰符可以应用于类、实例方法和属性。
修饰类,那么此类不能被继承,密封类不能被继承。
密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。
当应用于方法或属性时sealed修饰符必须始终与override一起使用。
20.能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?
可以,标记这个类为public,并标记这个方法为sealed。
21.什么是抽象类(abstractclass)?
一种不可以被实例化的类。
抽象类中一般含有抽象方法,当然也可有具体实现。
继承类只有实现
过所有抽象类的抽象方法后才能被实例化。
22.何时必须声明一个类为抽象类?
当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。
23.为什么不能指定接口中方法的修饰符?
接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。
他们
默认为公有方法。
24.那么如果这些接口中有重复的方法名称呢?
这种情况中你可以决定如何实现。
当然需要特别得小心。
但是在编译环节是没有问题的。
(只是会提出警告:
这时可以使用New关键字消除警告)
25请解释接口的显式实现有什么意义?
答:
规定强制执行,保持一致
26.虚方法(virtual)和抽象(abstract)方法区别:
虚方法和抽象方法都可以用override重写。
在子类中重写后,会覆盖父类中的方法。
抽象方法必须在子类中重写。
抽象方法没有方法体,虚方法有方法体。
在子类中也可以不重写父类中的虚方法,或者不写自己的方法,则子类可以使用Base调用父类
中的虚方法。
27.什么是虚函数?
什么是抽象函数?
虚函数:
没有实现的,可由子类继承并重写的函数。
抽象函数:
规定其非虚子类必须实现的函
数,必须被重写。
28abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
答:
都不能。
30接口(interface)和抽象类(abstractclass)的区别是什么?
(1)接口也可以理解为一种特殊的抽象类,也可以实现多态和继承。
接口中的字段,属性,方法等都不做具体的实现。
接口是一组规范,一种标准,必须实现了接口才能实现某种功能。
通常用来约束类的行为。
实现接口的子类,必须实现接口中提供的未实现的方法或属性等。
接口支持多继承,一个类可以实现多个接口。
接口可以作为返回值或者参数来使用。
接口传递的
是:
实现了接口的类的实例化对象;返回的也是:
实现了接口的对象。
(2)抽象类:
声明方法的存在而不去实现它的类被叫做抽像类(abstractclass)
抽象类不能被实例化,必须通过子类来实例化。
(里氏替换原则)。
实例化以后,父类中的抽象
方法会被子类覆盖。
抽象类不能是静态或者密封类(因为抽象类一般是做父类对象);
抽象类中不一定有抽象方法(抽象类中即可以包含抽象方法:
没有实现的方法;也可以包含非
抽象方法:
实现的方法,具体方法;也可以指定方法的访问修饰符),有抽象方法的类一定是抽象
类(抽象方法必须包含在抽象类中)。
当子类继承抽象类,一定要实现抽象类中的抽象方法。
31接口是否可以继承接口?
抽象类是否可以实现(implements)接口?
抽象类是否可以继承实体类
(concreteclass)?
接口是可以继承接口的,抽象类是可以实现接口的,抽象类可以继承实体类,但是有个前提条件(实
体类必须要有明确的构造函数。
)
32C#中接口(Interface)和类(class)的异同接口和类都是类,不同的事,接口只包含方法或属性的声明,不包含具体实现方法的代码,
接口可以实现多继承,而类只能是单继承,继承接口的类必须实现接口中声明的方法或属性。
接
口主要定义一种规范,统一调用方法,在大型项目中接口正发挥日益重要的作用。
接口是一种规范,声明方法、字段等而不去实现它,具体的实现交由实现它的子类来完成,可
以理解成抽象类的变体。
同时也不能声明为static、sealed类。
类是方法和字段具体实现的地方,实现接口则必须实现接口中所有的方法等
接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!
而类是负责功能的
具体实现!
在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类
里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
但接口是一个行为
的规范,里面的所有东西都是抽象的!
一个类只可以继承一个基类也就是父类,但可以实现多个接
口
33.请你说说.NET中类(class)与结构(struct)的区别?
Class可以被实例化,属于引用类型,是分配在内存的堆上的,
Struct属于值类型,是分配在内存的栈上的.
结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:
尽管结构的静态字段可以
初始化,结构实例字段声明还是不能使用初始值设定项。
结构不能声明默认构造函数(没有参数的
构造函数)或析构函数。
结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。
实际上,
编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。
结构不能从类或其他结
构继承。
结构是值类型--如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的
全部值。
复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的
数据。
由于结构不使用引用,因此结构没有标识--具有相同数据的两个值类型实例是无法区分的。
C#中的所有值类型本质上都继承自ValueType,后者继承自Object。
编译器可以在一个称为装
箱的过程中将值类型转换为引用类型。
结构具有以下特点:
l结构是值类型,而类是引用类型。
2。
向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。
3.与类不同,结构的实例化可以不使用new运算符。
4.结构可以声明构造函数,但它们必须带参数。
5一个结构不能从另一个结构或类继承,而且不能作为一个类的基。
所有结构都直接继承自
System.ValueType,后者继承自System.Object。
6结构可以实现接口。
7在结构中初始化实例字段是错误的。
(类可以实现接口。
)
34.如何区别重载方法?
不同的参数类型,不同的参数个数,不同的参数顺序。
(具有相同方法名名称)
35.const和readonly有什么区别?
const关键字用来声明编译时常量,固定不变的常量。
(.NET中声明常量使用的关键字)
readonly用来声明运行时常量
每一个class至多只可以定义一个static构造函数,并且不允许增加访问级别关键字,参数列
必须为空。
为了不违背编码规则,通常把static数据成员声明为private,然后通过statciproperty提
供读写访问。
const关键字用于修改字段或局部变量的声明。
它指定字段或局部变量的值不能被修改。
常
数声明引入给定类型的一个或多个常数。
const数据成员的声明式必须包含初值,且初值必须是一个
常量表达式。
因为它是在编译时就需要完全评估。
const成员可以使用另一个const成员来初始化,前提是两者之间没有循环依赖。
readonly在运行期评估赋值,使我们得以在确保“只读访问”的前提下,把object的初始化动作
推迟到运行期进行。
readonly关键字与const关键字不同:
const字段只能在该字段的声明中初始化。
readonly字
段可以在声明或构造函数中初始化。
因此,根据所使用的构造函数,readonly字段可能具有不同的
值。
另外,const字段是编译时常数,而readonly字段可用于运行时常数。
readonly只能在声明
时或者构造函数里面初始化,并且不能在static修饰的构造函数里面。
36.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?
Using引入一个名子空间,或在使用了一个对像后自动调用其IDespose,
New实例化一个对像,或修饰一个方法,表此方法完全重写此方法
37.构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
38.new关键字有几种用法?
(1)new运算符用于创建实例化对象和调用构造函数。
(2)new修饰符用于向基类成员隐藏继承成员,隐藏基类的方法。
(注意:
当子类和父类中有相同的方法名时:
使用new可以消除警告)
(3)new约束用于在泛型声明中约束可能用作类型参数的参数的类型。
39.概述反射和序列化?
(一)序列化:
(1)序列化是将对象转换为容易传输的格式的过程。
就是将对象的状态存储到特定
存储介质的过程,也可以说是将对象状态转换为可保持或传输的格式的过程。
在序列化过程中,会
将对象的公有成员,私有成员包括类名,都转换为数据流的形式,存储到存储介质中,这里说的存
储介质通常是文件。
例如,可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务器之
间传输该对象。
在另一端,反序列化将从该流重新构造对象。
注意:
如果要序列化某个特定对象,他的各个成员对象也必须是可序列化的。
(2)特性:
使用[Serializable]标记一个类是可序列化,而[Serializable]本身就是可序列
化特性。
所谓特性,就是为目标元素(可以是数据集,模块,类,属性,方法,甚至函数参数等)
加入附加信息,类似于注释。
特性本质上也是一个类,[Serializable]对应的类是
SerializableAttribute.(一般特性命名都是以Attribute结尾)
(3)例如:
FileStreamfileStream=null;
fileStream=newFileStream(“profile.bin”,FileMode.Create);//定义一个文件流
BinaryFormatterbf=newBinaryFormatter();//二进制方式(使用二进制格式化器)
bf.Serialize(fileStream,Profile);//序列化保存配置文件对象Profile
序列化需要通过文件流来保存文件,所以要先定义一个文件流,BinaryFormatter是一个二进
制格式化器。
方法:
publicvoidSerialize(StreamserializationStream,Objectgraph)
第一个参数是:
指定序列化过程的文件流
第二个参数是:
要保存的对象
(4)反序列化:
(读取文件)
就是从特定存储介质中将数据重新构建对象的过程。
可以将存储在文件上的对象信息读取出来。
通过方法:
publicObjectDeserialize(Streamserializationstream)将存储介质的数据文件流转为Object。
(5)序列化的用途和好处:
通过序列化将对象从一个应用程序发送到另一个应用程序中。
在远程通信中应用广泛,可以
将一个应用程序中对象序列化,然后通过网络通信远程传递到其他指点的另一个应用程序。
(二)反射:
(1)简单概述为“动态获取程序集信息”。
程序集包含模块,而模块包含类型,
类型又包含成员。
反射则提供了封装程序集、模块和类型的对象。
您可以使用反射动态地创建类型
的实例,将类型绑定到现有对象,或从现有对象中获取类型。
然后,可以调用类型的方法或访问其
字段和属性
(2)A:
可以用ILDasm反编译工具浏览一个Dll和EXE的构成,这种机制我们称为反射。
B:
它用于在运行时通过编程方式获得类型信息。
例如:
当在VisualStudio中输入一个类型,
然后输入“.”时,就会拉出一个列表,显示类型的属性,方法,事件等。
这都是利用了反射机制。
C:
反射可以获取已加载的程序集和在其中定义的类型的信息,也可以使用反射在运行时创建
类型实例,以及调用和访问这些实例。
(3)反射的功能:
就是查找程序集的信息.System.Refection.AssemBly类可以用于访问给定的程序集的信息,
它允许访问给定程序集的元数据。
好处:
反射得到的版本号的最大用处是定期升级软件,反射时一个非常强大的机制,利用反
射,可以了解一些没有源代码的程序的结构,从而提高程序集的利用效率
(三)程序集
(1)程序集:
在一个.NET的WinForms应用程序编译后,在bin\Debug文件夹中生成一个.exe
文件,这个编译好的.exe文件就是程序集。
程序集:
是.Net框架应用程序的生成块,他包含编译好的代码逻辑单元。
组成:
它有描述它的程序集清单,类型元数据,MSIL(微软中间代码,实现类型元数据的
中间代码)代码和资源组成
(2)查看程序集:
.Net中提供一个反编译工具ILDasm可以看到程序集中类和方法。
具体步骤:
在VisualStudio2005的命令行窗口,输入ILDasm.exe,就可以打开反编译器。
无论是类库(在类库下生成的文件扩展名是.Dll,.dll叫动态链接库文件,包含的都是类文件)
还是可执行的EXE(.exe是WinForms下的文件的扩展名)应用程序,在我们创建一个VisualStudio
项目时,会自动生成一个源文件AssemblyInfo.cs,在这个文件中可以使用一般的源代码编辑器编辑
程序集的特性。
40.什么叫应用程序域?
应用程序域:
就是为安全性,可靠性,隔离性,和版本控制,及卸载程序提供的隔离边界。
它通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。
应用程序域
提供了一个更安全,用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。
(简单的:
理解为一种轻量级进程;起到安全的作用;占用资源小)
(1)CTS、CLS和CLR分别作何解释?
CLR公共语言运行时(CommonLanguageRuntime)是所有.NET应用程序的编程基础,是所有.NET
应用程序运行时环境。
(类似于Java中的JVM,Java虚拟机)
CLR包含两个组成部分:
CTS:
通用类型系统(CommonTypeSystem)用于解决不同语言的数据类型不同问题,是一种
确定公共语言运行库如何定义、使用和管理类型的规范。
CLS:
公共语言规范(CommonLanguageSpecification)所有的.NET语言都应该遵循这个规
则,这样才能创建与其他语言完全进行交互操作的应用程序,不管这些对象是以何种语言实现
的。
它是许多应用程序所需的一套基本语言功能
2)什么是托管代码?
什么是受管制的代码?
A:
托管代码:
使用基于公共语言运行库(CLR)的语言编译器开发编写的代码就叫托管代码。
(CLR可以看作一个在执行时管理代码的代理,能够被管理的代码称为:
托管代码。
C#和VB.NET
都是公共语言运行时的托管代码。
);托管代码的优点:
跨语言集成、跨语言异常处理、增
强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等
B:
unsafe非托管代码:
不经过CLR运行,不能够被管理的代码。
3)什么是强类型系统?
RTTI:
类型识别系统(C#是强类型语言,因此每个变量和对象都必须具有声明类型)
4)IL是什么含义?
IL,中间语言,也称MSIL,微软中间语言,或CIL,通用中间语言;所有.NET源代码(不管用
哪种语言编写)在进行编译时都被编译成IL。
在应用程序运行时被即时(Just-In-Time,JIT)
编译器处理成为机器码,被解释及执行。
.DotNET(.net)是2000年比尔.盖茨提出来的一个思想
.DotNETFrameWork
是微软为了实现.net思想而造的一个框架
(1)公共语言运行时(CLR)
(2)类库集(FCL)
.在类库集(FCL)中,包括了所有编写.NET程序时所要应用到的函数(方法)
.公共语言运行时,是来运行编译好的.NET程序的
..NET程序必须是两次编译才可以运行
.第一次编译后的.NET程序,我们叫做中间语言(MSIL+元数据)
.第二次编译后,才能成为机器代码,让计算机识别并执行。
.公共语言运行时,包括两个部分,分别为CLS及CTS
41.什么是装箱和拆箱?
装箱和拆箱使值类型能够被视为对象。
对值类型装箱将把该值类型打包到Object引用类型的一
个实例中。
这使得值类型可以存储于垃圾回收堆中。
拆箱将从对象中提取值类型。
装箱:
把值类型转换为引用类型的过程,是隐式的拆箱:
从引用类型转换到值类型,是显式的
装箱操作:
是将值类型转换为object类型的操作叫装箱,
例:
intinti=1000;
objectobji=inti;//装箱的操作
拆箱操作:
是将object类型转换为其它类型的操作叫拆箱,
例:
intintj=(int)obji;//在拆箱的时候,必须将其拆为int类型,因为苹果装到箱子里后,是决不
可能拆出葡萄的!
42.值类型和引用类型的区别?
在C#中分为两种基本类型,值类型,引用类型
(1)值类型的值和地址都是存放在堆栈中的,改变其值,不改变变量原有的值,而引用类型的值是存
放在堆中的,其引用的地址是存放在栈中的,改变其值也就改变了变量原有的值。
(引用类型,值是
存放在托管堆当中的,在堆栈当中存放的是其指向托管堆值的地址。
)
(2)基于值类型的变量直接包含值。
将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
这与引用类型变量的赋值不同,引用类型变量的赋值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整版 NETOOP 面向 对象 编程 试题