求职经验分享

前言

历时半个月时间,终于找到了一份.net开发的工作。

双非本科。。。

求职软件

我手机下载了

  1. 应届生求职 不常用
  2. Boss直聘 常用
  3. 前程无忧 不常用
  4. 智联招聘 常用
  5. 猎聘 不常用
  6. 拉勾招聘 不常用

最常用的是Boss直聘,最后也是在Boss直聘上找到的工作,然后其次是智联招聘。

首先来讲讲Boss直聘,我是沟通了334个,投递了22份简历,面试了3个。看图:

我大部分投递的职位是C#/.net开发,少量是Java开发,然后3个面试都是.net开发。

然后boss的会员我自己觉得并没有什么用,花6元开个试用一周就行了。

面试经验

消除紧张的最好办法就是自信,别问到不会的问题就紧张起来了,不会就是不会,有什么大不了的,下次面试记住之前不会的题目就行了,没什么好紧张的。

第一份面试是厦门的一个.net实习开发,然后是经过了笔试和电话面试,Boss上写的工资是5k-6k,然后实际谈的时候是只能开到3k-3.5k,说boss上的薪资是转正之后的,然后不包吃住,所以谈崩了。

第二份面试就是上海的一个,也是.net开发,然后电话面试也是过了,但是只能给我开200+20饭补每天,但是在上海这个工资我感觉太少了,不包吃住,所以就推掉了。

第三份面试也就是我现在要去入职的,苏州昆山的.net开发工程师,经历了笔试-电话面试-第二次笔试-电话面试,第一轮笔试分为算法题和逻辑题,算法题很简单,也就是leetcode上简单类目的题目,然后逻辑题就稍微有点难了,因为准备的时候也没怎么准备逻辑题目,但是最后还是给我通过了。电话面试就是问一下技术问题。第二次笔试是要求做一个简单的增删改查系统。最后的电话面试就是了解我的情况了。总的来说流程是很清晰,最后开出的工资是5k加上加班费。

智联招聘上有很多java的岗位,然后校招也有,自身学历高的话很吃香,然后boss上.net岗位还是挺多了,我自己大部分也是用boss去投的,然后boss上也是有校招的岗位。然后除了招聘软件还可以去自己学院的官网找就业那一块,有很多公司校招的信息,然后可以投递简历。

可以没事刷刷leetcode的算法题,比如:

  1. 查找字符串数组中的最长公共前缀
  2. 给定一个字符串,找到它的第一个不重复的字符(字母都为小写),并返回它的索引。如果不存在,则返回空字符串
  3. 二进制功能实现。例如输入一个值如22 输出的结果是10110
  4. 求数组中的最大值

都是很简单的题目,当然根据你面试的岗位而定,我是实习开发,所以题目相对简单。

然后有些公司会叫你做一个简单的系统,如果是采用的Asp.Net MVC 不是.NET Core的话,还是可以采用依赖注入来实现功能的,然后架构搭建清楚,视图层、模型层、控制器层,多写注释,虽然他要求只需要实现增删改查,但是我们在查的时候可以实现多条件查询、分页查询,这都可以加分的。对于依赖注入具体看:

ZY知识库 · ZY - .Net Framework使用Autofac实现依赖注入 (pljzy.top)

面试题分享

下面是我面试的遇到的常见面试题,如果有疑问可以评论,有错误可以指出,感谢大家支持。

IOC

IOC(Inversion of Control)是一种软件设计思想,也是面向对象编程中的一个重要概念。它是指控制反转,即将对象的创建、依赖关系的管理和对象的生命周期的控制交由外部容器来完成,而不是由对象自身来完成。

AspNetCore 应用的生命周期

  1. 构建阶段(Build):在这个阶段,应用程序的依赖关系和配置信息被加载和配置。这包括注册服务、配置中间件管道和设置应用程序的配置选项。
  2. 启动阶段(Startup):在这个阶段,应用程序开始启动。在启动阶段,可以执行一些初始化操作,如数据库迁移、创建数据库连接等。
  3. 运行阶段(Run):在这个阶段,应用程序开始处理请求。请求经过中间件管道,执行相应的逻辑处理,并生成响应。
  4. 停止阶段(Shutdown):在这个阶段,应用程序接收到停止信号,开始停止处理请求。可以执行一些清理操作,如关闭数据库连接、释放资源等。

反射在AspNetCore里的使用场景

C#中的反射(Reflection)是一种强大的机制,允许在运行时获取和操作类型的信息,包括类、方法、属性、字段等。通过反射,可以动态地创建对象、调用方法、获取和设置属性值等。

可以用反射来进行依赖注入,然后可以用反射来修改对象的属性和字段,ORM和mapper这些也是反射实现的

介绍一下MySQL的索引

MySQL的索引就是提高查询性能,有唯一索引、主键等等,还有就是列有很多重复的内容就没必要建立索引了。

主键索引是在表的主键列上创建的索引,保证主键列的唯一性。 唯一索引也是用于索引列的唯一性但是唯一索引允许空值。

大部分索引都是通过Hash,B-树,B+树实现的。

慢查询

慢查询就是超过了设置的时间阈值的查询,Mysql有慢查询日志,通过设置参数开启它,查看日志,优化产生慢查询的语句。

介绍一下lambda

lambda表达式 是一种简化的匿名函数,参数=>表达式或语句块,叫goes to 。

lambda跟委托的关系

可以创建委托

linq的原理

LINQ的原理基于.NET框架中的一组标准查询运算符(Standard Query Operators),这些运算符定义了一套通用的查询操作,如过滤、排序、投影、分组等。这些运算符是通过扩展方法的形式定义在.NET框架的IEnumerable和IQueryable接口上。

LINQ 查询语法、方法语法

  1. 查询语法(Query Syntax):查询语法使用类似SQL的语法结构来编写查询。它使用关键字(如fromwhereselect等)来描述查询的逻辑。查询语法通常以queryfrom关键字开始,以selectgroup by关键字结束。

示例:

var query = from student in students
            where student.Age > 18
            select student.Name;
  1. 方法语法(Method Syntax):方法语法使用一系列的方法调用来构建查询。它使用LINQ扩展方法来对数据进行筛选、排序、投影等操作。方法语法通常以数据源(如集合)作为起点,然后通过链式调用方法来进行操作。

示例:

var query = students
    .Where(student => student.Age > 18)
    .Select(student => student.Name);

泛型

C#中的泛型(Generics)是一种通用编程机制,它允许在编写代码时使用类型参数,以实现代码的复用和类型安全。

泛型可用于定义泛型类、接口、方法 然后用<>将类型参数作为占位符,具体的类型在使用的时候指定。

await/async 的实现原理

await表示这个方法是可等待的,防止阻塞线程,async表示该方法为异步方法,这2个关键字的搭配使用的,有async就有await。

他们都是基于Task来实现的,编译器会把async方法编译成一个类,并且把异步方法中的代码切分成多次方法调用,每个await会切分状态。

使用async关键字修饰的方法在编译时会被转换为一个状态机。编译器会分析方法中的await表达式,并将方法的执行流程分割为多个状态,以便在await表达式处暂停和恢复执行。

抽象函数

抽象函数(Abstract Function)是一种在抽象类或接口中声明但没有具体实现的函数。抽象函数必须在派生类中进行实现。使用abstract关键字来声明一个抽象函数。

虚函数

是一种允许子类重写的基类方法,在基类中,可以使用virtual关键字来声明一个虚函数。

在ASP.NET MVC中,有几种常见的方式可以在页面之间传递值:

  1. 使用URL参数:Request.QueryString
  2. Session
  3. TempData、ViewBag、ViewData
  4. Cookie
  5. Model:return View("TargetView", model);
  6. application 全局

C#中的委托是什么?事件是不是一种委托?

可以使用delegate关键字来定义委托类型

委托可以把一个方法作为参数代入另一个方法,委托可以理解为指向一个函数的引用。事件是一种特殊的委托。

委托的使用场景

  1. 事件处理:委托经常用于实现事件处理机制。通过定义一个委托类型作为事件的类型,并将委托实例用于注册和触发事件,可以实现事件的订阅和处理。
  2. 回调函数:委托可以用作回调函数的参数,用于将某个方法传递给另一个方法,并在需要时进行调用。这在异步编程、多线程和事件驱动编程中非常常见。
  3. LINQ查询:在LINQ(Language Integrated Query)中,委托用于指定查询条件、投影和排序等操作。通过将委托传递给LINQ方法,可以实现自定义的查询逻辑。
  4. 委托链:委托可以持有对多个方法的引用,形成委托链。这种委托链可以用于实现事件的多个处理程序,或者在多个方法之间进行协作和扩展。
  5. 插件和扩展性:委托可以用于实现插件架构和扩展性。通过定义一组委托类型,并允许其他代码提供委托实现,可以实现动态加载和扩展应用程序的功能。
  6. 委托作为参数:委托可以作为方法的参数,用于将方法作为参数传递给其他方法。这可以实现一种灵活的方式来定义和传递特定的行为或算法。
  7. 委托作为返回值:委托可以作为方法的返回值,用于根据不同的条件返回不同的方法实现。这可以实现一种动态的方法选择和调用。

什么是装箱和拆箱?

答:从值类型转换到引用类型装箱。从引用类型转换到值类型拆箱。

抽象类和接口的相同点和不同点有哪些?何时必须声明一个类为抽象类?

相同点:

  1. 都是用来实现抽象和多态的机制。
  2. 都不能被实例化,只能被继承或实现。
  3. 都可以包含抽象方法,即没有具体实现的方法。
  4. 都可以被子类继承或实现,并在子类中实现抽象方法。

不同点:

  1. 抽象类可以包含非抽象方法,而接口只能包含抽象方法。
  2. 类只能继承一个抽象类,但可以实现多个接口。
  3. 抽象类的子类可以选择性地覆盖父类的方法,而接口的实现类必须实现接口中定义的所有方法。
  4. 抽象类可以有构造方法,而接口不能有构造方法。

总结:抽象类和接口都是实现抽象和多态的机制,但抽象类更适合用于一些具有公共实现的类,而接口更适合用于定义一组相关的方法,供多个类实现。抽象类可以包含非抽象方法和构造方法,而接口只能包含抽象方法。

C#面向对象 OOP

C#是一种面向对象的编程语言,它支持面向对象的编程范式。面向对象编程(Object-Oriented Programming,简称OOP)是一种以对象为基本单位的编程思想,通过封装、继承和多态等概念来组织和管理代码。

以下是一些关于C#面向对象的重要概念:

  1. 类(Class):类是面向对象编程的基本构造块,它定义了对象的属性和行为。类是对象的模板,用于创建实例化的对象。

  2. 对象(Object):对象是类的实例,它具有类定义的属性和行为。通过实例化类,可以创建一个具体的对象。

  3. 封装(Encapsulation):封装是一种将数据和方法封装在类中,以保护数据的安全性和完整性的机制。通过封装,可以隐藏类的内部实现细节,只暴露必要的接口。

  4. 继承(Inheritance):继承是一种通过创建一个新类来继承现有类的属性和方法的机制。通过继承,可以实现代码的重用和扩展。

  5. 多态(Polymorphism):多态是一种允许不同类型的对象对同一个消息做出不同响应的机制。多态性可以通过继承和接口实现。

  6. 抽象类(Abstract Class):抽象类是一个不能被实例化的类,它只能作为其他类的基类。抽象类可以包含抽象方法和具体方法。

  7. 接口(Interface):接口是一种完全抽象的类型,它只包含方法、属性和事件的声明。类可以实现一个或多个接口,以实现多态性和代码的解耦。

  8. 构造函数(Constructor):构造函数是一种特殊的方法,用于创建和初始化类的实例。它在对象创建时自动调用。

  9. 成员访问修饰符(Access Modifiers):C#提供了一些访问修饰符,用于控制类成员的访问级别,如public、private、protected等。

面向对象编程的优势包括代码的重用性、可维护性、可扩展性和可测试性等。通过使用面向对象的思想和概念,可以更好地组织和管理代码,提高开发效率和代码质量。

简述WebServices

WebServices是一种web服务,是微软退出的跨平台分布式应用程序,使用SOAP协议通讯。

WebApi和WebServices的区别

webApi是http协议,WebServices是SOAP协议,

转发和跳转的区别

  1. 转发(Forwarding)指的是将请求或控制流从一个处理器转发到另一个处理器,而不改变请求的原始地址或URL。转发通常在服务器端内部进行,客户端不会察觉到请求的转发。在转发过程中,请求的处理会在服务器内部交给另一个处理器或页面来完成。
  2. 跳转(Redirecting)指的是将请求或控制流从一个处理器转移到另一个处理器,并且会改变请求的地址或URL。跳转通常在客户端发生,服务器会向客户端发送一个特殊的响应,告诉客户端去请求新的地址或URL。客户端会重新发送一个新的请求到新的地址,从而完成跳转。
  3. 转发是一次请求,跳转是二次请求。

进程和线程的区别?

答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个

进程可以有多个线程,这些线程共享这个进程的资源。

在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?

  1. using 引入名称空间或者使用非托管资源
  2. new 新建实例或者隐藏父类方法

用sealed修饰的类有什么特点?

答:密封,不能继承。

HashMap和Hashtable的区别

Hashtable是线程安全的,而HashMap是非线程安全的。在多线程环境下,如果需要保证线程安全性,可以使用Hashtable。如果不需要考虑线程安全性,并且希望获得更好的性能,可以使用HashMap。

ado.net的内置5大对象有哪些?分别作用是什么?

  1. Connection(连接对象):Connection对象用于建立与数据库的连接。它提供了连接字符串、打开和关闭连接的方法,以及事务的支持。通过Connection对象,可以与数据库建立通信通道。
  2. Command(命令对象):Command对象用于执行SQL语句或存储过程。它提供了执行查询、插入、更新和删除等操作的方法。Command对象可以通过Connection对象创建,并且可以指定要执行的SQL语句或存储过程的名称。
  3. DataReader(数据读取器):DataReader对象用于从数据库中读取数据。它提供了逐行读取数据的能力,可以通过执行Command对象的ExecuteReader方法来获取一个DataReader对象。DataReader对象是只进只读的,它不支持数据的修改。
  4. DataAdapter(数据适配器):DataAdapter对象用于在数据源和DataSet之间进行数据的填充和更新。它可以执行查询并将结果填充到DataSet中,也可以将DataSet中的数据更新回数据源。DataAdapter对象通常与Command对象一起使用。
  5. DataSet(数据集):DataSet对象是一个内存中的数据缓存,用于存储和操作数据。它可以包含多个DataTable对象,每个DataTable对象代表一个数据表。DataSet提供了对数据的增删改查等操作,可以在离线状态下进行数据的处理。

MVC框架中,ActionResult,JsonResult,ContentResult哪个可以return view()?

ActionResult

各种连接查询

  1. NATURAL JOIN(自然连接):在SQL中,自然连接是通过使用相同列名进行连接的。例如,假设有两个表A和B,它们有一个相同的列名"ID",可以使用以下语句进行自然连接:
SELECT * FROM A NATURAL JOIN B;
  1. CROSS JOIN(创建笛卡尔积):在SQL中,可以使用CROSS JOIN来创建两个表的笛卡尔积。例如,假设有两个表A和B,可以使用以下语句进行交叉连接:
SELECT * FROM A CROSS JOIN B;
  1. INNER JOIN(内连接):在SQL中,内连接是通过使用连接条件来匹配两个表的行。例如,假设有两个表A和B,它们有一个相同的列名"ID",可以使用以下语句进行内连接:
SELECT * FROM A INNER JOIN B ON A.ID = B.ID;
  1. OUTER JOIN (外连接):在SQL中,外连接可以使用LEFT JOIN、RIGHT JOIN或FULL JOIN来实现。例如,假设有两个表A和B,可以使用以下语句进行左外连接:
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID;
  1. LEFT OUTER JOIN(左连接):在SQL中,左外连接可以使用LEFT JOIN来实现。例如,假设有两个表A和B,可以使用以下语句进行左外连接:
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID;
  1. RIGHT OUTER JOIN(右连接):在SQL中,右外连接可以使用RIGHT JOIN来实现。例如,假设有两个表A和B,可以使用以下语句进行右外连接:
SELECT * FROM A RIGHT JOIN B ON A.ID = B.ID;
  1. FULL OUTER JOIN(全连接):在SQL中,全外连接可以使用FULL JOIN来实现。例如,假设有两个表A和B,可以使用以下语句进行全外连接:
SELECT * FROM A FULL JOIN B ON A.ID = B.ID;

这些示例是使用SQL语言进行的简单实现。在实际应用中,具体的实现可能会因数据库系统的不同而有所差异。此外,还可以使用其他编程语言和技术来实现这些连接操作,例如使用编程语言中的集合操作或ORM框架。

Mysql视图

视图,虚拟表,从一个表或多个表中查询出来的表,作用和真实表一样,包含一系列带有行和列的数据。视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记录,视图可以使用户操作方便,并保障数据库系统安全。

语法:CREATE VIEW 视图名 AS 查询数据源表语句;

存储过程创建

存储过程(Stored Procedure)是预编译的SQL语句集合,可以在数据库中创建和保存。存储过程可以接受参数,并且可以在数据库中被调用和执行,提供了一种封装和复用数据库逻辑的方式。

procedure(pro shei jio)

CREATE PROCEDURE [dbo].[MyStoredProcedure]
@Param1 INT,
@Param2 VARCHAR(50)
AS
BEGIN
    -- 存储过程的逻辑代码
    -- 可以包含SQL语句、流程控制语句等
    -- 使用参数时,可以通过@Param1、@Param2等引用参数值
    -- ...
END

ASP.NET Core和ASP.NET MVC的区别

  1. 跨平台支持:ASP.NET Core是一个跨平台的开发框架,可以在Windows、Linux和macOS等多个操作系统上运行。而ASP.NET MVC则是建立在传统的.NET Framework上,主要运行在Windows操作系统上。
  2. 开发模型:ASP.NET Core采用了新的开发模型,即面向中间件的管道模型。它将请求处理流程划分为多个中间件组件,可以根据需要灵活地配置和组合中间件。而ASP.NET MVC则是基于控制器和视图的模式,通过控制器处理请求并生成视图来呈现结果。
  3. 性能和轻量级:ASP.NET Core具有更好的性能和更低的资源消耗,因为它是经过精简和优化的新一代框架。它采用了新的Kestrel服务器和高性能的ASP.NET Core运行时。相比之下,ASP.NET MVC是建立在.NET Framework上的,可能会有一些额外的开销。
  4. 依赖注入:ASP.NET Core内置了依赖注入容器,使得在应用程序中实现依赖注入变得更加容易。而ASP.NET MVC需要使用第三方库或手动实现依赖注入。
  5. 配置和部署:ASP.NET Core使用了新的配置系统,可以更方便地配置应用程序的设置。此外,ASP.NET Core的部署也更加灵活,可以通过自包含的部署方式将应用程序和其依赖项一起打包。
  6. 开放源代码:ASP.NET Core是开源的,托管在GitHub上,可以参与社区贡献和获取最新的更新。而ASP.NET MVC虽然也有一些开源组件,但整体上是微软的闭源框架。

总的来说,ASP.NET Core是一个跨平台、高性能、轻量级的Web开发框架,具有更好的可扩展性和灵活性。它采用了新的开发模型和技术,适用于构建现代化的Web应用程序。而ASP.NET MVC则是建立在.NET Framework上的成熟框架,适用于传统的Windows平台上的Web开发。选择使用哪个框架取决于具体的需求和项目要求。

ASP.NET MVC Action

在ASP.NET MVC中,Action是控制器中的一个方法,用于处理来自客户端的请求并生成响应。Action方法根据请求的HTTP动词和路由规则来确定执行的逻辑,Action方法可以返回各种类型的结果,如View、PartialView、Json、File等,Action是ASP.NET MVC框架中的核心概念之一,用于处理请求和生成响应。通过编写适当的Action方法,可以实现业务逻辑的处理、数据的获取和操作、视图的渲染等功能。

TCP三次握手和四次挥手

TCP 的三次握手和四次挥手是建立和关闭 TCP 连接时使用的一组步骤。下面是对三次握手和四次挥手的简要说明:

三次握手(Three-Way Handshake):

  1. 第一步(SYN):客户端向服务器发送一个带有 SYN(同步)标志的数据包,表示客户端请求建立连接。此时客户端进入 SYN_SENT 状态。

  2. 第二步(SYN-ACK):服务器收到客户端的请求后,向客户端发送一个带有 SYN 和 ACK(确认)标志的数据包,表示服务器接受连接请求,并向客户端发送确认信息。此时服务器进入 SYN_RCVD 状态。

  3. 第三步(ACK):客户端收到服务器的响应后,向服务器发送一个带有 ACK 标志的数据包,表示客户端接受服务器的确认信息。此时客户端和服务器都进入 ESTABLISHED(已建立)状态,连接正式建立。

四次挥手(Four-Way Handshake):

  1. 第一步(FIN):当客户端决定关闭连接时,向服务器发送一个带有 FIN(结束)标志的数据包,表示客户端不再发送数据。此时客户端进入 FIN_WAIT_1 状态。

  2. 第二步(ACK):服务器收到客户端的结束请求后,向客户端发送一个带有 ACK 标志的数据包,表示服务器接受关闭请求。此时服务器进入 CLOSE_WAIT 状态。

  3. 第三步(FIN):当服务器也决定关闭连接时,向客户端发送一个带有 FIN 标志的数据包,表示服务器不再发送数据。此时服务器进入 LAST_ACK 状态。

  4. 第四步(ACK):客户端收到服务器的结束请求后,向服务器发送一个带有 ACK 标志的数据包,表示客户端接受关闭请求。此时客户端进入 TIME_WAIT 状态,并等待一段时间后关闭连接,服务器在接收到客户端的确认后关闭连接。

通过三次握手,客户端和服务器建立了可靠的连接,可以进行数据传输。通过四次挥手,双方完成了数据传输并关闭了连接。

这些步骤确保了可靠的连接的建立和关闭,以及数据传输的完整性和有序性。

希望这个简要的说明对您有所帮助!如果您有任何其他问题,请随时提问。

缓存穿透问题

给定一个数据库没有的字段id,缓存中查不出来会去查数据库。如果有恶意用户则会增大数据库压力。

缓存雪崩

缓存项集中过期引起缓存雪崩。

缓存击穿

缓存击穿是指在使用缓存的系统中,当某个热点数据失效或者被清除时,同时有大量的请求涌入,导致请求直接访问数据库或其他存储系统,从而造成系统性能下降甚至崩溃的情况。

总结

对于有高学历的我觉得找工作简单很多,有很多大公司可以考虑。然后学历不是很高,技术又还行的,可以投递中大型和中小型公司的开发岗位,公司建议找100人以上的公司,然后自己去用软件查查公司有没有纠纷,参保人数是多少,注册时间是多少。擦亮眼睛,不要进骗子公司了。

在找工作的时候不要忘记背面试题了,大部分面试官一般会问数据库知识,岗位技术方面的知识,对于实习的工作,问的问题还是比较简单的。然后在面试的时候有不会的面试题,自己先记着,可以做笔记,面完之后继续背。

然后投递简历的时候不要看到招聘信息上写的1年经验就不投了,有时候公司也会招优秀的应届生,我的建议是海投。