推荐的面试题汇总博客:
https://blog.csdn.net/puzi0315/article/details/118653815
https://www.cnblogs.com/zhangmumu/p/14785169.html
1、重写与重载:
-
重载:同一个类中定义多个 方法名相同、参数类型和数量不同 的方法,且返回值可以相同可以不同。
(当类型和数量相同,但是参数顺序不同,是不会重载的,只会报错。) -
重写:
- 在继承中,派生类重写基类。
- 要求返回值、修饰符、方法名都相同。
- 重写的时候,基类被virtual、abstract修饰,且派生类要被override修饰。
-
两者之间的区别:
-
相同点:**方法名都相同,访问修饰符相同
-
不同点:
1)、重载:是在一个类中,并且参数列表不同(参数类型、参数个数)返回值类型没有要求,不用使用关键字就可以重载。
2)、重写:不在一个类中,是继承关系,参数列表相同,返回值类型相同,需要使用关键字才能重写。
-
原文链接
https://blog.csdn.net/abraham_ly/article/details/106736077
2、接口:
C#通过接口来实现多继承。
接口可以继承其他接口,类可以通过其继承的基类(或接口)多次继承同一个接口。
- 特征:
- 类似于抽象基类,继承接口的任何类型都必须实现接口的所有成员。
- 接口中不能包括构造函数,因此不能直接实例化接口。可以通过类继承来实现接口。
- 接口可以包含 属性、方法、索引器、事件。
- 接口只能定义成员,不能实现成员。
- 接口中的成员不能加访问修饰符,因为接口成员永远是公共的。
- 成员不能声明为虚拟或者静态。
3、抽象类与抽象方法:(abstract)
- 类中只要有一个方法声明为抽象方法,那么这个类也必须声明为抽象类。
- 抽象方法不提供具体实现。需要派生类来重写实现(派生类使用override关键字)。
- 声明抽象方法时,不能使用virtual、static、private修饰符。
4、事件与委托:
- 事件(event) 属于类成员,需要放在类的内部;
- 使用:用于对象或类间的动作协调与信息传递(消息推送)
- 经由事件发送过来的与事件本身相关的数据,称为事件参数(EventArgs)。
- 处理事件时具体所做的事情,叫做事件处理器。
- 使用:用于对象或类间的动作协调与信息传递(消息推送)
/**使用EventHandler有三个意义:
*1、使用这个名字,表明这个委托类型是专门使用事件的,别人就不会拿这个委托做其他事情;
*2、表明是约束事件处理器的;
*3、表明这个委托未来创建出来的实例是专门存储事件处理器的。(这3点增强可读性)
*/
//event:声明事件的关键字,不加就会变成字段定义。事件的作用是防止字段被滥用,增加安全性。
//EventHandler委托:厂商为我们准备好的一个通用的专门用于去声明事件的委托类型。如果使用EventHandler,就不用声明委托了。
public event EventHandler Order;
- 委托(delegate) 是一个定义,和类、接口一样的,通常在类的外部。
- C# 自带的委托:Action委托(没有返回值)、Func委托(有返回值)。
//calculator.Report后面不加圆括号,只需要方法名就好(如果加上就是调用了)
Action action = new Action(calculator.Report);
//<>中的前两个int是目标方法的参数类型,第三个是返回值类型
Func<int, int, int> func2 = new Func<int, int, int>(calculator.Sub);
-
- 声明委托是在名称空间体中。
- 委托与所封装的方法必须“类型兼容”。
//自定义委托类型
//声明委托。delegate后面的double是返回值的类型。括号里加上目标方法的参数列表
public delegate double Calc(double x, double y);
- 事件和委托的关系:
事件是基于委托的,有两层意思:(委托是底层基础,事件是上层建筑)- (1)事件需要用委托类型来做一个约束,这个约束既规定事件能够发送什么消息给事件的响应者,也规定了事件 响应者能收到什么样的事件消息。这就决定了事件响应者的事件处理器,必须能够和这个约束匹配上,它才能订 阅这个事件。
- (2)当事件的响应者对事件的拥有者提供能够匹配这个事件处理器的事件之后,需要找个地方将事件处理器保存 记录起来,能够记录或者说引用方法的任务也只有委托类型的实例才能做到。
- 总结,事件这种成员,无论是从表层约束这层来讲,还是底层实现来讲,它都是依赖于委托类型的。
5、visual studio创建应用种类:
- 空白应用后面写了是通用应用,是用来编写uwp软件的,编写出来的软件要发布到win10应用商店才能被其他人使用,其他系统不能使用。
- wpf应用采用xaml编写界面,注重软件的美观,界面与后台代码脱离
- Winform应用就是最基本的拖控件写代码,注重开发效率
6、.NET Core的生命周期:
ASP.NET Core支持依赖注入软件设计模式,它允许在不同的组件中注入我们的服务,并且控制服务的初始化。有些服务可以在短时间内初始化,并且只能在某个特别的组件,以及请求中才能用到;而还有一些服务,仅仅只用初始化一次,就可以在整个应用程序中使用。
Singleton --单例模式:
只有一个服务的实例被创建,这个实例,存储在内存中,可以在整个应用程序中使用。我们可以对一些初始化代价比较大的服务,使用Singleton模式。在代码中可以这样:
services.AddSingleton<IProductService, ProductService>();
Scoped --作用域
这种模式下,将会为每一个请求,都创建一个服务的实例。所有同一个请求中的中间件、MVC控制器,等等,都会得到一个相同的服务实例。Entity Framework Context就是一个Scoped服务最好的参考例子。我们可以通过使用AddScoped方法来使用Scoped模式:
services.AddScoped<IProductService, ProductService>();
Transient --短暂的、瞬变的
Transient模式下,服务每次被请求的时候,都会创建一个服务实例,这种模式特别适合轻量级、无状态的服务。我们可以使用AddTransient方法,来注入服务:
services.AddTransient<IProductService, ProductService>();
(这部分内容摘自:https://www.cnblogs.com/zhangmumu/p/14785169.html ,其中还有其博主总结的其他面试知识点)
这个链接能更好的理解三者之间的区别:
.Net Core 三种生命周期之间的区别
7、.Net Standard(.Net 标准):
.NET平台标准是以引用组件的方式存在,其本身并没有任何实现,真正的实现是由平台拥有者所进行,而客户端使用简单的NuGet版本戳记即可获得正确的平台版本。