不知何时起,有荡起了离职跳槽的念头。这一次算是有所实际行动了,而不仅仅是停留在知识储备、浏览招聘信息阶段。而是实实在在的准备了简历,投递并面试了。接下来就是一些面试的题目,表面面边整理。有些我觉得回答到点上了,但有许多我只能说是自己知道的却并没能够表述好。回头又整理了下,权当笔记记录了。希望下次再面到能回答到面试官想知道的点上了。
2021-12-01 某公司(医疗方向软件开发)
多线程(async/await)
asp.net core 依赖注入,几种注入方式的区别(AddSington,AddScope,AddDixxx)
DI:依赖注入,一种设计模式,在类和它的依赖之间实现控制反转(IoC)
2021-12-09 某公司(电商商城ERP)
- 多线程静态资源访问,线程安全
- 分库分表
- 队列的使用(Kafuka,RabbitMQ),作用:系统解耦,提高吞吐
- 缓存的使用
#2022.2.16–某公司(医疗解决方案、低代码工具)
js中的闭包
一个函数和对其周围状态的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包。简单说:闭包让你可以在一个内存函数中访问到其外层函数的作用域。每当创建一个函数,闭包就会在函数创建的同时被创建出来。
1 | function init(){ |
Web中的javascript代码都是基于事件的–定义某种行为,然后将其添加到用户出发的事件之上(如点击),通常我们的代码叫做回调:为响应事件而执行的函数。
1 | function makeSizer(size){ |
泛型、泛型约束
泛型
允许延迟编写雷达或方法中的编程元素的数据类型的规范,直到在程序中使用它的时候。即允许您编写一个可以与任何数据类型一起工作的类或方法。
特性:
- 有助于最大限度的重用代码、保护类型的安全以及提高性能
- 可以创建泛型集合类。(
System.Collections.Generic
命名空间中包含泛型集合类,可用来替换System.Collections
中的集合类) - 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
- 可以对泛型类进行约束以访问特定数据类型的方法
- 关于泛型数据类型中使用的类型信息可在运行时通过使用反射获取。
泛型约束
定义:public T GetInfo<T>(string id) where T: CBaseInfo
解释:[T GetInfo(string id)]
传入一个ID返回一个Class,[Where T:CBaseInfo]
约束这个Class的Type必须继承自CBaseInfo
六种泛型约束:
参数类型 | 说明 |
---|---|
T:结构 | 参数类型必须是值类型。可以指定除Nullable以外的任何值 |
T:类 | 类型参数必须是引用类型,包括任何类、接口、委托或数组类型 |
T:new() | 参数类型必须具有无参数的公共构造函数,与其他约束一起使用时必须在最后 |
T:<接口名称> | 类型参数必须是指定的基类或派生自指定的基类 |
T:<基类名称> | 类型参数必须是指定接口或实现指定接口 |
T:U | 为T提供的类型参数必须是为U提供的参数或派生自为U提供的参数,成为裸类型约束 |
- 接口约束:参数类型可以实现接口
public class GetInfo<T> where T:IComparable
- 基类约束:参数类型必须继承基类,该类型约束必须在参数的所有其他约束之前(多个参数,每个参数使用一个where子句来约束)
public class GetInfo<T, U> where T: calss , where U: struct
- 构造函数约束
1
2
3
4public class MyClass<T> where T: IComparable, new()
{
T item = new T();
} - 裸类型约束
用作约束的泛型类型参数。具有自己的类型参数的成员函数需要将该参数约束为包含类型的类型参数。1
2
3
4
5
6
7class List<T>
{
void Add<U>(List<U> items) where U : T
{
//todo
}
}委托
类似于C或C++中的函数指针。委托存有某个方法的引用的一直引用类型变量。引用可在运行时被改变。用于实现事件和回调方法,派生自System.Delegate
示例几种委托结构1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17//声明代理,该代理引用一类方法,此类方法必须返回int型,接收一个int型参数
delegate int NumberChanger(int n);
public int AddNum(int para)
{
return para + para;
}
public int MultipleNum(int para)
{
return para * para;
}
//实例化委托,并调用
NumberChanger nc1 = new NumberChanger(AddNum);
Console.WriteLine(nc1(5)); //输出10
NumberChanger nc2 = new NumberChanger(MultipleNum);
Console.WriteLine(nc2(5)); //输出25 - 自定义委托 delegate 返回类型 委托名([参数])
- Action内置委托 Action<[参数类型0-16个]> 委托名 = 被委托方法名
- Func内置委托 Function<[参数类型0-16个], 返回类型> 委托名 = 被委托方法名
- 多播委托 委托名 += 被委托方法名; 委托名 -= 被委托方法名;
WebForm有哪些事件
生命周期阶段
- 请求页面
- 开始: 设置页属性(Request、Response),确定请求时回发还是新的,设置IsPostBack属性
- 初始化页面:页面初始化期间可以使用页中的控件,并设置每个控件的UniqueID。如果是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为试图状态中的值。
- 加载页面:加载期间,当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。
- 验证:验证期间将调用所有验证程序控件的Validate方法,此方法将设置各个验证程序控件和页的IsValid属性。
- 回发事件处理:如果请求是会发请求,则将调用所有事件处理程序。
- 呈现页面:在页面呈现期间,视图状态将被保存到页面,然后页面将调用每个控件,以将其呈现的输出给页的Respnse属性的OutStream。
- 卸载页面:完全呈现页、将页发送给客户端并准备丢弃时,将调用卸载。此时将卸载页属性(如Response
Request)并执行清理。
生命周期事件
PreInit 该事件完成以下任务
- 检查IsPostBack属性来确定是否是第一次请求该页
- 创建或重新创建动态控件
- 动态设置主控页
- 动态设置Theme属性
- 读取或设置配置文件属性值
- 注意:若是回发请求,则控件的值尚未从视图状态还原。在此阶段设置的控件属性值将在下一事件中被重写。
Init 该事件完成以下任务
- 在所有控件都已初始化且已应用所有外观设置后引发。读取或初始化控件属性。
InitComplete
- 由Page对象引发,处理要求先完成所有初始化工作的任务
PreLoad
- 如果需要在Load事件之前对页或控件执行处理,在此事件处理。
- 在Page引发事件后,它会为自身和所有控件加载视图状态,然后会处理Request实例包括的任务回发数据。
Load
- 在Page上调用OnLoad事件,然后以递归方式对每个子控件执行相同操作。如此循环知道加载完本页和所有控件为止
- 使用OnLoad来设置控件中的属性并建立数据链接
控件事件
- 使用这些事件来处理特定控件事件,如Button的Click事件
- 注意:在回发请求中,如果页包含验证程序控件,在执行任何处理之前检查Page和各验证控件的IsValid属性
LoadComplete
- 对需要加载页上的所有其他控件的任务使用该事件
PreRender
- 该事件发生前,Page对象会针对每个控件和页EnsureChildControl
- 设置DataSourceID属性的每个数据绑定控件会调用DataBind方法
- 页上的每个控件都会发生PreRender事件
- 该事件对页和页上的控件进行最后内容更改
SaveStateComplete
- 该事件发生前,针对页和所有控件保存了ViewState,将忽略任何更改
Render (不是事件)
- 处理的这个阶段,Page对象会在每个控件调用此方法
- 如果创建自定义控件,需要重写此方法以输出控件的标记。
Unload
- 针对每个控件发生,继而正对页发生
- 使用该事件对特定控件执行最后清理,如关闭控件特定数据库链接
- 对页滋生,使用该事件执行最后清理工作。如打开的文件和数据库链接,完成日志记录或其他请求任务
- 注意,在此阶段调用Response.Write方法,则会引发异常
Session作用、存储位置、与Cookie区别
Session
服务器用于存储特定的用户会话所需的信息。作用时间从用户到达某个特定Web页开始,到该用户离开Web站点,或者执行销毁Session的代码。
客户端访问网站–> 客户端信息被服务器记录,服务器为客户端生成一个120bit的Session ID –> 客户端再次请求网站时携带这个Session ID,服务器端就能从Session Provider中反序列化出Session数据。
Asp.Net中几种Session模式 及其对应的Session Provider
- InProc In-Memory Object 数据存储于当前应用程序域
- StateServer Aspnet_state.exe 一个独立的Windows服务(Aspnet_state.exe)
- SqlServer SqlServer 存储在数据库,Farm模式适用,但序列化反序列化将是瓶颈
- Custom Custom Provider 继承基类SessionStateStoreProviderBase开发自定义Provider
存储
系统为每个访问者设立一个独立的Session对象,用以存储Session变量,并且各个访问者的Session对象互不干扰。
与cookie的区别
- Session存储在服务器,Cookie存储在客户端
- Cookie安全性差,可以通过分析客户端Cookie内容进行伪装
- Session会在一定时间内保存在服务,访问增多,比较占用服务器资源。考虑性能,应该多用Cookie
- 单个Cookie携带数据不超过4K,浏览器限制一个站点最多保存20个Cookie
EntityFramework有哪些不方便的地方
这个问题我不知道面试官想听到什么样的回答。我只说了EntityFramework的延迟加载有一定的性能问题,但这个问题是可以解决的,平时使用过程中并没有觉得不方便。
~~ ### K2哪些功能、smartobject有什么用~~
这个问题不知道为什么会被问的这么细,看样子这个工作流产品还是有被使用。关于K2的功能,我就提到了流程图、流程节点、线规则、审批动作。SmartObject没怎么用过,不过回忆起来,似乎将它当作可视化的ORM,通过拖拽方式获取流程数据了。
- 本文作者: 达文西
- 本文链接: https://edsiongithub.github.io/2022/02/16/27/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!