.NET面试题——第7篇 C#类和对象

1. 什么是类和对象以及关系?

对象:一种具有状态(属性)和行为(方法)的编程实体,用于描述现实世界的某个具体事物。

类:具用一系列对象共同特征和行为的通用类型。

对象和类的关系:

类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类,类描述了一组有相同属性和相同方法的对象。

2. 面向对象的主要思想包括什么?

在面向对象中,一切皆为对象,面向对象的三大特征:

1)封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。。

2)继承:继承可以解决代码复用问题,子类可以沿用父类方法和属性的一种方式。

3)多态:继承同一父类的不同子类,对父类方法的不同实现。分为方法的隐藏和重写。

3. 用接口或父类作为输入的参数有什么好处?返回值如果是接口是为了什么?

接口或父类作为参数,所有继承了此接口或父类的类都可以使用,即你给此方法传参数的时候,可以把继承了这个接口或父类的类的实例传给这个方法。可以一次性传入多种字段、方法等而不用定义多个形参,接口作为返回值,返回的是实现接口的对象。

4. C#中的接口和抽象类有什么异同?

从形态层面上:

相同点:抽象类和接口的都是抽象的,不能实例化,需要子类实现其抽象成员。

不同点:

1)抽象类是类的部分实现,可以包含已实现的成员,而接口不能包含任何成员的实现。

2)抽象类与普通类一样,可以继承类和实现接口,而接口只能继承接口,不能实现接口。

从设计层面上:

不同点:

1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

2)抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

3)抽象类一般作为父类使用,和实现类往往属于同一类事物,而接口和实现类则不然,只是一种实现关系,例如:演员和角色的关系。

5. 请解释接口的显式实现有什么意义?

显式实现接口:实现类在实现接口中方法时,方法名前必须添加接口名,且不能添加访问修饰符。在调用时,显式实现接口的方法只能通过接口访问,不能通过类访问。

这样做的好处:

1)若一个类实现接口,而接口中的方法只需要在类的内部实现,则可以使用显式实现接口的方式,这样类的实例这无法使用该接口成员。

2)显式接口成员可以避免了成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式实现接口方式。

6. 接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承类?

在C#中,接口可以继承接口,但不是实现接口,因为,接口中不能存在实现的成员。

抽象类与普通类无差异,只是不能被实例化而已,因此,抽象可以实现接口,也可以继承类,但抽象类一般作为父类使用。

7. 说出一些常用的类、接口,请各举5个。

常用的类:StreamReader、WebClient、Dictionary<K,V>、StringBuilder、SqlConnection、FileStream、File、Regex、List<T>

常用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary

8. 在下面的例子里

using System;

class A

{

public A()

{

PrintFields();

}

public virtual void PrintFields(){}

}

class B:A

{

int x=1;

int y;

public B()

{

y=-1;

}

public override void PrintFields()

{

Console.WriteLine(“x={0},y={1}”,x,y);

}

当使用new B()创建B的实例时,产生什么输出?

创建子类对象时,先调用父类构造方法,再调用子类构造方法,当调用父类构造方法时,由于还未调用子类构造方法,因此,x=1,y=0,当调用父类构造方法时,在父类构造方法中将调用PrintFields()方法,而该方法为虚方法且被子类重写,由于目前为子类对象,因此,调用子类重写后的PrintFields()方法,故输出:X=1,Y=0。

9. 构造器Constructor是否可以被继承?是否可以被Override?

Constructor不可以被继承,因此不能被重写(Overriding),但可以被重载(Overloading).

10. 是否可以继承String类?

因为String类是密封类所以不可以继承string类。

11. 什么是虚函数?什么是抽象函数?

虚函数:可由子类继承并重写的函数。

抽象函数:规定其非虚子类必须实现的函数,必须被重写。

12. 用sealed修饰的类有什么特点?

该类为密封类,不可被继承

13. 在.Net中所有可序列化的类都被标记为什么?

使用Serializable特性标记

14. override与重载的区别

Override**:方法重写子类对父类中**的方法进行重新实现,要求,父类与子类之间、方法名和参数类型,数量,顺序一致。在C#允许子类对父类的抽象方法或虚方法进行重写,以适应新的需求。

重载:在同一类中,存在多个具有相同方法名,而不同参数列表的方法,在调用时根据实际参数确定执行哪个重载方法。

15. 下面的代码中有什么错误吗?

using System;

class A

{

public virtual void F(){

Console.WriteLine(“A.F”);

}

}

abstract class B:A

{

public abstract override void F();

}

答案:abstract override 是不可以一起修饰方法

16. .NET中读写文件需要用到那些方法?他们的作用?

1**)File类:**

使用场合:当读写文件大小不大,同时可以一次性进行读写操作的时候使用

使用方式:不同的方式可以读写文件类型不一样。

ReadAllBytes() WriteAllByte():可以读写任意类型的文件

ReadAllLines() ReadAllText():只能读写文本类型文件

2**)FileStream类:**

使用场合:当读写大文件的时候使用,它可以自定义读写的数组大小

使用方式:一个流对象只能做一个事情:如果需要读和写那么就需要创建两个流

读取:将数据读取到数组

写入:将数组的数据再写入到文件

3**)StreamReader/StreamWrite类:**

使用场合:只能对文本文件进行读写操作

使用方式:它可以按行、按字符以及按块进行读取和写入

17. 在C#中using和new这两个关键字有什么意义,请写出你所知道的意义?

using 关键字有两个主要用途:

1)作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。

2)作为语句,用于定义一个范围,在此范围的末尾将释放对象。

在 C# 中,new 关键字可用作运算符、修饰符或约束。

1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。

2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。

3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。

18. New有几种用法

在 C# 中,new 关键字可用作运算符、修饰符或约束。

1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。

2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。

3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。

19. 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?

using 引入名称空间或者使用非托管资源

new 新建实例或者隐藏父类方法

20. String s = new String("xyz");创建了几个String Object?

两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

21. 请简述结构和类的区别

1、类型不同:结构是一种值类型,而类是引用类型。

2、存储不同:结构使用栈存储,而类使用堆存储。栈的空间相对较小.但是访问效率相对较高.堆的空间相对较大.但是访问效率相对较低。

3、作用不同:类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性。

4、初始化不同:类可以在声明的时候初始化,结构不能在申明的时候初始化(不能在结构中初始化字段),否则报错。

22. 简述 private、protected、internal 、public 修饰符的访问权限。

private : 私有成员, 在类的内部才可以访问。

protected : 保护成员,该类内部和继承类中可以访问。

internal: 在同一程序集内可以访问。

public : 公共成员,完全公开,没有访问限制。

23. 概述反射和序列化

反射就是为了在程序的运行过程中动态的获取类的方法和属性, 优点就是可以实现动态创建对象和编译,体现出很大的灵活性,缺点是对性能有影响。

序列化是将对象状态转换为容易传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

24. 请解释一下IClonable

IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().

深度复制(Deep Copy)与浅表复制(Shadow Copy)

ps:博主的.net core学习交流群—qq裙:831181779

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想只会CRUD的猿某人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值