c# 实习面试题

# 数据库

1,什么是事务?什么是锁

事务指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为整体一起向系统提交或撤销请求操作,即这组命令要么全部执行,要么都不执行

事务的属性 (ACID)

A 原子性  一个事务是一个不可分割的工作单元,事务包含的操作要么都做要么不做

C 一致性  一个事务执行之前和执行之后数据库都必须处于一致性状态

I 隔离性  一个事务的执行不能被其他事务干扰()

D 持久性 一个事务一旦提交,它对数据库中数据的改变是永久性的

``` sql
BEGIN  TRANSACTION   tran1   --事务开始
SAVE  TRANSACTION    tran1   --保存事务
SELECT  * from  DncUser    --数据操作
COMMIT TRANSACTION  tran1  --提交事务
IF(@@ERROR<>0)             --错误个数
BEGIN
RAISERROR ('查询错误',16,1) --自定义错误输出
ROLLBACK  TRANSACTION  tran1  --事务回滚
END
IF(@@TRANCOUNT>0)   --判断事务是否大于0
BEGIN
ROLLBACK  TRANSACTION  tran1  --事务回滚
END
GO
```

2,什么是锁

1. 锁是在多用户环境中对数据的访问进行限制

2. 锁分为两类 (悲观锁和乐观锁)
   * 悲观锁 它对数据被外界修改持保守态度,认为数据随时会修改,所以整个数据处理需要加锁
   * 悲观锁按性质分为三种
   * 1. 共享锁(S锁)(读锁)事务A对对象T加S锁,其他事务也只能对T加S锁,多个事务可以同时读,但不能有写操作,直到A释放S锁
     2. 排它锁(X锁)(写锁) 事务A对对象T加X锁以后,其他事务不能对T加任何锁,只有事务A可以读写对象T直到A释放X锁 (X锁和U锁不能加在同一子资源上)
     3. 更新锁 (U锁)  (防止死锁) 用预定要对此对象施加X锁,它允许其他事务读,但不允许再施加U锁和X锁,当被读取的页将要被更新时,则升级为X锁,U锁一直到事务结束才能被释放 (乐观锁和更新锁是可以加在同一子资源下)
   * 悲观锁按作用范围分为2种
   * 1. 行锁 锁的作用范围是行级别的,数据库能够确定那些行需要锁的情况下加行锁。
     2. 表锁 锁的作用范围是整张表
   * 乐观锁 每次自己操作数据的时候认为没有人会来修改它,所以不去加锁,但是在更新的时候会去判断在此期间数据有没有被修改,需要用户自己去实现
   * 乐观锁实现方式:
   * 1. 对记录加版本号.
   * 2. 对记录加时间戳.
   * 3. 对将要更新的数据进行提前读取、事后对比。
   
3. 什么是索引  索引就是如同书的目录

   * 有无索引的最大区别就是查询的方式不一样 (无索引是线性查找,有索引的查找是二叉树查找)
   * 作用:提交查询速度,确保数据的唯一性,使用分组和排序自居进行数据检索时,可以减少分组和排序的进行搜索优化
   * 主键索引,唯一索引,常规索引,全文索引

4. 什么是视图

   * 视图是一种虚拟表,虚拟表具有和物理表相同的功能,可以对虚拟表进行增改查操作
   * 视图通常是一个或多个表的行或列的子集
   * 查询语句不能包含order by ,compute 或者compute关键字,也不能包含into关键字

5. 什么是游标

6. 数据库隔离级别

   * Read Uncommitted () 读取未提交内容 =》引发脏读
       可以看到其他未提交事务的执行结果
   * Read Committed(读取提交内容)   =》不可重复读
     一个事务只能看见已经提交事务所做的改变
   * Repeatable Read(可重读)  =》幻读
     确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
   * Serializable(可串行化)  =》超时和锁竞争
     它是在每个读的数据行上加上共享锁。


# C# 

1. 值类型和引用类型

   * 值类型 struct,enum,int,float,char,bool,decimal

   * 引用类型  class,delegate,interface,array,object,string=>(字符串是引用类型)

   *  值类型和引用类型的区别
     1. 值类型的数据存储在内存的栈中,引用类型的数据保存在内存的堆中,而内存单元中只存放堆中的对象地址;
     2. 值类型存取速度要快,引用类型存储数据要慢
     3. 值类型表示实际数据,引用类型表示只想存储在内存堆中的数据的指针或引用
     4. 栈的内存分配是自动释放,堆在.net中会有GC来释放
     5. 值类型变量直接存放实际的数据,而引用类型的变量把实际的地址保存在堆栈中,实际数据则保存到堆中

2. get 和post的区别

* 从http协议下来说post和get是没什么区别的

* 从html协议下来说
* 1. get  (获取数据)post (提交数据)
  2. get 提交时,参数会显示在网址后面以&连接  post会直接以表单的形式提交,数据保存在body中
  3. get对长度有限制,post没有限制
  4. post要比get安全

3. Ado.Net的五大对象

* 1. Command对象     (执行语句)

  2. Connection对象   (连接对象)

  3. DataReader对象 (读取数据库)

  4. DataSet对象  (数据集)

  5. DataAdapter对象  (填充)

4. C#中的委托是什么?,事件是不是一种委托
   * 委托就是一个类,也可以实例化通过委托的构造函数来把方法赋值给委托实列
   * 委托就是把方法当成参数给另外一个方法调用
   * 触发委托有两种方法,委托实例.Invoke(参数列表),委托实例(参数列表)
   * 事件是一种特殊的委托
   * 委托可以+= ,-=
   
5. 重载和重写的区别(实现多态的方式

   * 重写是对基类的方法进行重写(Override)  (运行时的多态性)

   * 重载是方法名称相同,参数个数或者参数类型不同(Overload)(编译时的多态性)

6. 面向对象的思想包括什么?

   * 继承,封装,多态

7. 接口和抽象类的异同
   * 接口强调你必须实现,接口中的方法不能使用public关键字
   * 抽象类不能实例化,接口也不能实例化
   * 接口不能包含定义字段,属性,常量,构造函数,析构函数,静态方法
   * 在抽象类中,子类必须实现父类定义的抽象方法
   * 抽象类可以有构造方法,接口不能有
   * 一个类可以实现多个接口,但只能继承一个抽象类
   * 接口可以多实现,只能单继承

8. Orm的原理

   * 利用反射,配置将对象和数据库表进行映射

9. 结构和类的异同
   * 结构不能从类和其他结构继承
   * 结构是值类型,类是引用类型
   * 结构不能声明默认构造函数(没有参数的构造函数)或析构函数
   * 结构的实例化可以不使用new 运算符,

10. 接口和类的异同

    异:不能直接实例化接口,

    接口不包含方法的实现

    接口,类,结构可以从多个接口继承

    同:接口、类和结构可从多个接口继承。

    接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。

    接口可以包含事件、索引器、方法和属性。

11. B/S传值的方式

    session,cookie,application,cache,Querystring,this.server.Transfer

12. 线程和进程的区别

    * 一个程序至少有一个进程,一个进程至少一个线程

    * 进程系统进行资源分配和调度的一个独立单位 (一块包含了某些资源的内存区域)

    * 线程是Cpu调度和分派的基本单位,(进程中所包含的一个或多个执行单元)

13. base的用法

    * base用户从派生类访问**基类的成员(方法)等**
    * 在已被另一个方法重写的基类上调用方法
    * 指定在派生类的实例时应调用哪个基类构造函数
    * 基类访问只能在**构造函数,实例方法,或实例属性访问器**
    * base不能在静态方法上使用 

14. virtual的用法(虚拟的)

    * 用于修改方法,属性,索引器,或事件声明,并允许在派生类中重写它, 
      基类使用virtual虚方法 ,派生类重写必须使用override关键字
    * **任何继承此方法的类都可以重写此方法** 

15. 锁语句(lock)

    * 获取给定对象的互斥锁执行语句块,然后释放该锁
    * 持有锁时,持有锁的线程,可以再次获取并释放,任何其他线程被阻止获取锁并等待直到释放
    * 避免使用以下内容作为锁定对象
      1.  避免对不同的共享资源使用相同的锁对象实例,因为它可能会导致死锁或锁争用
      2.  this,因为它可能被调用方用作锁
      3.  键入实例,因为这些实例可能由类型运算或反射获取
      4.  字符串实例,包括字符串文本,因为这些实例可能被暂留
      5.  不能在锁的正文使用await  关键字
    
16. 过滤器

    * MVC过滤器主要包含四种类型  Authorization(授权)Action(行为)Result(结果)Exception(异常)

    * | 过滤器类型 | 接口 | 描述     |
      | :-------:| ---- | ------  |
      | Authorization(授权) | IAuthorizationFilter | 此类型(或过滤器)用于限制控制器或者控制器的某个行为 |
      | Exception | IExceptionFilter | 用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常 |
      | Action | IActionFilter | 用于进入方法前的或者之后的处理 |
      | Result | IResultFilter | 用于返回结果之前或之后的处理 |
      
    * 默认实现的过滤器只有三种 Authorize(授权)ActionFilter(),HandleError
    
    * | 过滤器       | 类名                  | 实现接口                     | 描述                                                         |
      | ------------ | --------------------- | ---------------------------- | ------------------------------------------------------------ |
      | ActionFilter | AuthorizeAttribute    | IAuthorizationFilter         | 此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法   |
      | HandleError  | HandleErrorAttribute  | IExceptionFilter             | 用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常 |
      | 自定义       | ActionFilterAttribute | IActionFilter和IResultFilter | 用于进入行为之前或之后的处理或返回结果的之前或之后的处理     |
      
    * 过滤器的四种方法
      
      | **OnActionExecuting** | 在行为方法执行之前     |
      | --------------------- | ---------------------- |
      | **OnActionExecuted**  | 在行为方法执行之后     |
      | OnResultExecuting     | 在行为方法返回结果之前 |
      | OnResultExecuted      | 在行为方法返回结果之后 |
    
17. 获取controller或者action

    * RouteData.Values["controller"]

    * RouteData.Values["action"]

    * 在视图中获取控制器或者方法

    * ViewContext.RouteData.Values["controller"] 

18. web service

    * 基于web的服务,使用web(http)方式,接收和响应外部系统的请求

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值