C#/.Net面试题及答案

1. 对ASP.NET Core kestrel的理解

     ASP.NET Core是一个跨平台的开源框架,用于构建现代的,基于云的,互联网连接的应用程序。ASP.NET Core Kestrel是一个跨平台的、开源的、高性能的、轻量级的Web服务器,专门用于托管ASP.NET Core应用程序。它完全在.NET上构建,且可以运行在Windows/Linux/macOS,Kestrel是ASP.NET Core应用的默认服务器。

     Kestrel有以下几个重要特点:

     1)跨平台: Kestrel支持跨平台,因此可以运行在任何支持.NET Core的平台上。

     2)高性能:被设计为高性能的服务器,它利用了异步I/O和非阻塞网络操作,这有助于提高吞吐量和响应性。它使用异步I/O操作来减少线程使用并提高吞吐量

     3)轻量级,Kestrel是一个轻量级的服务器,它不需要额外的软件依赖,如传统的Web服务器(IIS/Apache),专注于处理HTTP请求和响应,不包含完整的Web服务器功能集(如IIS/Apache/Nginx/Tomcat等所具有的功能),Kestrel可以通过代理服务器弥补其不足的部分。

     4)安全性:Kestrel提供了许多安全性功能,如TLS/SSL支持、HTTP/2支持和请求大小限制。还可以配置Kestrel以使用HTTP严格传输安全(HSTS)和其他安全相关的HTTP头。

     5)中间件:Kestrel与ASP.NET Core中间件管道集成,这意味着你可以在Kestrel级别添加自定义中间件,例如用于请求日志记录、认证等。

     6)容器支持:Kestrel轻量级和跨平台特性非常适合在容器化环境中运行,如Docker,这使得ASP..NET Core应用程序可以轻松地部署到云平台。

     7)调试和日志记录:Kestrel提供了调试和日志记录功能,这有助于开发人员诊断问题。

     8)配置:Kestrel可通过ASP.NET Core的Startup.cs文件或appsettings.json配置文件进行配置,包括设置监听的端口、启用HTTPS、限制请求大小等。

     9)启动速度快

2. .NET Core 支持哪些操作系统,它的跨平台特性是如何实现的?

  1. 统一的运行时(CoreCLR): CoreCLR 是 .NET Core 的运行时,它是跨平台的,可以在 Windows、Linux 和 macOS 上运行。CoreCLR 负责执行中间语言(IL)代码,管理内存,以及提供垃圾回收等服务。

  2. 跨平台类库.NET Core 提供了一套丰富的跨平台类库(BCL),这些库在不同操作系统上提供一致的 API,使得开发者可以编写一次代码,然后在多个平台上运行。

  3. 开源协作: .NET Core 是在 GitHub 上开源的,允许全球开发者参与贡献,确保了 .NET 的跨平台兼容性和持续改进。

  4. 跨平台开发工具: .NET Core 提供了跨平台的命令行界面(CLI),使得开发者可以在不同操作系统上使用相同的工具和命令来构建、测试和发布应用程序。

  5. 容器化支持: .NET Core 应用程序可以容器化,利用 Docker 等容器技术在不同环境中提供一致的运行时环境,从而实现跨平台部署。

  6. 跨平台项目管理: .NET Core 项目使用 .csproj 文件格式,这种格式支持跨平台的项目配置,使得项目文件在不同操作系统上保持一致。

  7. 依赖于操作系统的功能抽象: 对于特定操作系统的功能,.NET Core 提供了抽象层,允许开发者编写平台无关的代码,同时在需要时可以通过平台特定的 API 访问操作系统服务。

  8. 跨平台测试: .NET Core 支持跨平台测试,可以使用相同的测试框架(如 xUnit 或 NUnit)在不同操作系统上运行测试用例。

  9. 跨平台数据库访问: .NET Core 提供了 Entity Framework Core 等 ORM 工具,支持跨平台数据库访问,使得开发者可以使用相同的代码在不同数据库系统上工作。

  10. 跨平台 UI 框架: .NET Core 可以与跨平台的 UI 框架(如 Xamarin.Forms 或 MAUI)集成,提供跨平台的桌面和移动应用开发能力。

  11. .NET 5 和 .NET 6+: 从 .NET 5 开始,微软推出了统一的 .NET 平台,它合并了 .NET Core 和 .NET Framework 的功能,进一步简化了跨平台开发。

3. 有哪些机制避免数据脏读和脏写

     在.Net中,服务框架提供了多种机制来避免数据脏读和脏写:

       1)事务隔离级别

             通过设置适当的事务隔离级别,可以管理并发事务的可见性和一致性。ADO.NET Core支持多种事务隔离级别,包括Read Uncommitted/Read Committed/Repeatable Read/Serializable,这些级别有助于平衡性能和数据准确性/完整性。

        2)乐观锁

              乐观锁通常通过版本号或时间戳来实现。在更新数据前,检查版本号是否发生变化,如果发生变化则放弃更新或提示用户。这种方式适用于冲突较少的场景,可以减少锁的开销,提供并发性能。

        3)悲观锁

              悲观锁假设冲突经常发生,在数据访问前就锁定数据。Entity Framework Core通过SQL查询实现悲观锁,例如使用For Update语句锁定数据行,防止其他事物修改。

        4)分布式锁

             在分布式系统中,使用分布式锁来保证跨多个节点的操作原子性。DistributedLock是一个.Net库,提供基于不同底层技术的分布式互斥锁、读写锁和信号量。

        5)消息队列

             使用消息队列来确保操作的顺序执行,减少并发冲突。消息队列可以帮助实现最终一致性,尤其是在分布式系统中。

        6)缓存策略

             如果使用缓存,确保缓存数据的一致性,比如通过缓存失效策略或缓存更新机制。

        7)数据验证

             在数据写入前进行严格的验证,确保数据的完整性和一致性。

4. .NET 如何选型ORM框架?

     1)Entity Framework Core:

           优势:EF Core是微软官方的ORM框架,与.NET Core深度集成,支持Code First和Db First开发模式,它提供了强大的LINQ支持和数据库迁移功能,适合快速开发。

           劣势:与Dapper相比,性能略低,尤其是在处理复杂查询时。

            应用场景:适合需要快速开发和原型设计的项目,以及需要和ASP.NET Core紧密集成的应用程序。

     2)Dapper:

           优势:以其轻量级和高性能著称,接近原生SQL执行的效率。它提供了灵活的SQL执行和映射能力。它专注于性能和简单性,它不提供像EF Core那样的高级特性

            劣势:需要手动编写SQL语句,可能增加出错风险,且学习曲线较陡峭。

            应用场景:适合对性能要求极高的项目,以及需要精细控制SQL语句的场景。适合不需要太多抽象层的应用。

      3)SqlSugar:

            优势:SqlSugar是一个轻量级、高效、灵活的.NET ORM框架,支持多种数据库,提供链式操作和表达式支持,以及丰富的扩展功能。

            劣势:社区支持相对较弱,可能在遇到问题时获取帮助的渠道较少。

             应用场景:适合需要跨数据库开发且对性能有一定要求的项目。

       4)FreeSQL:

             优势:FreeSql提供丰富的功能和良好的性能,支持多种数据库,且易于使用和扩展。

             劣势:相对于EF Core和Dapper,社区和文档资源较少。

              应用场景:适合需要高性能和跨数据库支持的项目,尤其是希望保持一定开发效率的项目。

       5)NHibernate:

             优势:是一个.NET平台上成熟的ORM之一,支持多种数据库、提供丰富的功能包括缓存、事务管理,延迟加载和集合映射等、提供强大的查询能力支持HQL和Criteria API能够构建复杂查询、社区支持。

             劣势:学习曲线较高,配置较为复杂,需要较多的配置文件或代码来设置映射关系,由于其丰富的功能,有时会带来一定的性能开销。

             应用场景:适合需要处理复杂业务逻辑的企业级应用,需要支持多种不同类型的数据库类型、需要复杂的查询、事务管理和缓存机制等项目。

       在选择ORM框架时,应该根据项目的具体需求,团队的技术栈和经验、以及对性能和功能的要求来做出决策。如果项目需要快速开发和良好的开发体验,EF Core可能是一个好的选择;如果项目对性能要求极高,Dapper可能更合适;如果需要一个轻量级和支持多种数据库的ORM,SqlSugar可能是一个不错的选择。

 5. Entity Framework和Entity Framework Core有什么区别
      Entity Framework(EF)和Entity Framework Core(EF Core)是微软开发的两个对象关系映射框架,有一些关键区别,如下:
       1)架构和设计:
            EF:EF6及以前的版本是一个传统的ORM框架, 它提供了丰富的功能,但主要设计为.NET Framework的一部分。
            EF Core:是一个跨平台的、轻量级的ORM框架,它是.NET Core的一部分,它被设计为可扩展和模块化的。
       2)性能:
             EF Core在性能方面进行了优化,特别是在查询和变更跟踪方面,相比于EF6有显著提升。
       3)功能集:
             EF6提供了一些EF Core当前未支持的特性,例如复杂的映射和配置选项。
             EF Core专注于提供核心ORM功能集,并且随着版本的更新,正在逐渐增加更多的高级特性。
       4)跨平台支持:
             EF6主要支持Windows平台。
             EF Core支持跨平台,可以在Windows/Linux/macOS上运行。
       5)开发和维护:
             EF6的开发已经进入维护模式,不在追加新特性,只进行必要的修复和更新。
              EF Core是微软当前积极开发和维护的ORM框架,会定期发布新版本和新特性。
       6)依赖注入和IoC:
             EF Core与依赖注入和IoC容器的集成更加自然,更适合现代的软件开发实践。
       7)数据库提供程序:
             EF6和EF Core都支持多种数据库提供程序,但EF Core社区提供了更多的第三方数据库提供程序。
        8)模型创建模式:
             EF6支持Code First、Db First和Model First开发模式
             EF Core主要支持Code First和Db First,不再支持Model First
        9)迁移和版本控制:
             EF Core提供了更加灵活的迁移系统,允许开发者更好地控制数据库版本和变更。
        10)社区和支持:
                EF6拥有成熟的社区和大量的资源,但由于开发重点转向.NET Core,新的开发和创新主要集中在EF Core上。
6. C# Queryable和Enumberable的区别
     在C#中,Queryable和Enumerable是两个核心接口,它们都用于处理数据集合,提供了强大的数据查询功能,但它们之间存在一些关键区别:
     1)类型和命名空间:
           Queryable<T>是一个接口,它继承自IEnumerable<T>,并且位于System.Linq命名空间。它提供了一组用于查询的数据操作方法,这些方法可以被翻译成SQL语句,以便在数据库中执行。
           IEnumerable<T>是一个接口,位于System.Collections.Generic命名空间中。它定义了数据集合的基本枚举操作,通常用于在内存中的数据集合。
      2)操作的数据源:
           Queryable通常与支持的Linq的数据库(如EF/EF Core)一起使用,它允许将查询操作翻译成数据库查询语言,如SQL。
            Enumberable通常用于在内存中的数据集合,如列表或数组等,它直接在本地执行查询操作。
      3)延迟执行和立即执行:
            Queryable通常采用延迟执行(lazy evaluation),这意味着查询表达式在构建时不会立即执行,而是需要结果时才执行。这对于与数据库交互尤为有用,,因为它允许查询优化和批量处理。
             Enumerable通常采用立即执行(Eager evaluation),这意味着方法调用会立即返回结果。这对于在内存中的数据集合操作非常有用,因为它们需要立即执行获取数据。
      4)扩展方法:
            Queryable提供了一系列扩展方法,如Where/Join/Select/OrderBy等,这些方法可以被翻译成数据库查询。
            Enumerable也提供了类似的扩展方法,但它们通常在本地执行,不涉及数据库查询。
      5)扩展方法:
         当需要对数据库执行查询并且希望利用数据库的查询优化时,使用Queryable。
            当需要对内存中的数据集合执行查询并且希望立即获取结果时,使用Enumerable。
       6)性能:
             Queryable可以利用数据库的查询优化和索引,对于大型数据集可能提供更好的性能。
             Enumerable在处理内存中数据集合时可能更快,因为避免网络延迟和数据库查询的开销。
       7)跨平台:
             Queryable通常与特定的数据库提供程序一起使用,可能不支持跨平台。
             Enumberable是.NET的一部分,支持跨平台。
7. ASP.NET Core中间件执行原理
    ASP.NET Core中间件执行原理涉及到请求处理管理的构建和执行,执行原理的详细步骤如下:
     1)请求处理管道:
           ASP.NET Core的请求处理管道是由一系列中间件组成的,每个中间件可以处理HTTP请求和响应。
           管道是在应用程序启动时构建的,通常在Startup.cs文件的Configure方法中定义。
     2)中间件的注册:
           中间件通过调用UserMiddleware<TMiddleware>或Run、Map等扩展方法注册到请求处理管理中。
            注册的顺序决定了中间件的执行顺序,即请求进入时的顺序和响应返回时的顺序。
      3)请求委托:
            每个中间件都定义了一个请求委托,它接收一个HttpContext对象和一个请求委托RequestDelegate,代表管道中的下一个中间件。
            中间件可以决定是否调用RequestDelegate来将请求传递给管道中的下一个中间件。
      4)执行流程:
            当一个Http请求到达应用程序时,它首先进入请求处理管道的第一个中间件。
            如果中间件决定继续处理请求,它会调用RequestDelegate,将请求传递给下一个中间件。
             如果中间件决定短路处理,(例如,直接返回响应而不继续处理),它将不调用RequestDelegate,请求处理流程在此结束。
       5)响应流程:
             当响应开始返回时,它会按注册顺序的相反顺序通过中间件。
             每个中间件都有机会修改出站响应,例如添加HTTP头或执行其他最终处理。
       6)异步执行:
             中间件通常异步执行,这意味着它们不会阻塞调用线程,直到整个处理请求完成。
              这有助于提高应用程序的吞吐量和性能。
       7)错误处理:
             可以在请求处理管道中的任何位置添加错误处理中间件,它能够捕获和处理在管道中后续中间件发生的异常。
       8)自定义中间件:
            开发者可以创建自定义中间件执行特定的任务,例如身份验证、日志记录、请求限制等。
            自定义中间件通过实现一个接受HttpContext对象和一个RequestDelegate方法,返回一个Task对象。
       9)终端中间件:
             在管道的末尾,通常会有一个终端中间件,它会负责处理最终的请求并生成响应,例如一个ASP.NET Core MVC中间件或一个简单的Http响应中间件。
8. .NET Core比.NET Framework有什么区别和优势,运行快具体体现在哪里?
     主要区别:
       1)跨平台支持:
             .NET Framework仅支持Windows平台,适合开发Windows应用程序。
             .NET Core支持跨平台,可以运行在Windows/Linux/macOS上,适合开发跨平台的应用程序。
       2)开源:
             .NET Framework大部分代码不是开源的,尽管后来微软也公开了.NET Framework的一些源代码,但不接受外部贡献。
             .NET Core是一个开源的框架,托管在GitHub上,允许开发者参与贡献和改进
       3)模块化设计:
             .NET Framework是一个单一的庞大的框架,包含所有功能
             .NET Core采用模块化设计,开发者可以选择所需的组件,从而减少应用程序的体积。
        4)性能:
              .NET Framework在性能上相对较低,尤其是在处理高并发和复杂查询时。
              .NET Core经过多次优化,通常在性能上优于.NET Framework,尤其是在启动时间和内存使用方面。
        5)API和功能集:
              .NET Framework提供了丰富的API,但随着时间的推移,某些功能可能会变得过时。
              .NET Core提供了更现代的API和功能集,并且随着版本更新不断增加新特性。
     性能提升具体体现:
         1)优化的运行时:
               .NET Core使用了优化的运行时 CoreCLR,在执行效率和内存管理方面进行了改进。
          2)改进的JIT编译:
                .NET Core的JIT编译器经过优化,能够生成更高效的机器代码,从而提高应用程序的执行速度。
                .NET Core引入了JIT(Just In Time)编译器的新版本RyuJIT,提高了代码的执行效率。也支持AOT(Ahead Of Time)编译,这可以进一步加速启动时间并减少运行时的内存占用。
           3)更好的内存管理:
                .NET Core的垃圾回收机制经过改进,能够更有效地管理内存,减少内存占用和垃圾回收的停顿时间。
           4)支持HTTP/2和其他现代协议:
                 ASP.NET Core(基于.NET Core),支持HTTP/2,这提高了网络请求的性能,特别是在处理多个并发请求时。
            5)容器化支持:
                  .NET Core的设计非常适合容器化部署,(如Docker),这使得应用程序的启动时间更快,资源利用更高效。
            6)更少的开销:
                   由于模块化设计,.NET Core应用程序只加载所需组件,减少启动时的开销。
             7)跨平台性能优化:
                    .NET Core在不同的操作系统上进行了优化,确保在各种环境中都能提供良好的性能。
         运行快的具体体现:
    1.启动时间:.NET Core核心库小,加载所需时间短;
    2.内存使用:.NET Core通过优化垃圾回收机制和减少不必要的内存分配来降低内存使用率
         3.并发处理:.NET Core对异步编程模式的支持更为强大,,可以更好的利用多核处理器和非阻塞I/O操作,从而提高并发请求的处理能力。
               4.垃圾回收:.NET Core使用新的垃圾回收机制,减少垃圾回收的停顿时间,这对实时性和响应性要求高的应用尤为重要。
 
    
    
 
 
posted on 2024-11-01 16:20  追求高级技术  阅读(44)  评论(0编辑  收藏  举报