C#基本面试题
重写和重载
重写:
-
要求:(三大同)参数相同,方法名相同,返回值相同
-
关键字:基类函数用virtual修饰,派生类用override修饰
-
注意:不能重写非虚方法或静态方法
重载:
-
要求:在同一作用域,可以存在相同的函数名,不同参数列表的函数,这组函数称为重载函数
其他
WebAPI和MVC的区别
1、MVC主要用于建站,WebAPI主要用于构建http服务
2、接受参数不同:MVC可以返回JsonResult,前端可以直接使用;WebAPI要返回JSON数据,必须JSON.parse()转化为(Maticsoft.Json.dll)
3、MVC直接继承system.mvc.controller;WebAPI继承的是system.web.http.ApiController
OOP核心思想
核心思想:封装、继承、多态
private、 protected、 public、 internal 修饰符的访问权限
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 当前程序集内可以访问。
三层架构
表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)
目的:高内聚、低耦合
装箱和拆箱
装箱:从值类型接口转换到引用类型
拆箱:从引用类型转换到值类型
object obj=null; //引用类型
obj=1; //装箱 boxing 把值类型包装为引用类型
int i=(int)obj; //拆箱 unboxing
注意:装箱不需要显示的类型转换,拆箱需要显示的类型转换
引用类型
引用类型的基类为Object
引用类型:类、接口、委托、数组
CTS、CLS、CLR
CTS:common Type System 通用类型系统
CLS:Common Language Specification 通用语言规范
CLR:Common Language Runtime 公共语言进行时
在dotnet中类(class)和结构体(struct)的异同
Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的
Struct属于值类型,是分配在内存的栈上的,结构体是复制传递的。加分会答:Int32、Boolean等都属于结构体
堆和栈的区别
-
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在内存中
-
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小
什么是中间件
中间在这里是指注入到应用中处理请求和响应的组件
什么是Razor页面
是dot net core 中支持ASP网页表格的一种开发模型,@page作为页面起始的标志
CORE有哪些好的功能
1、是依赖注入
2、是日志系统架构
3、是引入了一个跨平台的网络服务器,kestrel。可以没有IIS,Apache和Nginx就可以单独运行
4、是可以使用命令行创建应用
5、是使用APP Settings Json File来配置工程
6、是使用Start up来注册服务
7、是支持web socket和Signal IR
8、是对于跨网站的请求的预防和保户极致
序列化和反序列化
序列化:把对象转化为特定格式的字符串
反序列化:把特定格式的字符串转换为对象
使用Swagger的好处
-
是一个规范和完整的框架
-
用于生成、描述、调用和可视化RESTful风格的Web服务
-
接口的文档在线自动生成
-
功能测试
使用EF的好处
-
是微软封装好一种ADO.NET数据实体模型
-
可以使用Linq语句
-
兼容性、集成性好
-
功能齐全
使用Redis的好处
-
性能极高——redis能支持超过100K+每秒的读写频率
-
丰富的数据类型——Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作
-
原子——Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行
-
丰富的特性——Redis还支持 publish/subscribe, 通知, key 过期等等特性
使用AutoFac的好处
-
与C#语言联系紧密
-
与ASP.NET MVC集成
应用服务器
42、List,Set, Map是否继承自Collection接口
答:List,Set是Map不是
43.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()?它们有何区别?
答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。
equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是
当两个分离的对象的内容和类型相配的话,返回真值。
44.数组有没有length()这个方法? String有没有length()这个方法?
答:数组没有length()这个方法,有length的属性。String有有length()这个方
法。
48.如何处理几十万条并发数据?
答:用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来获取.
50.进程和线程的区别?
答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。
51.堆和栈的区别?
答: 栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
值类型
堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。 引用类型
56.向服务器发送请求有几种方式?
答:get,post。get一般为链接方式,post一般为按钮方式。
软件开发过程一般有几个阶段?每个阶段的作用?
答:需求分析,架构设计,代码编写,QA(测试),部署
61.什么叫做SQL注入,如何防止?请举例说明。
答:利用sql关键字对网站进行攻击。过滤关键字等 参数化查询
62.什么是反射?
答:动态获取程序集信息
70.ADO.net中常用的对象有哪些?分别描述一下。
答:Connection 数据库连接对象
Command 数据库命令
DataReader 数据读取器
DataSet 数据集
71.什么是code-Behind技术。
答:ASPX,RESX和CS三个后缀的文件,这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理.
80.委托声明的关键字是__?
答:delegate.
81.用sealed修饰的类有什么特点?
答:密封,不能继承。
82.在Asp.net中所有的自定义用户控件都必须继承自____?
答:Control。
83.在.Net中所有可序列化的类都被标记为_?
答:serializable
93.62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动?
答案:62移动成2的6次方
100.C#可否对内存进行直接的操作?
答:在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员不过在C#中。
简述using关键字几种用法
1、using 指令
命名空间名字
eg: using System;
2、using 别名
使用场景:当两个cs文件都包含同一个名字的时候使用,不需要使用详细命名空间来区分相同的名字,直接使用别名更方便。
3、using语句
定义一个范围,在范围结束时释放对象。
using(SqlConnection conn = new SqlConnection(conStr)) { conn.Open(); }
在using内打开数据库连接,当超出using范围后,自动关闭连接,释放资源。
String和StringBuilder的区别是什么
string创建后分配在字符串常量区,栈中存储的地址指向存储字符串的地址(虽然没存储在堆,但string也是引用类型,这点比较特殊)。大小不可修改,每次使用string类中的方法时,都要再创建一个新的字符串对象,并给其分配内存。 这样就需要再分配新的空间。所以有可能产生很大的开销。
StringBuilder创建后分配在堆区,大小可自由修改。
多服务器如何生成全局唯一ID
1、使用数据库自增Id
JavaScript中有没有类的概念
js当然有类的概念,而且它和java一样,被设计成纯粹的
一、定义类
那我们如何在js中自定义一个类呢?其实应该换个说法,我们该怎么获取一个某种自定义类型的对象。
// 自定义类Class function Class(){ } // 实例化Class var clazz = new Class();
Web API 是一个简单的HTTP服务的框架,可以轻松的构建多种客户端的服务接口
当i>10时会死锁吗?简要说理由
public void Test(int i) { lock (this) { if (i > 0) { i--; } Test(i); } }
用于获取类型