C#面试题

1.UDP和TCP连接有何异同?
传输控制协议(TCP):TCP协议是一种可靠的、一对一的、面向有连接的通信协议
用户数据报协议(UDP):UDP传输协议是一种不可靠的、面向无连接、可以实现多对一、一对多和一对一连接的通信协议

2.什么叫应用程序域?什么是托管代码?什么是强类型语言?
应用程序域:在.Net中,应用程序有了一个新的边界:应用程序域(以下简称域),它是一个用于隔离应用程序的虚拟边界,为了禁止不应交互的代码进行交互,这种隔离是必要的
托管代码:受CLR管理的代码
非托管代码:不受CLR管理的代码,比如数据库连接,文件读写…
强类型系统:强类型系统就是对每一个数据都有类型的限制,如C#,Java等属于强类型语言,javascript等属于弱类型语言

3.堆和栈的理解
引用类型创建的对象总是存放在堆中
值类型申明的变量和指针总是放在它们被声明的地方,存放在栈上

栈通常保存着我们代码执行的步骤,我们可以把栈想象成一个接着一个叠放在一
起的盒子(越高内存地址越低)。当我们使用的时候,每次从最顶部取走一个盒子,当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着下一个
堆是无序的,他是一片不连续的内存域,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉,通过垃圾回收器(GC)来回收

4.C#中序列化和反序列化
序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有json、xml、文件等。
序列化:将对象转化为容易传输的格式的过程
反:重新解析构造被序列化的对象
可以使用Newtosoft.json组件实现序列化

5.& 和 && 的区别
&运算符有两种用法:(1)按位与;(2)逻辑与
&&运算符是短路与运算。
逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。

6.方法参数用ref修饰表示的是什么意思?
ref修饰的参数表示引用参数,引用参数不会创建新的副本,引用参数与实参指向同一内存地址。所以参数在方法内部修改后,调用者对应的实参本身也会发生变化

7.重载(overload)和重写(override)的区别?
方法的重载是发生在同一个类中的
判断重载:方法名一致,参数列表中参数的顺序,类型,个数不同。返回值可以不同

方法的重写是发生在父子类之间的
判断重写:方法名一致,参数列表必须完全与被重写方法的一致,返回类型必须完全与被重写方法的返回类型一致
构造方法和声明为final,static 的方法不能被重写
8.为什么函数不能根据返回类型来区分重载?(华为面试题)
因为调用时不能指定类型信息,编译器不知道你要调用哪个函数
float max(int a, int b);
int max(int a, int b);
当调用 max(1, 2);时无法确定调用的是哪个,单从这一点上来说,仅返回值类型不同的重载是不应该允许的。
void f() {}
int f() {}
若编译器可根据上下文(语境)明确判断出含义,比如在 int x=f()中,那么这样做完全没有问题。然而,我们也可能调用一个方法,同时忽略返回值;我们通常把这称为“为它的副作用去调用一个方法”,因为我们关心的不是返回值,而是方法调用的其他效果。所以假如我们像下面这样调用方法: f(); C#怎样判断 f()的具体调用方式呢?而且别人如何识别并理解代码呢?由于存在这一类的问题,所以不能。

9.char 型变量中能不能存储一个中文汉字,为什么?
但是在C#里面 char为两个字节 因为C# char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中可以存储汉字。

10.抽象类(abstract class)和接口(interface)有什么异同?
不同:
抽象类: 1.抽象类中可以定义构造器 2.可以有抽象方法和具体方法 3.抽象类中的成员可以是 private、internal、protected、public 4.抽象类中可以定义成员变量 5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法 6.抽象类中可以包含静态方法 7.一个类只能继承一个抽象类
接口: 1.接口中不能定义构造器 2.方法全部都是抽象方法 3.接口中的成员全都是 public 的 4.接口中定义的成员变量实际上都是常量 5.接口中不能有静态方法 6.一个类可以实现多个接口

相同:
1.不能够实例化 2.可以将抽象类和接口类型作为引用类型 3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类

11.抽象的(abstract)方法是否=可同时是静态的(static)
不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。

12.阐述静态变量和实例变量的区别?
静态变量: 是被 static 修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;静态变量可以实现让多个对象共享内存;
实例变量: 必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。

13.break 和 continue 的区别?
break 和 continue 都是用来控制循环的语句。
break 用于完全结束一个循环,跳出循环体执行循环后面的语句。
continue 用于跳过本次循环,执行下次循环。

14.string s = “Hello”;s = s + " World!";这两行代码执行后,原始的string对象中的内容到底变了没有?
没有。因为 String 被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s 原先指向一个 String 对象,内容是 “Hello”,然后我们对 s 进行了“+”操作,那么 s 所指向的那个对象是否发生了改变呢? 答案是没有。这时,s 不指向原来那个对象了,而指向了另一个 String 对象,内容为"Hello World!",原来那个对象还存在于内存之中,只是 s 这个引用变量不再指向它了。

通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说不可预见的修改,那么使用 String进行加号拼接的方式会引起内存的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。因此我们平时推荐如果进行字符串的拼接操作的话使用StringBuilder类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。

15.请描述try catch finally的执行机制?
try代码块的代码出错之后会进入catch代码块执行,无论代码是否出错,都会进入finally代码块执行

16.数据类型之间的转换
其余类型的转换类似
int a = (int) b; //b只能是数字类型(例float,int,double,decimal等)
int a = int.Parse(b); //b只能是整型字符串类型
int a = Convert.ToInt32(b); //b的类型比较任意
int a = 0;
int.TryParse(b,out a); // int.TryParse()其实是对int.Parse()做了一个异常处理,如果出现异常则返回false,并且将输出参数返回0,使用此方式不会出现异常===

总结:如此可见,我们在进行数据转换前选择转换方法要谨慎,如果是数字类型可以考虑直接用(int)强制转换,如果是整型字符串类型的,考虑用int.Parse()进行转换,如果不是这两种类型,再考虑用Convert.ToInt32()进行转换

17.C#中有几种流
FileStream: 文件流,用于文件的读取,写入等
MemoryStream:内存流,对内存而不是对磁盘进行数据读写 减少了对临时缓冲区和文件的需要
BufferedStream:缓冲流,缓冲区是内存中的字节块,用于缓存数据,从而减少操作系统访问磁盘的次数,缓冲区可提高读取和写入性能

18.C#是否可以直接对内存进行操作?
可以操作内存,包括使用指针,都是可以的 不过多数时候都需要把这些代码声明为unsafe,也就是不安全的代码

19.List泛型集合相较于ArrayList的好处
由于集合定义的时候的就指定了集合中数据类型,因此从集合中进行数据读写的时候减少了装箱和拆箱的操作。

20.什么是线程池,如何使用?
线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用 new 线程而是直接去池中拿线程即可,节省了开辟子线程的时间,提高的代码执行效率。
Task task = new Task(委托);
task.Start();
//task线程全部是线程池线程

21.请叙述一下您对线程池的理解?
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定 性,使用线程池可以进行统一的分配,调优和监控。

22.三个线程 a、b、c 并发运行,b,c 需要 a 线程的数据怎么实现?
分析题意,b,c需要a线程的数据,我们知道多线程是无法控制执行顺序的,那如何保证b,c线程的执行在a线程之后呢?
原理上三种方式:
a: 异步回调(ContinueWith)
b: IsCompleted
c: 信号量

23.线程和进程的区别
进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒度大小不同
进程:是资源分配的最小单位
线程:是进程的一个实体,是比进程颗粒度小的可以独立运行的基本单位

特点:进程在运行时各自内存单元相互独立,线程之间内存共享,这使多线程编程可以拥有更好的性能和用户体验。
注意:多线程编程对于其它程序是不友好的,占据大量 cpu 资源。

24.C#中的反射?
反射是什么
反射指的是提供封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有的对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以利用反射对它们进行访问。

25.C#中的动态代理?
动态代理是实现代理模式的一种方法,而代理模式可以在不修改原有对象的情况下为对象添加新的功能,也是面向切面(AOP)的一种实现。

26.动静态代理的区别,什么场景使用?
静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。
AOP 编程就是基于动态代理实现的

27.你所知道的设计模式有哪些?
一般认为有 23 种设计模式,我们不需要所有的都会,但是其中常用的几种设计模式应该去掌握。下面列出了所有的设计模式。需要掌握的设计模式我单独列出来了,当然能掌握的越多越好。
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:观察者模式、策略模式、模板方法模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

28.工厂设计模式
工厂模式分为工厂方法模式和抽象工厂模式
工厂方法模式分为三种: 普通工厂模式,多个工厂方法模式,静态工厂模式
普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建
多个工厂方法模式:是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象
静态工厂模式:将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调
抽象工厂模式:工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂 类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
29.建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象, 所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的 Test 结合起来得到的。
30.适配器设计模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
接口的适配器模式
接口的适配器是这样的,有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个 问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。

31.观察者模式
观察者模式很好理解,类似于邮件订阅和 RSS 订阅,当我们浏览一些博客或 wiki 时,经常会看到 RSS 图标,就 这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其 它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。

32.谈谈CLR的内存结构和内存分配?
CLR的内存结构主要分为堆和栈
堆内存:引用数据类型在堆上分配空间;
栈内存:基础数据类型直接在栈分配空间;引用类型的变量在栈分配空间;

ADO.Net
33.使用ADO.Net操作数据库流程?
第一步:准备数据库连接字符串;
第二步:创建连接(Connection)对象
第三步:打开连接
第四步:创建Command对象
第五步:使用Command对象执行Sql语句
第六步:关闭连接

34.ADO.Net的五大对象?
Connection 连接对象 用于对数据库的连接操作
Command 命令对象 用于执行Sql语句
DataReader 数据读取对象 用于数据库检索数据信息
DataAdapter 数据适配器对象 是DataSet和数据源之间的桥梁
DataSet 数据集对象 相当于内存数据库

35.关系数据库中连接池的机制是什么?
前提:为数据库连接建立一个缓冲池。
1:从连接池获取或创建可用连接
2:使用完毕之后,把连接返回给连接池
3:在系统关闭前,断开所有连接并释放连接占用的系统资源
4:能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值。

其中有几个概念需要大家理解:
最小连接数是连接池一直保持的数据连接。如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接 资源被浪费掉。
最大连接数是连接池能申请的最大连接数。如果数据连接请求超过此数,后面的数据连接请求将被加入到等待队 列中,这会影响之后的数据库操作。
如果最小连接数与最大连接数相差太大,那么,最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接 池中等待重复使用或是空闲超时后被释放。
上面的解释,可以这样理解:数据库池连接数量一直保持一个不少于最小连接数的数量,当数量不够时,数据库会 创建一些连接,直到一个最大连接数,之后连接数据库就会等待。

Web

36.http 常见的状态码有哪些?
200 OK //客户端请求成功
301 Moved Permanently(永久移除),请求的URL已移走。Response 中应该包含一个 Location
URL, 说明资源现在所处的位置
302 found 重定向
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的 URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

37.GET 和 POST 的区别?
从表面现像上面看 GET 和 POST 的区别:

  1. GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割 URL 和传输数据,参数之间以&相连,如:login.action?name=zhagnsan&password=123456。POST把提交的数据则放置在是HTTP包的包体中。
  2. GET 方式提交的数据最多只能是1024 字节,理论上 POST 没有限制,可传较大量的数据。其实这样说是错误的,不准确的: “GET 方式提交的数据最多只能是 1024 字节",因为 GET 是通过 URL 提交数据,那么 GET 可提交的数据量就跟 URL 的长度有直接关系了。而实际上,URL 不存在参数上限的问题,HTTP 协议规范没有对 URL 长度进行限制。这个 限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、 FireFox 等,理论上没有长度限制,其限制取决于操作系统的支持。
    3.POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面 GET 提到的“安全”不是同个概念。上 面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的 Security 的含义,比如:通过 GET 提交数据,用户名和密码将明文出现在URL 上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用 GET 提交数据还可能会造成 Cross-site request forgery 攻击。 Get 是向服务器发索取数据的一种请求,而 Post 是向服务器提交数据的一种请求,在FORM(表单)中,Method 默认为"GET",实质上,GET 和 POST 只是发送机制不同,并不是一个取一个发!

38.http 中重定向和请求转发的区别?
本质区别:转发是服务器行为,重定向是客户端行为。
重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会丢失。 、
请求转发特点:一次请求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会丢失。

39.Cookie 和 Session 的区别
Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。以后浏览器再给特定的web服务器发送请求时,同时会发送所有为该服务器存储的 cookie。
Session 是存储在 web 服务器端的一块信息。session 对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的Web页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
Cookie 和 session 的不同点:
1.无论客户端做怎样的设置,session 都能够正常工作。当客户端禁用 cookie 时将无法使用 cookie。
2.在存储的数据量方面:session 能够存储任意的 C# 对象,cookie 只能存储 String 类型的对象。

40.SQL 的 select 语句完整的执行顺序
1、From (告诉程序来自哪张表 如果是表表达式依旧是如此顺序)
2、Where(条件筛选 谓词筛选 )
3、Group by(分组)
4、Having(分组 谓词筛选 )
5、Select (表达式)
6、表达式(开窗函数 聚合函数 等等)
7、Distinct(去重复)
8、ORDER BY
9、TOP/OFFSET-FETCH

41.事务的四大特征是什么?
数据库事务 transanction 正确执行的四个基本要素。
ACID,原子性(Atomicity)、一致性(Correspondence)、隔离 性(Isolation)、持久性(Durability)。
(1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执 行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
(2)一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
(3)隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相 同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称 为串行化,为了防止事务操作间的混淆, 必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
(4)持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

42.存储过程和函数的特点和区别?
函数只能返回一个变量的限制,而存储过程可以返回多个;8888888
函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程一般是作为一个独立的部分来执行;
函数限制比较多,比如不能用临时表,只能用表变量,而存储过程的限制相对就比较少;
函数的实现的功能针对性强一些,而存储过程实现的功能要更复杂一些;

43.Sql Server中触发器的作用什么?
触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器由于其的不可控性日常实际项目中一般不用。

44.如何提高Sql Server的安全性?
Sql Server的安全性是通过设置身份验证实现的,比如设置账户是否有权限访问数据库,是否有权限访问哪些数据,是否有权限操作哪些数据。
在防火墙上禁用 SQL Server 端口。
使用最安全的文件系统,切记不要随意删除日志文件。
审核指向 SQL Server 的连接。

45.在千万级的数据库查询中,如何提高效率?
a:数据库设计方面,合理的建立索引;合理的设置表的字段类型;避免频繁创建和删除临时表;
如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
b:优化SQL语句,应尽量避免像在 where 子句中使用!=或<>操作符;在where 子句中使用 or 来连接条件;.in 和 not in 也要慎用;否则会导致全表扫描等等,从而保证索引的有效性。11111111111
c:程序方面,控制好内存,展示的数据多的时候尽量是分页获取;有的数据要用缓存;

46.如何优化能支撑几十万条并发?
1)HTML静态化
2)资源服务器分离
3)项目负载均衡
4)数据库集群和库表散列
5)数据库交互使用存储过程代替Sql语句
6)优化项目的服务器配置
7)使用缓存技术

47.简单介绍一下ASP.NET Web API技术?
ASP.NET Web API是一个用于在.NET Framework之上构建Web API(网络应用程序接口)的框架,编写的应用程序接口可以服务各种客户端,包括浏览器,移动设备和传统的桌面应用程序。是构建Restful应用程序的理想平台的.NET框架。

48.请简单描述一下系统开发中常用的三层架构?
我们常说的三层架构包括表示层,业务逻辑层,数据访问层
表示层:表示层就是实现用户界面功能,将用户的需求接收和响应,并调用相应的业务逻辑层代码进行相关的业务处理。
业务逻辑层:业务逻辑层BLL的功能是对具体问题进行逻辑判断与执行操作,接收到表现层 UI 的用户指令后,会调用数据访问DAL层实现相应的数据处理
数据访问层:数据访问层DAL是数据库的主要交互对象,实现数据的增加、删除、修改、查询等操作,并将操作结果反馈到业务逻辑层 BLL

49.间述在.NET中类(class)与结构(struct)的异同?
类:
类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
类有构造和析构函数
类可以继承和被继承
结构:
结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
结构没有构造函数,但可以添加。结构没有析构函数
结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

50.数据量大的表查询时如何性能优化(主要说数据库端的常用方法)
a:合理使用索引
b:避免或简化排序的操作
c:消除对大型表行数据的顺序存取 (如在表连接的连接条件列建立索引)
d:避免相关子查询
e:避免困难的正规表达式(如like)
f:使用临时表加速查询
g:用排序来取代非顺序存取
h:使用存储过程
i:查询指定页数据而不查所有数据

51.谈谈你对MVC的理解?
MVC的全名是Model View Controller,是模型(Model)-视图(view)-控制器(controller)的缩写,是一种设计模式。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间,提高代码复用性。

52.什么是ORM?
ORM全称是:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。

53.接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
接口可以继承接口
抽象类可以实现接口
抽象类可以继承实体类

54.Error和Exception有什么区别?
Error(错误)是系统中的错误,程序员是不能改变的和处理的,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。
Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

55.const和 readonly这两个修饰符的区别?
const与readonly 很像,都是将变量声明为只读,且在变量初始化后就不可改写。
首先先解释下什么是静态常量以及什么是动态常量。静态常量是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。而动态常量的值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。const修饰的常量其实就是静态常量,readonly修饰的常量就是动态常量。

56.请简单描述一下C/S和B/S模式?
C/S架构是第一种比较早的软件架构,全称为Client/Server,即客户端/服务器结构,C/S架构软件有一个特点,就是如果用户要使用的话,需要下载一个客户端,安装后就可以使用。比如QQ,Office软件等。

B/S架构全称为Browser/Server,即浏览器/服务器结构,客户使用的话无需安装,有Web浏览器即可。

57.Asp.Net MVC中控制器向视图传值的几种方式?
model (强类型传值)
ViewBag (dynamic 动态类型传值)
ViewData (字典的键值对结构传值

TempData(依赖于sesssion的实现,后续的Action一旦被读取一次,数据自动销毁,应用场景:验证码)

58.客户端请求服务器端的几种方式?
Url请求—请求采用的get方法,例地址栏上输入请求地址,请求js、css、图片、视频等资源文件
Form表单提交—请求可以采用get方法和post方法,表单提交会发生页面跳转
Ajax—异步请求,请求可以采用get方法和post方法,请求实现的是局部刷新

59.什么是Asp.Net?
Asp.Net是微软推出的用于Web应用开发的一种编程技术
Asp.Net主要包括Asp.Net MVC和Asp.Net WebForm两种技术框架

60.什么是.Net Core?
.Net Core是微软开发的具有跨平台能力的应用程序开发框架
.Net Core是一个通用的软件开发框架。它允许开发人员构建各种软件,包括Web,桌面,移动,云,游戏,物联网等
ASP.NET Core是.NET Core生态系统的核心组件。ASP.NET Core是一个用于构建Web应用的框架

61.C#抽象类和接口,实体类的区别?
接口:接口是用来定义规范的,接口可以继承多个接口,类可以实现多个接口
抽象类:抽象类目的也是用来实现代码复用的,抽象类中可以存在未实现的方法,抽象类不可以实例化
实体类:实体类目的是用来对某一类实物进行抽象化的,类只能继承一个类

62.简述EF中数据实体的五种状态?
Detached //对象存在,但没有被EF容器管理
Unchanged //对象尚未经过改动
Added //对象为新加对象,并且已添加到EF容器中
Deleted //对象已经从上下文中删除
Modified //对象上的一个标量属性已经更改

63.什么是切面编程AOP?
面向切面编程(aspect-oriented programming),是一种将横切关注点与业务逻辑分离的编程方式。每个横切关注点都集中在一个地方,而不是分散在多处代码中。这样使我们的服务模块更加简洁,因为它们只包含了主要关注点的代码,而次要的功能或者说辅助的功能被转移到切面中了。

64.什么是装箱和拆箱?
装箱是将值类型转成引用类型,拆箱是将引用类型转成值类型

65.什么是局部变量,什么是成员变量,什么是属性?
局部变量:方法体或者代码块中定义的变量
成员变量:类中定义的字段
属性:用来保护成员变量的,现在对于公有的成员变量,我们常常会用属性的简写方式来写,体现了类的封装性

  1. 请描述Asp.net中的7大内置对象的含义
    Cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递
    Session对象存储用户会话所需的信息
    Application对象使给定应用程序的所有用户之间共享信息,并且在服务器运行期间持久地保存数据
    Catch对象使给定应用程序的所有用户之间共享信息,可以较为便利的控制其失效规则
    Request对象主要是封装HTTP请求信息
    Response对象主要是封装HTTP响应信息
    Server对象提供对服务器上的方法和属性的访问

67.一列数的规则如下: 1、1、2、3、5、8、13、21、34… 求第30位数是多少,用递归算法实现。
public class MainClass {
public static void Main() {
Console.WriteLine(Foo(30));
}
public static int Foo(int i) {
if(i == 1 || i ==2)
return 1;
else
return Foo(i -1) + Foo(i - 2);
}
}

68.请编程实现一个冒泡排序算法?
int temp = 0;
int[] arr = { 10, 13, 12, 15, 9 };
for (int i = 0; i < arr.Length - 1; i++)
{
for (int j = 0; j < arr.Length-1-i; j++)
{
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j + 1] = temp;
}
}
}

69.什么是虚函数?什么是抽象函数?
虚函数:需要实现,可由子类重写的函数。
抽象函数:自身不能实现,子类必须实现的函数,必须被重写

70.分布式,微服务,集群的概念
分布式:一个业务分拆多个子业务,部署在不同的服务器上
集群:同一个业务,部署在多个服务器上
分布式是指将不同的业务分布在不同的地方。而集群指的是将几台服务器集中在一起,实现同一业务
分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的
微服务:将模块拆分成一个独立的服务单元通过接口来实现数据的交互
微服务架构
微服务的设计是为了不因为某个模块的升级和BUG影响现有的系统业务。微服务与分布式的细微差别是,微服务的应用不一定是分散在多个服务器上,它也可以是同一个服务器。

71.C#是否可以直接对内存进行操作?
可以操作内存,包括使用指针,都是可以的 不过多数时候都需要把这些代码声明为unsafe,也就是不安全的代码
72.New有几种用法?
第一种是创建对象、调用构造函数
第二种是作为修饰符,显示隐藏继承于基类的继承成员
第三种是用在泛型中添加类型的约束
73.C#JIT的概念及作用?
C#编写的程序,经过编译器把编译后,源代码被转换成Microsoft中间语言(MSIL)。MSIL不是真正可执行的代码。因此,要真正执行MSIL应用程序,还必须使用“JIT编译器”,对MSIL再次编译,以得到主机处理器可以真正执行本机指令。JIT编译器以即时方式编译MSMIL代码,以便应用程序执行。
74.多态的理解?
下面实例化三个 Animal 实例,但是他们实际上指向的分别是 Animal 对象、Cat 对象和 Dog 对象,如下图:
在这里插入图片描述
请注意,变量 ac 和 ad 虽然都是 Animal 类型,但是指向的分别是 Cat 对象和 Dog 对象,这里是关键。
当执行 a.Sleep() 时,由于Sleep是非虚实例方法,JIT编译器会找到发出调用的那个变量(a)的类型(Animal)对应的类型对象(Animal 类型对象)。然后调用该类型对象中的Sleep方法,如果该类型对象没有Sleep方法,JIT编译器会回溯类的基类(一直到 Object)中查找Sleep方法。
当执行ac.EatFood 时,由于EatFood是虚实例方法,JIT编译器调用时会在方法中生成一些额外的代码,这些代码会首先检查发出调用的变量(ac),然后跟随变量的引用地址找到发出调用的对象(Cat 对象),找到发出调用的对象对应的类型对象(Cat 类型对象),最后在该类型对象中查找重写的EatFood方法。同样的,如果在该类型对象中没有查找到EatFood 方法,JIT编译器会回溯到该类型对象的基类中查找。
上面描述的就是 JIT 编译器在遇到调用类型的非虚实例方法以及虚实例方法时的不同执行方式,也这是处理这两类方法的不同方式造成了表面上我们看到的面向对象的三个特征之一——多态性。
75…工厂模式的作用?
a:工厂类是为了保持创建类与使用类分离
b:两个类A和B之间的关系应该仅仅是A创建B或是A使用B,而不能两种关系都有
c:防止用来实例化一个类的数据和代码在多个类中到处都是,可以将有关创建的知识搬移到一个工厂类中
76.如何理解clone对象
​在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中的值,也就是说,A 与 B 是两个独立的对象,但 B 的初始值是由 A 对象确定的。在C#中用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现 clone()方法是其中最简单,也是最高效的手段。

clone方法分为浅拷贝和深拷贝
无论是浅拷贝和深拷贝都会产生一个对象副本
浅拷贝:对象副本对于被拷贝对象的值类型成员会重新拷贝一份,对于被拷贝对象的引用类型成员只会拷贝所引用的地址
实现接口ICloneable,并实现Clone方法
深拷贝:对象副本对于被拷贝对象的值类型成员和引用类型成员都会重新拷贝一份
实现方式:1.利用反射实现 2.利用序列化实现
77.C#中有没有goto语句?
有,语句用于直接在一个程序中转到程序中的标签指定的位置,标签实际上由标识符加上冒号构成,但一般不推荐使用。
78.在C# 中,如何跳出当前的多重嵌套循环?
break只能跳出当前层的循环,如何要跳出多重循环可以使用return,当然也可以使用goto但不推荐使用了

参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

qq_46460119

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值