天天动画片 > 八卦谈 > C#常见面试题讲解

C#常见面试题讲解

八卦谈 佚名 2023-04-23 15:22:06

1. 封装 :

        隐藏对象的属性,并实现细节(方法),对外提供接口

2. 访问修饰符:

        public全局公有、private该类本身访问、protected可被子类访问,用sealed声明类则该类不能继承,声明方法则不能被重写

3. 继承:

        子类继承父类,重用父类代码

4. 多态:

        父类引用,指向子类对象。

        例:Animal cat = new Cat();

                cat.method();

        当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有则编译错误 如果有,执行的是子类重写后的方法。

5. virtual虚方法:

        可以被子类重写的方法,如果子类重写了虚方法,那么运行时将使用重写后的逻辑,如果没有重写,则使用父类中虚方法的逻辑

6. abstract抽象类:

        该抽象方法必须被子类重写。

7. interface接口:

        接口只能是功能的定义,而不是实现。具体功能由子类实现。

        抽象类和接口的异同可看UP主(_宣纸泛黄)的视频。

8. 值类型和引用类型的区别(可看视频):

        值类型:数据存储在栈上,会自动释放。包含int、float、结构体等。

        引用类型:数据存储在堆上,需要GC(垃圾回收期)释放。包含string,calss等。

9. 装箱和拆箱(可看视频):

        值类型转为引用类型称为装箱,反过程称为拆箱。尽量避免装箱拆箱,推荐使用重载和泛型。

10.   foreach迭代器遍历和for循环遍历的区别:

        foreach只读,foreach循环的时候会释放使用完的资源,所以会造成额外的GC开销,因此要尽量避免使用foreach。

11.   string和stringbuilder和stringBuffer区别:

        对string类型进行添加和删除会创建新字符串并删掉原来的。

        stringbuilder和stringBuffer是字符串可变对象,对原实例对象做拼接,不会生成新的实例。

12.   请简述GC垃圾管理器,和GC产生的原因,并描述如何避免?(看26)

        GC垃圾回收机制,避免堆内存溢出,定期回收那些没有有效引用的对象内存。GC优化,就是优化堆内存,减少堆内存,即时回收堆内存

如何避免?

    1.减少new的次数

    2.字符串拼接使用stringbuilder,字符串比较先定义一个变量存储,防止产生无效内存

    3.list,new时候,规定内存大小

    4.foreach迭代器容易导致GC,使用For循环

    5.使用静态变量,GC不会回收存在的对象,但静态变量的引用对象可能被回收

13.  C#中有哪些常用的容器类,各有什么特点,性能区别?

        栈、队列、List(泛型存储)、LinkedList、字典(泛型存储)。插入、遍历、删除都是数据结构里的。泛型存储的优点是不用装箱拆箱。字典就是哈希表。

14.  当需要频繁创建使用某个对象时,有什么好的程序设计方案来节省内存?

        对象池技术。

15.  C#中ref和out关键字有什么区别?

        ref和out可将值传递改为引用传递。值传递需要开辟内存空间,引用传递直接在原来的内存上做修改。区别在于ref修饰的参数需要初始化,out不需要。

16. 泛型是什么?

        有共同行为/操作的对象,一切类型的父类

        详解:https://www.cnblogs.com/dotnet261010/p/9034594.html

17. 结构体和类的区别?

       结构体是值类型,不可被继承,不需要构造函数,声明时不能指定初始值。

       类是引用类型,可被继承,需要构造函数,声明时可指定初始值。

18. C#是否能多继承?

       可以,一个类可以继承多个接口。隐藏知识点:一个类不能继承多个类。

19. 委托Func和action的区别?

       Func要有返回值, Action没有返回值

20. 接口和抽象类的区别(看视频讲解)?

          抽象类            接口

        被子类继承       被类实现

       方法声明+实现       只能声明

21. 抽象类是什么?

       用 abstract 修饰的类是抽象类

       抽象类不能实例化。

       抽象类可以包含抽象方法和抽象访问器。

       虚方法,抽象类,接口是三种实现多态的手段

22. arraylist和Hashset的区别?

        首先arraylist底层是动态数组,可以存储重复的值,并且如果不约定下标的话,是有序的。而hashset底层是hash表,由于会比较hash值和equals,所以他是不可重复并且是无序的。

       简单的说一个是有序可重复,一个是无序不可重复。

23. 我们都知道一个类可以有多个构造函数,并且C#会在我们创建类的时候默认的提供一个无参的构造函数,当我实现了另外一个有参数的构造函数的时候,我还能调用无参数的构造函数吗?请说明原因。

        答:不能,因为一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要自己手动写入一个无参数的构造函数。

24. override与重载的区别

       重载是方法的名称相同,参数或参数类型不同,进行多次重载以适应不同的需要。

       Override是进行基类中函数的重写。子类方法会覆盖父类、。

25. 请问能设置类A可被继承,但类A中的某个方法不能被重写吗?

       能,将类A的修饰符标记为public、标记类A中的不允许重写的方法为sealed

       sealed关键字不仅可以限制类,也可以限制方法。

26. 什么是垃圾回收器(GC)

        垃圾回收器管理应用程序的内存分配和释放。 每当有对象创建时,垃圾回收期都会从托管堆为对象分配内存。 只要托管堆中有地址空间,运行时就会继续为新对象分配空间。但是内存并不是无限的,垃圾回收器最终必须执行垃圾回收来释放一些内存。不过开发人员不必手动释放内存,垃圾回收器会自动选择合适的时间释放内存。同时开发人员也可以调用 GC.Collect 方法回收垃圾。


本文标题:C#常见面试题讲解 - 八卦谈
本文地址:www.ttdhp.com/article/28620.html

天天动画片声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
扫码关注我们