.Net面试题

1、什么情况下会用到dispose关键字?

  dispose用于显示的回收托管和非托管资源。

  托管资源指那些资源的回收工作由.net内存管理机制(CLR)的GC(Garbage Collection) 机制自动完成,无需显式释放的资源。比如int,string,float,DateTime对象,.net中超过80%的资源都是托管资源。

  非托管资源指诸如包装操作系统资源的一类对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器(GC)可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。

  int,string,float,DateTime等值类型,即基本数据类型都存放在栈,数组,用户定义的类、接口、委托,object,字符串等引用数据类型都存放在堆。

  释放非托管资源主要有2种方式,Dispose(隐式操作),Finalize(显式操作)。Finalize一般情况下用于基类不带close方法或者不带Dispose显式方法的类,也就是说,在Finalize过程中我们需要隐式的去实现非托管资源的释放,然后系统会在Finalize过程完成后,自己的去释放托管资源。在.NET中应该尽可能的少用析构函数释放资源,MSDN2上有这样一段话:实现 Finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收。所以有析构函数的对象,需要两次,第一次调用析构函数,第二次删除对象。而且在析构函数中包含大量的释放资源代码,会降低垃圾回收器的工作效率,影响性能。所以对于包含非托管资源的对象,最好及时的调用Dispose()方法来回收资源,而不是依赖垃圾回收器。

  析构函数用于释放被占用的系统资源,析构函数的名字由符号“~”加类名组成。不要在一个类中有定义任何Finalize方法的念头,因为那样会对你的“析构器链”造成潜在的严重的伤害。

  
2、能不能解释一下C#的垃圾回收机制?

  GC是CLR的一个组件,它控制内存的分配与释放。当系统内存资源匮乏时,GC会被激发,自动去释放那些没有被使用的托管资源。堆和栈是程序运行中在内存中存放数据的区域。栈后进先出。

  Microsoft为非托管资源的回收专门定义了一个接口:IDisposable,接口中只包含一个Dispose()方法。任何包含非托管资源的类,都应该继承此接口。

  
3、为什么不用JWT框架而要自己重写?Effort有做过评估吗?有多少差别?

  JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案,特别适用于分布式站点的单点登录。

  跨域身份验证步骤:

  1.用户向服务器发送用户名和密码。

  2.验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中。

  3.服务器向用户返回session_id,session信息都会写入到用户的Cookie。

  4.用户的每个后续请求都将通过在Cookie中取出session_id传给服务器。

  5.服务器收到session_id并对比之前保存的数据,确认用户的身份。

  这种模式最大的问题是,没有分布式架构,无法支持横向扩展。如果使用一个服务器,该模式完全没有问题。但是,如果它是服务器群集或面向服务的跨域体系结构的话,则需要一个统一的session数据库库来保存会话数据实现共享,这样负载均衡下的每个服务器才可以正确的验证用户身份。

  JWT的原则:

  JWT的原则是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户,当用户与服务器通信时,客户在请求中发回JSON对象。服务器仅依赖于这个JSON对象来标识用户。为了防止用户篡改数据,服务器将在生成对象时添加签名。服务器不保存任何会话数据,即服务器变为无状态,使其更容易扩展。即(appid +secret )获取到(access_token+expire_date),此后客户端将在与服务器交互中都会带access_token获取数据。为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。

  WT是由三段信息构成:第一部分我们称它为头部(header),第二部分我们称其为载荷(payload),第三部分是签证(signature)。将header进行base64加密(该加密是可以对称解密的),构成了第一部分;对payload进行base64加密,得到Jwt的第二部分;base64加密后的header和base64加密后的payload,通过header中声明的加密方式和服务端的私钥进行组合加密,构成jwt的第三部分;将三部分用.连接成一个完整的字符串构成最终的jwt。

4、Http和Https的差异?Http是怎么握手的?Https为什么安全?为什么要用Https;

  HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
  HTTPS和HTTP的区别主要如下:
  1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
  2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

  参考

  HTTPS的优点

  (1)使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

  (2)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

  (3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

HTTPS的缺点

  虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:

  (1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;

  (2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;

  (3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。

  (4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。

  (5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

  三次握手参考

  

 

 
  第一次握手: 建立连接,客户端A发送SYN=1、随机产生Seq=client_isn的数据包到服务器B,等待服务器确认。

  第二次握手: 服务器B收到请求后确认联机(可以接受数据),发起第二次握手请求,ACK=(A的Seq+1)、SYN=1,随机产生Seq=client_isn的数据包到A。

  第三次握手: A收到后检查ACK是否正确,若正确,A会在发送确认包ACK=服务器B的Seq+1、ACK=1,服务器B收到后确认Seq值与ACK值,若正确,则建立连接。

第一次握手: 建立连接,客户端A发送SYN=1、随机产生Seq=client_isn的数据包到服务器B,等待服务器确认。

第二次握手: 服务器B收到请求后确认联机(可以接受数据),发起第二次握手请求,ACK=(A的Seq+1)、SYN=1,随机产生Seq=client_isn的数据包到A。

第三次握手: A收到后检查ACK是否正确,若正确,A会在发送确认包ACK=服务器B的Seq+1、ACK=1,服务器B收到后确认Seq值与ACK值,若正确,则建立连接。

TCP标示
  1. SYN(synchronous建立联机)
  2. ACK(acknowledgement 确认)
  3. Sequence number(顺序号码)

作者:五月君
链接:https://www.imooc.com/article/71293
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作

第一次握手: 建立连接,客户端A发送SYN=1、随机产生Seq=client_isn的数据包到服务器B,等待服务器确认。

第二次握手: 服务器B收到请求后确认联机(可以接受数据),发起第二次握手请求,ACK=(A的Seq+1)、SYN=1,随机产生Seq=client_isn的数据包到A。

第三次握手: A收到后检查ACK是否正确,若正确,A会在发送确认包ACK=服务器B的Seq+1、ACK=1,服务器B收到后确认Seq值与ACK值,若正确,则建立连接。

TCP标示
  1. SYN(synchronous建立联机)
  2. ACK(acknowledgement 确认)
  3. Sequence number(顺序号码)

作者:五月君
链接:https://www.imooc.com/article/71293
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作


5、C#异步接口怎么设计;

  设计API带回调参数,异步任务完成后的回调通知地址。


6、介绍一下需要同时获得多把锁的现象,应该怎么设计;
7、是否了解Solid设计模式?最熟悉的设计模式有哪些?为什么要用这种模式?
8、写一段您觉得最自豪的代码;必问,关于多线程,高并发,安全,压力测试,自动化测试
9、为什么使用REST API,不用SOAP?
10、Ditionary.add()方法的算法的时间复杂度
11、如何保证数据完整性、一致性
12、线程死锁什么意思?如何处理死锁
13、什么是多态,为什么要用多态

  多态 同一种行为,对于不同的事物,有不同的表现形式;多态的表现形式:将父类类型作为方法的参数或将父类类型作为返回值。


14、什么是依赖注入,为什么要用依赖注入
15、C#代码要怎么优化,曾经优化过代码吗?

1/2/4/5/6/7/8/10/11/12/13/14/15

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值