文章内的面试题涉及以下相关内容:
1.开发语言:CShape
2.数据库:SQL Server、Redis
(注:此文章内的面试题及答案均为个人整理,如有什么不足之处请在评论区或者私信内多多指教或反馈~
更多相关面试题正在逐步整理中…)
基础理论知识题
0.什么是面向对象开发?面向对象的三大基本特征是什么?(重点!!)
通俗来讲就是像描述现实生活中的情况进行程序开发,针对某一件事务来设计相对应的功能。
例如我们要开发个售票系统,则会想到要设计用户登录,购票,票数统计等等一系列用户可能会需要的功能。从而让程序设计的更完善。
面向对象的三大基本特征:封装、继承、多态
1.什么是构造函数?
属于一种方法,用于在创建对象时初始化对象,给对象成员变量赋初始值。并且构造函数的命名也必须要与类名完全相同,构造函数也不能被直接调用,需要通过new运算符在创建对象时才会进行自动调用。
2.什么是类?什么是对象?
类:对象的模板,用于封装定义的成员变量和构造方法,属于引用类型。
对象:类当中的一个具体实例
3.简述方法定义的几种方式
定义方法:方法类型 返回类型 方法名(参数列表){ }
也可以使用virtual重写方法、abstract在抽象类中重写方法、override重写基类方法。
4.静态方法与非静态方法的区别
●静态的变量在类之间是共享的,非静态的是类的实例化对象独享的,
●静态方法可以通过类名.方法名的形式进行调用,不会产生内存开销,非静态的方法,需要实例化类的对象, 将方法保存到代码区中个,然后通过对象.方法名的方式进行调用。
●静态方法中调用非静态方法,需要先实例化非静态的方法对象,再通过对象.方法名的方式进行调用。
●非静态方法中可以直接调用静态方法与非静态方法。
5.类的组成部分有哪些?
成员变量、构造方法、引用的命名空间
6.成员变量与局部变量的区别
- 在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或方法声明上。 - 在内存中的位置不同
成员变量:在堆内存中
局部变量:在栈内存中 - 初始化值不同
成员变量:有默认值
局部变量:没有默认值,必须定义,赋值,然后才能使用 - 生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
7.什么是方法重载?
方法名相同,参数类型或参数个数不同
8.写出常用的访问修饰符,按由小到大排序。
- private:私有的,仅本类中可访问
- protected:受保护的,在类的继承过程中可访问
- internal:此程序集可访问
- public:共有的
9.列举所掌握的所有数据类型,按分类写
基本数据类型(值类型)
整数类型:byte、short、int、long
浮点类型:float、double、decimal
字符型:char
布尔类型:bool
引用类型
字符串:string
对象:object
10.什么是异常?异常的基本结构是什么?
程序运行时产生的错误称为异常。
try:对可能抛出异常的代码进行包裹
catch:用于指定要捕获的异常类型,从而进行相应处理
finally:无论是否抛出异常都会执行的代码块
11.String与StringBuffer的区别
string是基本类型,是不可改变对象,一旦被创建就不能修改它的值。对已经存在的string对象的修改都是重新创建一个新的对象,然后将新值保存进去。而StringBuffer是一个可变对象,当对它进行修改时不会像string那样重新建立对象。它只能通过构造函数来建立。对象被建立后,在内存中就会分配内存空间,并初始保存一个null,向StringBuffer中赋值的时候可以通过它的append()方法。字符串连接操作中StringBuffer的效率要比stirng高。
12.什么是封装性?好处是什么?
封装是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的好处:隐藏类的实现细节、只能通过规定方法访问数据、方便加入控制语句及修改实现。
13.什么是继承?继承的特点及关键字是什么?
继承是允许根据一个类来定义另一个类。当创建一个类时,可以不用重新编写新的数据成员及成员函数,只需要设计一个新的类,然后继承已有类的成员即可,已有的类称为基类,新的类则称为派生类。关键字是:符号。
14.继承的优点有哪些?如果父类与子类同样的方法,不同的功能怎么处理?
优点:简化了子类的定义及扩展了父类的定义。
可以使用方法重写或者方法重载进行处理。
15.什么是方法重写?好处是什么?
“重写”父类方法就是修改它的实现方式或者说在子类对它进行重新编写。
好处就是代码的重用性集扩充性更强。
16.什么是多态性?多态性的好处是什么?
同一操作作用于不同的对象,可以有不同的解释,产生不同的效果,这就是多态性。
多态具有可替换性、可扩充性、接口性、灵活性及简化性这些好处。
17.多态的实现条件有哪些?
要有继承、重写、父类引用指向子类对象三个条件。
18.什么是抽象方法?与普通方法的区别是什么?
只需要定义,而不需要实现的方法称为抽象方法。
区别:抽象方法没有方法体,没有方法具体实现、抽象方法只能在抽象类中声明、派生类必须重写抽象类中的抽象方法。
19.什么是抽象类?
包含抽象方法的类称为抽象类。
20.什么是接口?
接口是一种用来定义程序的协议,它描述可属于任何类型或结构的一组相关行为。接口可有方法、属性、事件和索引器或这四种成员的任何组合类型,但不能包含字段。
21.抽象类与接口的区别是什么?
● 接口可以多继承,抽象类不能实现多继承。
● 接口只能定义抽象规则,抽象类即能定义抽象规则也能提供已实现的成员。
● 接口是一组行为规范,抽象类时一个不完全的类,着重于族的概念。
● 接口支持回调,抽象类不能实现回调,因为继承不支持。
● 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法。
● 接口多定义对象的行为,抽象类多定义对象的属性。
● 接口可以作用于值类型和引用类型,抽象类只能作用于引用类型。
22.简述一下什么情况下使用抽象类?什么情况下使用接口?
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。
而抽象类在代码实现方面发挥作用,可以实现代码的重用。
23.ADO.NET的五个主要对象
connection、command、reader、adapter、dataset
24.三层架构有哪几层?每层作用是什么?
视图层(ui):负责显示和采取用户操作,不包含任何业务相关的逻辑处理。
业务逻辑层(BLL):通过获取Ui传来的用户指令,执行业务逻辑,在需要访问数据时,直接交给DAL进行处理,然后返回数据给Ui层。
数据访问层(DAL):只提供基本的数据访问,不包含任何的业务逻辑。
25.什么是装箱(boxing)和拆箱(unboxing)?
装箱:将值类型转换成引用类型(Object)
拆箱:将引用类型转换成值类型
26.String s = new String(“xyz”); 创建了几个String Object?
两个;一个可以被引用的“s”对象,一个括号里面的值。
27.值类型和引用类型的区别?
值类型存储在栈内存,长度都是固定的;引用类型存储在堆内存,可以动态扩展长度。
28.是否可以继承String类?
不可以继承。因为String类有final修饰符,使用final修饰的类时不允许被继承的。
29.try()里有一个return语句,那么紧跟在这个try后的finally()里的code会不会被执行?在什么时候被执行?
会执行;在return语句之前被执行。
30.new关键字的用法有哪些?
new运算符:用于创建对象和调用构造函数。
new修饰符:在用作修饰符时候,new关键字可以显式隐藏从基类继承的成员。
new约束:用于在泛型声明中约束可能用作类型参数的参数类型。
31.override与overload的区别?
override是重写方法,方法名,返回值以及参数相同,存在于父类和子类之间。
override是重载方法,参数类型、个数、顺序至少要有一个不相同,存在于父类及子类中。
32.在C#中,string str = null 与 string str = “” 的区别
null在内存中没有分配内存空间,“”则分配了空间。
为null的字符串没有被实例化,而为“”的字符串则已经被实例化。
33.请详述在dotnet中类(Class)与结构(struct)的异同?
Class可以被实例化,属于引用类型,分配在堆内存中,可以实现接口和单继承其他类。
struct属于值类型,分配在栈内存中,可以实现接口,不能作为基类型,而Class可以。
34.接口能否继承接口,抽象类能否继承接口,抽象类能否继承普通类?
接口可以继承接口、抽象类不能继承接口,但可以实现接口、抽象类可以继承普通类。
35.构造器Constructor是否可以被继承?是否可以被override?
构造器不能被继承,也不可以被重写(override)
36.进程和线程分别该怎么理解?
进程指运行中的应用程序,每个进程都有自己独立的内存空间,而线程是属于进程中的一个实体,没有独立的内存空间,寄生在进程当中。
37.DataReader与DataSet的区别?
DataReader在使用时会始终占用SQLConnection,任何对SQLConnection的操作都会引发DataReader的异常,且每次读取时只在内存中加载一条数据,占用的内存相对较小。
DataSet则会将数据一次性的加载到内存中,读取完毕后会放弃数据库连接,相对来说会比较消耗内存。但会比DataReader更灵活,可以动态的添加行、列数据,对数据库进行回传更新操作。
38.什么是虚函数?什么是抽象函数?
用virtual关键字修饰的成员函数称为虚函数,用于实现多态性。
没有执行代码,只定义了的函数称为抽象函数。
39.描述一下virtual、sealed、override和abstract的作用。
virtual:字面意思为虚拟,用于将类中成员定义成虚拟的,表示这些成员会在继承后重写其中的内容。
sealed:字面意思为密封的,用此修饰符修饰的类或方法不能被继承。
override:用于重写继承的父类当中的方法。
abstract:用于将类、方法、属性、事件和索引器定义为抽象的。
40.什么是成员变量?什么是局部变量?
成员变量是类中定义的变量、局部变量是在方法内定义的变量。
41.简述子类实例化的过程
- 产生对象并对成员默认初始化。
- 对构造方法中的形式参数赋值。
- 检查构造方法中是否有this语句。
- super调用或隐式调用父类的构造方法。
- 对当前类中的变量显式初始化。
- 执行当前构造方法中的代码。
42.this与base的区别
this关键字可以访问当前类中定义的字段、属性、和方法。
base关键字可以调用当前类继承的父类中的字段、属性和方法。
43.当一个线程进入对象的一个synchronized方法后,其他线程是否可以进入此对象的其他方法?
不可以,因为一个对象的一个synchronized方法只能由一个线程访问。
44.什么是事务?简述事务的编写流程
事务是指为单个逻辑单元执行的一系列操作。
执行步骤:
- 创建事务所使用的一些对象(SqlConnection、SQL语句、SqlCommand)。
- 实例化SqlTransaction类。
- 使用这个事务所使用的con连接。
- 使用BeginTransaction方法执行这个事务。
- 在try{ }块里执行SQLCommand命令。
- 如果执行成功则执行commit()提交,否则执行rollback()回滚操作。
45.事务的特性有哪些?
事务具备原子性、一致性、隔离性、持久性4大特性。
原子性(atomic):
事务中包含的各项操作必须全部执行或全部不执行。任何一项操作失败都会导致整个事务失败,其他已执行的任务所做的数据操作都会被撤销。只有所有的操作全部成功了,整个事务才算执行完成。
一致性(consistent):
保证了当事务结束后,系统状态是一致的。
隔离性(isolated):
使得并发执行的事务,彼此无法看到对方的中间状态。保证了并发事务的顺序执行,而不会导致系统状态不一致。
持久性(durable):
保证了事务完成后所作的改动都会被持久化。如果资源发生故障,可以通过日志将数据重建起来。
46.CTS、CLR、CLS分别是什么?
CTS:通用类型系统、CLR:公共语言运行时、CLS:公共语言规范
这三个是.NET Framework 3C 标准
47.什么是GC,GC的作用是什么?
GC是一种垃圾回收机制;用于回收堆内存中没有使用过的对象或变量,从而释放内存。
48.数据表中有user表,字段ID、name、创建时间,写出获取最新一条注册用户信息。
SELECT TOP * 1 FROM user
ORDER BY 创建时间 DESC
49.启动一个线程是run方法还是start方法?
启动一个线程是使用start()方法。
50.SQL函数与存储过程的区别是什么?
- Sql函数可以被select调用,而存储过程不可以
- 存储过程返回多样化,sql函数只能返回值或者表对象
- 他们都支持Procedure cache模式
51.什么是视图?视图的作用是什么?
视图是一组查询的封装,是属于虚拟表(Create View)
作用包括:
- 数据安全性(自定义对外的展示数据与字段)
- 方便程序端调用,提升网络传输效率
52.SQL主键与外键的区别是什么?
外键是参照关系表的主键,体现的是表之间的关系,主键是表中实体的唯一标识(表中外键可以重复,主键内容必须唯一)。
53.数据量访问过大的解决方案有哪些?
1.读写分离 (会造成数据延迟)
2.分表分库
3.按业务将数据库分割
54.Redis的使用场景有哪些?
1.缓存类数据
2.文字评论、点赞功能
55.Redis可存储的数据类型有哪些?
1.字符串 (String)
2.哈希 (Hash):散列
3.列表 (list)
4.集合 (set)
5.有序集合 (sorted sets)
代码题
1.分析下面代码
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
2.分析下面代码
string strTmp = "abcdefg某某某";
int i = System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j = strTmp.Length;
以上代码执行完成后,i = ( ),j = ( )
答:i = 13,j = 10
总结:i 是计算字节长度的,而 j 是计算字符串长度的,两个计算方法不同。
3.分析下面代码
private int Method()
{
static int num = 0;
num += 1;
return num;
}
问以上代码会出现什么样的错误?
会出现编写性错误;错误原因是:不能在方法内声明静态变量。
tip:这里面整理的题都是我之前练习过的题,可能在面试过程中提问到的概率比较大,特此放到这里供大家参考。
有的题目是我按照自己的理解答的,部分题目的答案是来自网络。
更多题目正在陆续整理,我会不定期的更新题目的。