.Net 面试题整理(一)

.Net 面试题整理(一)

好久的资料了,拿出来分享给大家,主要是记录一些面试题整理。

  1. Main函数是什么?在程序中使用Main函数有什么需要注意的地方?
    Q:程序的入口函数!函数名字不能改变;一个程序中有且只有一个Main函数。

  2. CLR是什么?程序集是什么?当运行一个程序集的时候,CLR做了什么事情?
    Q:Common Language RunTime 公共语言运行时。
    编译后代码的集合。(包括exe和dll)。 加载项目里所有的类到内存,并找到其中的主函数,并作为默认的启动函数调用执行。

  3. 值类型的默认值是什么?(情况一:字段或全局静态变量;情况二:局部变量)
    Q:如果是全局变量,并且没赋值,就会有默认值,如:int 是0;bool 是false;枚举enum;结构体struct;
    如果是局部变量,就必须手动赋值。

  4. 声明一个变量时在内存中做了什么事情?初始化一个变量的时候又在内存中做了什么事情?
    Q:在栈中开辟空间,并将变量放入空间里,默认值都是null。
    初始化时:
    如果是值类型,则直接放入栈中;
    如果是引用类型,则在堆中开辟一块空间,将堆中对象的地址指针放入栈中

  5. new关键字做的事情?
    Q:开辟空间,创建对象,调用构造函数,返回堆地址。
    还可以 显示的隐藏 父类的同名方法。

  6. 数组
    061.数组一旦创建后,能不能修改数组的长度?
    Q:不能。为什么呢?数组是引用类型。它在创建时,已经根据创建的长度在内存中开辟一块连续的空间。

  7. 多维数组 本质就是一个一位数组,只不过访问的 时候需要使用多个下标访问
    071.如何声明一个多维数组?
    Q:多维数组string[,] strArr=new string[3,3];

    072.如何获取多维数组的总长度?
    Q:各个纬度元素的个数的乘积

  8. 交错数组
    081.如何声明一个交错数组?
    Q:交错数组:int[][] arr=new int[3][3];

    082.交错数组的本质是什么?
    Q:本质是一个数组的数组。简单的说这个数组的元素是一个数组。

面向对象(一)

01.为什么要有方法?
Q:为了复用。(封装)(重复调用,封装具体实现)

02.如何实现方法的重载?
Q:方法名相同,但参数列表不同。(和返回值无关)

03.引用参数(ref)和输出参数(out)的相同点与不同点?
Q:相同点:传递的都是(栈)引用。
不同点:
out侧重于输出参数;ref侧重于修改;
out必须方法返回之前赋值;ref必须在传入之前赋值。

04.在什么情况下使用引用参数(ref)和输出参数(out)?
Q:如果方法有多个返回值,则可以用out或者ref。只不过ref侧重于修改(即将值传进去修改后再拿出来);而out是为了从方法中获得一个值后拿到方法外使用。
05.可变参数与普通数组参数的区别?
Q:params关键字。
特点:
一个方法中只能有一个可变参数;
而且必须放在参数列表最后;
如果没有给可变参数赋值,就初始化长度为0;

01.面向对象的三大特征是什么?
Q:封装;继承;多态;

02.类和对象的关系?
Q:抽象和具体的关系。类是抽象(模板,设计图纸),对象是具体(按照图纸设计的房子)。类是对对象的抽象描述,而对象是类的具体化。

03.创建某一个类的对象的时候,在内存中做了什么事情?例如 Person p = new Person();
Q:开辟空间,创建对象,调用构造函数。(在内存的堆中开辟空间,创建Person对象,然后在内存的栈中开辟一个放一个p,然后将Person对象在堆中的引用地址赋值给对象p)
04.属性存在的目的是什么?
Q:封装字段。为了对字段的操作设置规则。(本质是两个方法,一个get方法和一个set方法)
05.访问修饰符有哪些并分别每一个访问修饰符?
Q:public(公有的),
private(只有本类可以访问),
internal(程序集内共享,如果不写修饰符,默认就是internal),
protected(本类和子类可以访问),
extern(供外部访问,eg:C#提供接口给C++访问)
06.为什么要有构造函数呢?
Q:主要方便程序猿在实例化对象的时候就为对象里的一些属性和字段初始化赋值。
07.什么是封装?封装的目的是什么?
Q:封装就是将对象的字段、行为和功能等“弄”到一起。
封装的目的:隐蔽代码实现/复用/修改方便
08.类的命名规则是什么?
Q:类命名:首字母大写(帕斯卡命名)。变量命名:首字母小写(骆驼命名)

面向对象(二)

01.什么是类型?
Q:用来定义某一种数据在内存里开辟空间的大小,还可以预置操作此种类型数据的相关方法

02.this关键字在方法中使用时,它代表什么?
Q:this指当前类的对象,或者他的父类的类对象。
base只能指向父类的对象。

03.值类型变量的初始化(内存分配)?(两种情况:一是类的成员变量,二是:方法的局部变量)
Q:1、当变量是一个类的成员变量的时候,那么该变量是跟随累的对象存在于堆内存。当对象引用断开时,等着垃圾回收器进行清理时便被销毁
2、当变量是一个方法的局域变量时,那么该变量是在方法被调用时,存在于栈内存,方法执行完毕后被销毁

04.继承
041.继承的好处?
Q:1.提高代码的复用;
2.实现多态;

042.继承的单根性
    Q:一个类只能继承一个父类。

043.继承的传递性
    Q:指子类只能继承父类的非私有的成员。

044.当存在继承关系的时候,在子类中如何访问父类的非私有成员?
    Q:通过base关键字--(只能获取父类的)(base就是存在于子类对象里,用来指向父类对象的指针)
       或者通过this关键字--(可以获取父类的非私有的成员和本类的成员)

05.什么是里氏替换原则?
Q:子类替换父类所在的位置

06.子类与父类对象之间的转换?
Q:子类可以强制转换为父类,但是父类不能转换为子类。

07.is 和 as 操作符的用处和区别?
Q:is是对类型的判断,返回bool。(判断A是否是B类,或者A是不是B的子类)。(如果一个对象是某个类型或是其父类型的话就返回true,否则就会返回为false。另外is操作符永远不会抛出异常。
as是用来做类型转换的。as只能针对引用类型的转换。as 是先判断再转换(as 操作符首先测试转换是否合法,如果合法就转换,否则返回NULL。不会报错)
这两者都不会抛出异常。

08.override可以重写哪些 “类型” 的方法?
Q:可以重写虚方法(virtual)–必须有方法体
还可以重写抽象方法 (abstract)–没有方法体

09.什么是多态?
Q:就是用某个子类来实例化父类,调用的是父类的抽象方法(虚方法),但实际执行的是子类实例重写的方法

10.抽象方法只能定义在抽象类中吗?
Q:是的。
(virtual or abstract members cannot be private)

面向对象(三)

01.CLR什么时候加载类?
Q:是在第一次在代码中遇到这个类的时候才加载类的静态成员和信息。(为了节约资源,只在用的时候才开始加载进去)

02.当存在继承关系的时候,创建子类对象的时候会不会创建父类对象呢?
Q:这个很易错!!!!当我们创建一个子类时不会创建父类对象,只会有一个对象。Person c=new Student(),(当我们new一个子类的时候,在内存中,只有一个子类对象)
!!–!!—-那下面括号里面的就是错误的!!!
(new子类时,先创建子类对象,调用子类的构造函数时,创建父类对象,调用父类构造函数最后返回来执行子类构造函数方法体代码

子类默认调用父类的无参构造函数
如果父类里没有无参构造函数,则必须显示的调用)
其实在内存中是没有对象概念的!new的时候是根据子类和父类所有静态成员的大小以及类型指针开辟一个总的空间(此空间不包含方法),子类和父类的类型指针指向两个类的方法表,所以,子类对象可以访问到父类和子类的方法。

03.如果子类和父类存在同名但没有重写关系的方法的时候,那么会调用哪个方法?(两种情况:一是使用子类对象,而是使用父类对象)
Q:如果子类和父类存在同名但没有重写关系的方法,那么调用时,如果是父类变量调用,则调用父类方法,如果是子类变量调用,则调用子类方法

04.如果子类和父类存在同名且有重写关系的方法,那么会调用那个方法?(两种情况:一是使用子类对象,而是使用父类对象)
Q:如果子类和父类存在同名且有重写关系的方法,那么不管变量是什么类型,调用的都是子类的方法。

05.虚方法和抽象方法的相同点与不同点?
Q :相同点:都能被子类重写;都不能为私有的
不同点:
1.abstract 和virtual的关键字不同
2.抽象方法一定没有方法体,而虚方法必须有方法体。
3.virtual方法的子类可以重写父类方法也可不重写,而抽象方法的所在的类的子类必须重写该父类方法
4.抽象方法必须在抽象类中声明,而虚方法可以存在于任何一个类里面
5.virtual方法必须有现实(哪怕是空实现),而abstract方法必须没有实现

06.子类中的base关键字指向的是子类对象还是父类对象?它本身的类型是子类类型还是父类类型呢?
Q:当然是指向的父类对象。 但是本身是子类的类型。
(base就是子类对象本身,只不过类型是父类)

07.为什么要有抽象类?
Q:抽象类存在的目的就是指定规则,而不是具体实现,是为了约束子类的行为,具体实现交给子类完成。

08.使用多态的好处是什么?
Q:1.低耦合,高内聚。(低耦合—代码的内部各个层之间的关联小,相互之间约束少。 高内聚—方法的功能和职责单一,即一个方法只做一件事情。)
2.实现代码的可维护性 和 可扩展性。
3.把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

09.什么情况下的类不能被实例化?
Q:1.抽象类
2.静态类
3.类的构造函数被私有化

10.什么情况下抽象类的子类不需要实现父类的抽象成员?
Q:子类也是抽象类的时候。

11.虚方法(虚拟成员)和抽象方法(抽象成员)能不能被私有化?
Q:当然不能。(首先编译就会报错)。—深层原因:他们两者存在的目的就是为了让子类去重写,如果私有化了,就没意义了。

12.静态成员能不能被标记为virtual、override 或 abstract?
Q:

  • 15
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值