2021年⾮常全的.NETCore⾯试题(⼆)
⼀.垃圾回收机制
1. 简述⼀下⼀个引⽤对象的⽣命周期?
(创建>使⽤>释放)
new创建对象并分配内存
对象初始化
对象操作、使⽤
资源清理(⾮托管资源)
GC垃圾回收
2. 创建下⾯对象实例,需要申请多少内存空间?
public class User
{
public int Age { get; set; }
public string Name { get; set; }
public string _Name = "123" + "abc";
public List<string> _Names;
}
40字节内存空间。
3. 什么是垃圾?
⼀个变量如果在其⽣存期内的某⼀时刻已经不再被引⽤,那么,这个对象就有可能成为垃圾。
4. GC是什么,简述⼀下GC的⼯作⽅式?
在公共语⾔运⾏时 (CLR) 中,垃圾回收器 (GC) ⽤作⾃动内存管理器。垃圾回收器管理应⽤程序的内存分配和释放。
播放器代码大全免费她的基本⼯作原理就是遍历托管堆中的对象,标记哪些被使⽤对象(哪些没⼈使⽤的就是所谓的垃圾),然后把可达对象转移到⼀个连续的地址空间(也叫压缩),其余的所有没⽤的对象内存被回收掉。
5. GC进⾏垃圾回收时的主要流程是?
张韶涵under the sea
(1)标记,到并创建所有活动对象的列表。
(2)重定位,⽤于更新对将要压缩的对象的引⽤。
(3)压缩,⽤于回收由死对象占⽤的空间,并压缩幸存的对象。压缩阶段将垃圾回收中幸存下来的对象移⾄段中时间较早的⼀端。
6. GC在哪些情况下回进⾏回收⼯作?
(1)系统具有低的物理内存。这是通过 OS 的内存不⾜通知或主机指⽰的内存不⾜检测出来。
(2)由托管堆上已分配的对象使⽤的内存超出了可接受的阈值。随着进程的运⾏,此阈值会不断地进⾏调整。
(3)调⽤ GC.Collect ⽅法。⼏乎在所有情况下,你都不必调⽤此⽅法,因为垃圾回收器会持续运⾏。此⽅法主要⽤于特殊情况和测试。
7. using() 语法是如何确保对象资源被释放的?如果内部出现异常依然会释放资源吗?
using() 只是⼀种语法形式,其本质还是try…finally的结构,可以保证Dispose始终会被执⾏。
8. 解释⼀下C#⾥的析构函数?为什么有些编程建议⾥不推荐使⽤析构函数呢?
C#⾥的析构函数其实就是终结器Finalize,因为长得像C++⾥的析构函数⽽已。
有些编程建议⾥不推荐使⽤析构函数要原因在于:第⼀是Finalize本⾝性能并不好;其次很多⼈搞不清楚Finalize的原理,可能会滥⽤,导致内存泄露,因此就⼲脆别⽤了
9. Finalize() 和 Dispose() 之间的区别?
Finalize() 和 Dispose()都是.NET中提供释放⾮托管资源的⽅式,他们的主要区别在于执⾏者和执⾏时间不同:
finalize由垃圾回收器调⽤;dispose由对象调⽤。
finalize⽆需担⼼因为没有调⽤finalize⽽使⾮托管资源得不到释放,⽽dispose必须⼿动调⽤。
finalize不能保证⽴即释放⾮托管资源,Finalizer被执⾏的时间是在对象不再被引⽤后的某个不确定的时间;⽽dispose⼀调⽤便释放⾮托管资源。
只有class类型才能重写finalize,⽽结构不能;类和结构都能实现IDispose。
另外⼀个重点区别就是终结器会导致对象复活⼀次,也就说会被GC回收两次才最终完成回收⼯作,这也是有些⼈不建议开发⼈员使⽤终结器的主要原因。
10. Dispose和Finalize⽅法在何时被调⽤?
Dispose⼀调⽤便释放⾮托管资源;
Finalize不能保证⽴即释放⾮托管资源,Finalizer被执⾏的时间是在对象不再被引⽤后的某个不确定的时间;
11. .NET中的托管堆中是否可能出现内存泄露的现象?
是的,可能会。⽐如:
不正确的使⽤静态字段,导致⼤量数据⽆法被GC释放;
没有正确执⾏Dispose(),⾮托管资源没有得到释放;
不正确的使⽤终结器Finalize(),导致⽆法正常释放资源;
其他不正确的引⽤,导致⼤量托管对象⽆法被GC释放;
12. 在托管堆上创建新对象有哪⼏种常见⽅式?
new⼀个对象;
字符串赋值,如string s1=”abc”;
值类型装箱;
⼆,什么是多态?
通过继承实现的不同对象,调⽤相同的⽅法,产⽣不同的执⾏结果.
C#⽀持两种类型的多态,编译时的多态和运⾏时的多态。
(1)编译时的多态:
编译时的多态是通过重载来实现的,对于⾮虚的成员来说,系统在编译时,根据传递的参数类型,个数以及返回类型的不同决定实现不同的操作.重载:
public int Sum(int x,int y)
public int Sum(int x,int y,int z)
public double Sum (Double x,Double y)
重载特点:
⽅法名称必须相同
参数列表必须不同
返回值类型可以不同
(2)运⾏时的多态:
运⾏时的多态是指系统直到运⾏时,才根据实际情况实现何种操作.
运⾏时的多态可以通过virtual-override(虚成员覆盖实现)以及abstract-override(抽象⽅法覆盖实现)两种⽅式来实现.
通过override实现覆写注意的⼏点
只有虚⽅法和抽象⽅法才能被覆写
⼦类和基类中的⽅法必须具有相同的⽅法名称,参数个数,参数类型以及返回值类型.
总结:
编译时的多态使运⾏速度更快,就像const编译时解析.
运⾏时的多态带来了⾼度灵活以及抽象的特点.
三、锁,除了lock还有哪些锁?
基元线程同步构造分为:基元⽤户模式构造和基元内核模式构造,两种同步构造⽅式各有优缺点,⽽混合构造(如lock)就是综合两种构造模式的优点。
1、⽤户模式构造
(1) System.Threading.Interlocked:易失构造,它在包含⼀个简单数据类型的变量上执⾏原⼦性的读或写操作。
(2)Thread.VolatileRead 和 Thread.VolatileWrite:互锁构造,它在包含⼀个简单数据类型的变量上执⾏原⼦性的读和写操作。
2、内核模式构造的主要有两种⽅式,以及基于这两种⽅式的常见的锁:
基于事件:如AutoResetEvent、ManualResetEvent
基于信号量:如Semaphore
Mutex
3、混合线程同步
SemaphoreSlim、ManualResetEventSlim、Monitor、ReadWriteLockSlim
--------------------------------------EF相关 ------------------------------------
四、使⽤EF update 怎么保证在并发时数据正确?
sqlserver2008怎么安装到d盘
五、EF如何处理并发?
什么叫并发:当多个⽤户同时更新同⼀数据的时候,由于更新可能导致数据的不⼀致性,使得程序的业务数据发⽣错误,这种情况可以称之为并发。
并发⼜分为两种:乐观并发与悲观并发
乐观并发:即系统允许多个⽤户同时修改同⼀条记录,系统会预先定义由数据并发所引起的并发异常处理模式,去处理修改后可能发⽣的冲突
当出现乐观并发时应该怎么处理呢,通常有如下三种处理⽅法
a 保留最后⼀次对象修改的值
b 保留最初的修改值
c  合并修改值
悲观并发:在同⼀时刻只允许⼀个⽤户修改相同数据,直接⽤Lock 与 unLock就可以处理.
六、事务的四⼤特性:
1 、原⼦性 (atomicity):强调事务的不可分割.
事务是数据库的逻辑⼯作单位,事务中包含的各操作要么都做,要么都不做
2 、⼀致性(consistency):事务的执⾏的前后数据的完整性保持⼀致.
事务执⾏的结果必须是使数据库从⼀个⼀致性状态变到另⼀个⼀致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于⼀致性状态。如果数据库系统运⾏中发⽣故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有⼀部分已写⼊物理数据库,这时数据库就处于⼀种不正确的状态,或者说是不⼀致的状态。
3 、隔离性(isolation):⼀个事务执⾏的过程中,不应该受到其他事务的⼲扰
⼀个事务的执⾏不能其它事务⼲扰。即⼀个事务内部的操作及使⽤的数据对其它并发事务是隔离的,并发执⾏的各个事务之间不能互相⼲扰。
4 、持续性(durability) :事务⼀旦结束,数据就持久到数据库
也称永久性,指⼀个事务⼀旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执⾏结果有任何影响。
七、那么在没有对事务进⾏隔离时会发⽣哪些危害了?
脏读:当⼀个事务读取数据修改后以经SaveChange但事务还没有提交,此时另外⼀个事务就读取了该数据,此时的数据就是脏数据,这⼀过程就是脏读
不可重复读:是指在⼀个事务内,多次读同⼀数据。在这个事务还没有结束时,另外⼀个事务也访问该同⼀数据。那么,在第⼀个事务中的两次读数据之间,由于第⼆个事务的修改,那么第⼀个事务两次读到的的数据可能是不⼀样的。这样就发⽣了在⼀个事务内两次读到的数据是不⼀样的这⼀过程就是不可重复读
幻读:⼀个事务针对⼀张表的所有数据进⾏读取修改,⽽此时另⼀个事务向表中插⼊了⼀条数据,则第⼀个事务数据不包含新数据,像出现
幻觉⼀样,这⼀过程就是幻读。
避免不可重复读需要锁⾏。
避免幻影读则需要锁表。
⼋、EF四种隔离级别
01:Read uncommitted(读未提交):最低级别,任何情况都会发⽣。
02:Read Committed(读已提交):可避免脏读的发⽣。
03:Repeatable read(可重复读):可避免脏读、不可重复读的发⽣。
04:Serializable(串⾏化):避免脏读、不可重复读,幻读的发⽣。
四种隔离级别:Seralizable 级别最⾼,最低的是 Read uncommitted 级别,级别越⾼,执⾏效率就越低,隔离级别的设置只对当前链接有效,对.NET 操作数据库来说,⼀个 Connection 对象相当于⼀个链接。
01:MySQL 数据库的默认隔离级别是Repeatable read 级别。
02:Oracle数据库中,只⽀持 Seralizable 和 Read committed级别,默认的是 Read committed 级别。
03:SQL Server 数据库中,默认的是Read committed 级别。
九、efcore事务的⼏种⽅法?
1、默认事务(SaveChanges)
(1).默认情况下,如果数据库提供程序⽀持事务,单个 SaveChanges() 调⽤中的所有变更都会在⼀个事务中被提交。如果其中任何⼀个变更失败了,那么事务就会回滚,没有任何变更会被应⽤到数据库。这意味着 SaveChanges() 能够确保要么成功保存,要么在发⽣错误时不对数据库做任何修改。
二叉树遍历就是访问二叉树中所有的节点
(2).关闭默认事务:context.Database.AutoTransactionsEnabled = false;
2. DbContextTransaction
(1). 使⽤⽅式mysql面试题sql优化
  BeginTransaction开启事务、Commit提交事务、Rollback回滚事务、Dispose销毁,如果⽤Using包裹的话,不再需要⼿动Rollback,⾛完Using会⾃动回滚。如果不⽤Using包裹事务,就需要在Catch中⼿动RollBack回滚,并且最好最后⼿动的Dispose⼀下。(如SameDbContext⽂件夹中的Test1和Test2⽅法)
(2). 使⽤场景
表格制作excel教程vlookup A. 同⼀个上下⽂多个SaveChanges的⽅法(如:⾃增主键后续要⽤到)、SaveChanges和EF调⽤SQL语句混⽤
3. 环境事务 TransactionScope
(1)使⽤⽅式
  new TransactionScope创建事务、Complete提交事务、 Transaction.Current.Rollback();回滚事务、Dispose销毁对象。如果⽤Using包裹的话,不再需要⼿动Rollback,⾛完Using会⾃动回滚。如果不⽤Using包裹事务,就需要在Catch中⼿动RollBack回滚,并且最好最后⼿动的Dispose⼀下。TransactionScope有三个属性:IsolationLevel(隔离等级),Timeout(超时),TransactionScopeOption(选项)
(2)⽤途
A. 同⼀个上下⽂的事务。(多个SaveChanges(⾃增主键后续⽤到的情况)、SaveChanges和EF调⽤SQL语句混⽤)(如Test1⽅法)
B. 多种数据库技术访问同⼀个数据库的事务(如Test2⽅法)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。