.net软件工程师面试题及答案_第1页
.net软件工程师面试题及答案_第2页
.net软件工程师面试题及答案_第3页
.net软件工程师面试题及答案_第4页
.net软件工程师面试题及答案_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.net软件工程师面试题及答案.NET软件工程师面试题及答案一、选择题(每题2分,共40分)1.在C中,以下哪个关键字用于定义一个类?A.structB.classC.interfaceD.enum2.以下哪个不是C的值类型?A.intB.boolC.stringD.char3.在.NET中,以下哪个命名空间包含了基本的输入输出功能?A.System.IOB.System.TextC.System.CollectionsD.System.Net4.关于C中的委托,以下说法正确的是?A.委托是一种类型安全的函数指针B.委托不能多播C.委托必须与它所引用的方法具有相同的返回类型D.以上都正确5.在ASP.NETCore中,中间件(Middleware)的执行顺序是?A.从请求处理管道的最开始到最后B.从请求处理管道的最后到最开始C.随机执行D.并行执行6.以下哪个特性是C9.0引入的新特性?A.recordsB.async/awaitC.LINQD.var关键字7.在EntityFrameworkCore中,以下哪个方法用于执行原始SQL查询?A.FromSqlB.ToSqlC.ExecuteSqlD.QuerySql8.关于.NET的垃圾回收机制,以下说法错误的是?A.垃圾回收器会自动管理内存B.垃圾回收器可以立即回收所有不再使用的对象C.可以使用GC.Collect()手动触发垃圾回收D.垃圾回收器会压缩堆内存以减少碎片9.在C中,以下哪个关键字用于处理可能为null的引用类型?A.nullableB.nullC.?D.以上都是10.在.NET中,以下哪个接口用于实现可枚举模式?A.IEnumerableB.IEnumeratorC.IComparableD.ICloneable11.关于ASP.NETMVC的控制器(Controller),以下说法正确的是?A.控制器直接处理HTTP请求B.控制器负责渲染视图C.控制器通常包含业务逻辑D.控制器不能返回JSON数据12.在C中,以下哪个特性用于标记方法为异步方法?A.[Async]B.[AsyncMethod]C.asyncD.[MethodImpl(MethodImplOptions.Asynchronous)]13.在.NETCore中,以下哪个配置提供程序用于从appsettings.json文件读取配置?A.JSONConfigurationProviderB.FileConfigurationProviderC.JsonConfigurationProviderD.AppSettingsConfigurationProvider14.关于C中的事件(Event),以下说法正确的是?A.事件是一种特殊的委托B.事件可以直接调用C.事件不能有多个订阅者D.事件只能在类内部触发15.在EntityFrameworkCore中,以下哪个方法用于保存更改到数据库?A.SaveChanges()B.Commit()C.Update()D.Save()16.在C中,以下哪个关键字用于定义泛型类型参数?A.typeB.genericC.TD.<T>17.关于.NET的依赖注入,以下说法正确的是?A.依赖注入是一种设计模式B.依赖注入会增加代码的耦合度C.依赖注入只能在ASP.NETCore中使用D.依赖注入不需要接口18.在C中,以下哪个特性用于标记方法为不安全代码?A.[Unsafe]B.unsafeC.[SecurityCritical]D.[SuppressUnmanagedCodeSecurity]19.在ASP.NETCore中,以下哪个方法用于将服务添加到依赖注入容器?A.AddServiceB.AddSingletonC.RegisterServiceD.AddDependency20.关于C中的结构体(struct),以下说法正确的是?A.结构体是引用类型B.结构体可以有默认构造函数C.结构体不能继承其他类D.结构体可以实现接口二、填空题(每空2分,共30分)1.在C中,使用____关键字可以捕获异常并执行清理代码。2..NETCore的配置系统提供了____配置提供程序,用于从命令行参数读取配置。3.在EntityFrameworkCore中,使用____属性可以标记实体类与数据库表的对应关系。4.C中的____关键字用于定义一个只读属性。5.在ASP.NETCore中,____方法用于配置HTTP请求管道。6.C中的____运算符用于检查一个对象是否是特定类型或派生自特定类型。7.在.NET中,____命名空间包含了用于处理日期和时间的类。8.C中的____关键字用于定义一个泛型方法。9.在ASP.NETCore中,____中间件用于处理静态文件请求。10.C中的____关键字用于定义一个部分方法(partialmethod)。11.在EntityFrameworkCore中,____方法用于执行存储过程。12.C中的____特性用于标记方法为异步方法。13.在.NETCore中,____命名空间包含了用于日志记录的类。14.C中的____关键字用于定义一个可空值类型。15.在ASP.NETCore中,____属性用于标记控制器或操作方法,指定HTTP谓词。三、判断题(每题2分,共20分)1.在C中,string是值类型。()2.在.NET中,所有对象都继承自Object类。()3.在C中,using语句只能用于命名空间的导入。()4.在ASP.NETCore中,中间件可以按任意顺序添加到管道中。()5.在C中,接口可以包含字段。()6.在.NET中,垃圾回收器会立即回收所有不再使用的对象。()7.在C中,out参数必须在方法中被赋值。()8.在EntityFrameworkCore中,DbContext是线程安全的。()9.在C中,构造函数可以有返回类型。()10.在ASP.NETCore中,控制器必须继承自Controller基类。()四、简答题(每题10分,共50分)1.简述C中值类型和引用类型的区别,并举例说明。2.解释在.NET中依赖注入的基本概念和优势。3.描述ASP.NETCore中的中间件管道是如何工作的,并举例说明如何添加自定义中间件。4.解释C中的LINQ(语言集成查询)及其工作原理。5.简述EntityFrameworkCore中的CodeFirst方法,并说明其优势。五、编程题(共60分)1.(20分)编写一个C控制台应用程序,实现一个简单的图书管理系统。要求:-创建一个Book类,包含Id、Title、Author和PublicationYear属性-创建一个BookManager类,实现添加图书、删除图书、查找图书和显示所有图书的功能-使用LINQ实现按作者查找图书和按出版年份查找图书的功能2.(20分)编写一个ASP.NETCoreWebAPI,实现一个简单的用户管理功能。要求:-创建一个User类,包含Id、Name、Email和CreatedDate属性-创建一个UserController,实现获取所有用户、根据ID获取用户、添加用户和删除用户的功能-使用EntityFrameworkCore进行数据访问-实现基本的输入验证3.(20分)编写一个C方法,实现一个简单的缓存系统。要求:-使用字典作为底层存储-实现添加、获取和删除缓存项的方法-实现缓存过期功能-实现线程安全答案:一、选择题1.答案:B解释:在C中,class关键字用于定义一个类。struct用于定义结构体,interface用于定义接口,enum用于定义枚举类型。2.答案:C解释:在C中,int、bool和char都是值类型,而string是引用类型。值类型直接存储数据,而引用类型存储对数据的引用。3.答案:A解释:System.IO命名空间包含了基本的输入输出功能,如文件操作、流操作等。System.Text用于处理文本,System.Collections用于集合类,System.Net用于网络功能。4.答案:A解释:委托是一种类型安全的函数指针,可以引用具有特定签名的方法。委托可以多播,即可以引用多个方法。委托必须与它所引用的方法具有相同的参数列表和返回类型。5.答案:A解释:在ASP.NETCore中,中间件按照添加到管道的顺序执行,从请求处理管道的最开始到最后。每个中间件可以选择将请求传递给下一个中间件,或者直接返回响应。6.答案:A解释:records是C9.0引入的新特性,用于创建不可变数据类型。async/await是在C5.0引入的,LINQ是在C3.0引入的,var关键字是在C3.0引入的。7.答案:A解释:在EntityFrameworkCore中,FromSql方法用于执行原始SQL查询。ToSql、ExecuteSql和QuerySql不是EntityFrameworkCore中的方法。8.答案:B解释:垃圾回收器会自动管理内存,但不会立即回收所有不再使用的对象。垃圾回收器会在适当的时候运行,而不是立即运行。可以使用GC.Collect()手动触发垃圾回收。垃圾回收器会压缩堆内存以减少碎片。9.答案:D解释:在C8.0及更高版本中,可以使用nullable引用类型特性来处理可能为null的引用类型。可以使用?修饰符来声明可空引用类型,也可以使用nullable关键字。10.答案:A解释:IEnumerable接口用于实现可枚举模式,允许对象被foreach循环遍历。IEnumerator接口用于迭代器,IComparable接口用于定义类型的比较方法,ICloneable接口用于定义对象的克隆方法。11.答案:C解释:在ASP.NETMVC中,控制器负责处理HTTP请求并协调模型和视图。控制器通常包含业务逻辑,但不直接渲染视图。控制器可以返回各种类型的ActionResult,包括ViewResult和JsonResult。12.答案:C解释:在C中,async关键字用于标记方法为异步方法。Async和AsyncMethod不是C中的关键字或特性。MethodImpl(MethodImplOptions.Asynchronous)用于指定方法的调用约定,而不是标记方法为异步方法。13.答案:C解释:在.NETCore中,JsonConfigurationProvider用于从appsettings.json文件读取配置。JSONConfigurationProvider不是.NETCore中的类。FileConfigurationProvider用于从文件读取配置,但不特定于JSON格式。AppSettingsConfigurationProvider也不是.NETCore中的类。14.答案:A解释:事件是一种特殊的委托,只能在类内部触发,并且不能直接调用。事件可以有多个订阅者,使用+=运算符添加订阅者,使用-=运算符移除订阅者。15.答案:A解释:在EntityFrameworkCore中,SaveChanges()方法用于将更改保存到数据库。Commit()、Update()和Save()不是EntityFrameworkCore中的方法。16.答案:C解释:在C中,T关键字用于定义泛型类型参数。type和generic不是C中的关键字。<T>用于声明泛型类型或方法,但T是其中的类型参数。17.答案:A解释:依赖注入是一种设计模式,用于实现控制反转(IoC),减少组件之间的耦合度。依赖注入可以在各种.NET应用程序中使用,不仅限于ASP.NETCore。依赖注入通常需要接口来实现抽象。18.答案:B解释:在C中,unsafe关键字用于标记方法为不安全代码,允许使用指针操作。[Unsafe]和[SecurityCritical]不是C中的特性。[SuppressUnmanagedCodeSecurity]用于抑制安全检查,但不标记方法为不安全代码。19.答案:B解释:在ASP.NETCore中,AddSingleton方法用于将服务添加到依赖注入容器作为单例服务。AddService和RegisterService不是ASP.NETCore中的方法。AddDependency也不是ASP.NETCore中的方法。20.答案:C解释:在C中,结构体是值类型,不是引用类型。结构体可以有默认构造函数,但不能显式定义无参数的构造函数。结构体不能继承其他类,但可以实现接口。二、填空题1.答案:using解释:在C中,using语句用于定义一个范围,在此范围末尾会自动调用对象的Dispose方法,通常用于释放资源,如文件、数据库连接等。2.答案:CommandLineConfigurationProvider解释:在.NETCore中,CommandLineConfigurationProvider是配置提供程序之一,用于从命令行参数读取配置。应用程序启动时,命令行参数会被自动解析并添加到配置系统中。3.答案:Table解释:在EntityFrameworkCore中,Table属性用于标记实体类与数据库表的对应关系。例如:[Table("Books")]表示该实体类对应数据库中的Books表。4.答案:get解释:在C中,get关键字用于定义一个只读属性。只读属性只有get访问器,没有set访问器,只能在构造函数中初始化。5.答案:Configure解释:在ASP.NETCore中,Configure方法用于配置HTTP请求管道。该方法通常在Startup类的Configure方法中调用,用于添加中间件到请求处理管道。6.答案:is解释:在C中,is运算符用于检查一个对象是否是特定类型或派生自特定类型。如果对象是指定类型或其派生类型的实例,则返回true,否则返回false。7.答案:System.DateTime解释:在.NET中,System.DateTime命名空间包含了用于处理日期和时间的类,如DateTime、TimeSpan、DateTimeOffset等。8.答案:where解释:在C中,where关键字用于定义泛型类型参数的约束。例如:publicclassMyClass<T>whereT:class表示T必须是引用类型。9.答案:UseStaticFiles解释:在ASP.NETCore中,UseStaticFiles中间件用于处理静态文件请求,如HTML、CSS、JavaScript、图片等。该中间件会将请求映射到wwwroot目录下的文件。10.答案:partial解释:在C中,partial关键字用于定义一个部分方法(partialmethod)。部分方法允许将方法的声明和定义分开在不同的部分类中,通常用于代码生成场景。11.答案:FromSqlRaw解释:在EntityFrameworkCore中,FromSqlRaw方法用于执行存储过程。例如:varresults=context.Products.FromSqlRaw("EXECGetProductById{0}",productId).ToList();12.答案:async解释:在C中,async关键字用于标记方法为异步方法。异步方法可以包含await表达式,用于等待异步操作完成。13.答案:Microsoft.Extensions.Logging解释:在.NETCore中,Microsoft.Extensions.Logging命名空间包含了用于日志记录的类,如ILogger、ILoggerFactory、ILoggerProvider等。14.答案:?解释:在C中,?修饰符用于定义一个可空值类型。例如:int?表示一个可空的整数类型,可以存储整数值或null。15.答案:HttpMethod解释:在ASP.NETCore中,HttpMethod属性(如[HttpGet]、[HttpPost]、[HttpPut]、[HttpDelete]等)用于标记控制器或操作方法,指定HTTP谓词。三、判断题1.答案:错误解释:在C中,string是引用类型,不是值类型。值类型包括int、bool、char、struct等,直接存储数据;引用类型包括class、string、array等,存储对数据的引用。2.答案:正确解释:在.NET中,所有类型最终都继承自Object类,包括值类型(通过装箱)和引用类型。Object类提供了基本的方法,如ToString()、Equals()、GetHashCode()等。3.答案:错误解释:在C中,using语句不仅可以用于命名空间的导入,还可以用于定义using语句块,用于自动释放资源。例如:using(varfile=newStreamReader("file.txt")){...}4.答案:错误解释:在ASP.NETCore中,中间件必须按照特定的顺序添加到管道中,因为中间件的执行顺序决定了请求的处理流程。错误的顺序可能导致中间件无法正常工作。5.答案:错误解释:在C中,接口不能包含字段,只能包含方法、属性、事件和索引器。接口定义了一组契约,实现接口的类必须提供这些契约的具体实现。6.答案:错误解释:在.NET中,垃圾回收器不会立即回收所有不再使用的对象。垃圾回收器会在适当的时候运行,根据内存压力和对象代数等因素决定何时回收。7.答案:正确解释:在C中,out参数必须在方法中被赋值,否则编译器会报错。out参数用于从方法中返回多个值,类似于ref参数,但out参数不需要在调用前初始化。8.答案:错误解释:在EntityFrameworkCore中,DbContext不是线程安全的。多个线程同时访问同一个DbContext实例可能导致数据不一致或异常。通常建议每个请求使用一个DbContext实例。9.答案:错误解释:在C中,构造函数不能有返回类型,包括void。构造函数用于初始化对象实例,没有返回值。10.答案:错误解释:在ASP.NETCore中,控制器不需要继承自Controller基类。控制器可以是任何公共类,只要它包含符合约定的公共方法即可。Controller基类提供了一些便利功能,但不是必需的。四、简答题1.答案:值类型和引用类型是C中的两种基本类型,它们在内存分配和使用方式上有显著区别:值类型:-直接存储数据值-在栈上分配内存-每个变量都有自己的数据副本-赋值时复制整个数据-包括基本数据类型(int、float、bool等)、结构体(struct)、枚举(enum)等-示例:inta=10;intb=a;//b是a的副本,修改b不会影响a引用类型:-存储对数据的引用(内存地址)-在堆上分配内存-多个变量可以引用同一对象-赋值时复制引用,而不是数据-包括类(class)、数组、字符串、委托等-示例:List<int>list1=newList<int>{1,2,3};List<int>list2=list1;//list2和list1引用同一个对象,修改list2会影响list1主要区别:-内存分配位置:值类型在栈上,引用类型在堆上-赋值行为:值类型复制数据,引用类型复制引用-默认值:值类型有默认值(如int为0,bool为false),引用类型的默认值为null-继承:值类型不能继承其他类型,引用类型可以继承-装箱和拆箱:值类型和引用类型之间转换时需要装箱(值类型转引用类型)和拆箱(引用类型转值类型)2.答案:依赖注入(DependencyInjection,DI)是一种设计模式,用于实现控制反转(InversionofControl,IoC),它将依赖关系的创建和管理从使用依赖的类中分离出来。基本概念:-依赖:类A依赖于类B,意味着类A使用了类B的功能-依赖注入:通过外部机制将依赖项(类B的实例)注入到需要它的类(类A)中,而不是在类A内部创建依赖项-控制反转:将依赖关系的控制权从类内部转移到外部容器或框架优势:-降低耦合度:类不需要知道依赖项的具体实现,只需要知道接口,减少了类之间的直接依赖-提高可测试性:可以轻松地用模拟对象(mock)替换真实依赖项,便于单元测试-提高可维护性:当需要更换依赖项的实现时,只需修改配置,而不需要修改使用依赖项的类-提高代码复用性:依赖项可以在多个类之间共享-促进关注点分离:类可以专注于自己的核心功能,而不需要负责依赖项的创建和管理在.NETCore中,依赖注入是通过内置的容器实现的,可以在Startup类中配置服务生命周期(Singleton、Scoped、Transient)。3.答案:ASP.NETCore中的中间件管道是一种请求处理机制,由一系列中间件组件组成。每个中间件组件可以选择将请求传递给下一个中间件,或者直接返回响应,从而形成一个链式处理流程。中间件管道工作原理:-当HTTP请求到达应用程序时,中间件管道会按照添加的顺序依次处理请求-每个中间件组件都可以在请求到达最终目标前执行一些操作(如日志记录、身份验证等)-中间件组件可以选择将请求传递给下一个中间件,或者直接生成响应并返回-响应会按照相反的顺序返回,每个中间件组件可以在响应返回前执行一些操作(如添加响应头、压缩响应等)添加自定义中间件:自定义中间件通常是一个类,包含一个Invoke或InvokeAsync方法,该方法接受HttpContext参数并返回Task。例如:```csharppublicclassCustomMiddleware{privatereadonlyRequestDelegate_next;publicCustomMiddleware(RequestDelegatenext){_next=next;}publicasyncTaskInvokeAsync(HttpContextcontext){//在请求处理前执行的操作Console.WriteLine("Requestarrivedatcustommiddleware");//将请求传递给下一个中间件await_next(context);//在响应处理后执行的操作Console.WriteLine("Responseprocessedbycustommiddleware");}}```在Startup类的Configure方法中添加自定义中间件:```csharppublicvoidConfigure(IApplicationBuilderapp){//添加自定义中间件app.UseMiddleware<CustomMiddleware>();//其他中间件配置...}```或者,使用扩展方法简化添加过程:```csharppublicstaticclassCustomMiddlewareExtensions{publicstaticIApplicationBuilderUseCustomMiddleware(thisIApplicationBuilderbuilder){returnbuilder.UseMiddleware<CustomMiddleware>();}}//在Startup类中publicvoidConfigure(IApplicationBuilderapp){app.UseCustomMiddleware();}```4.答案:LINQ(LanguageIntegratedQuery,语言集成查询)是.NET中的一种查询技术,它提供了一种统一的语法用于查询各种数据源,如集合、数据库、XML等。LINQ工作原理:-LINQ使用扩展方法和Lambda表达式来构建查询-查询表达式会被编译为方法调用,这些方法定义在System.Linq命名空间中-查询可以是延迟执行的(如Where、Select等),也可以是立即执行的(如Count、ToList等)-LINQ查询可以操作任何实现了IEnumerable<T>或IQueryable<T>接口的数据源LINQ主要组成部分:-标准查询运算符:一组扩展方法,用于查询数据源,如Where、Select、OrderBy、GroupBy等-Lambda表达式:用于指定查询条件或转换操作-查询语法:类似SQL的声明式语法,用于构建查询示例:```csharp//数据源List<int>numbers=newList<int>{1,2,3,4,5,6,7,8,9,10};//查询语法varquery=fromnuminnumberswherenum%2==0selectnumnum;//方法语法varmethodQuery=numbers.Where(num=>num%2==0).Select(num=>numnum);//执行查询foreach(varresultinquery){Console.WriteLine(result);}```LINQ的优势:-统一的查询语法:无论数据源是什么,都可以使用相同的查询语法-类型安全:编译时检查查询语法,减少运行时错误-延迟执行:查询不会立即执行,直到需要结果时才执行,提高性能-可组合性:可以轻松组合多个查询操作,构建复杂的查询逻辑5.答案:EntityFrameworkCore中的CodeFirst方法是一种开发模式,允许开发者首先定义领域模型(实体类),然后根据这些模型自动生成数据库架构。这种方法也被称为"先有代码,后有数据库"。CodeFirst方法的工作流程:1.定义实体类:创建表示领域模型的C类,使用属性注解配置与数据库的映射关系2.创建DbContext:创建继承自DbContext的类,并在其中定义DbSet属性来表示数据库表3.配置映射关系:使用数据注解或FluentAPI配置实体类与数据库表之间的映射关系4.迁移:使用EntityFrameworkCore的迁移功能,根据模型变更自动生成和更新数据库架构5.查询和保存数据:使用DbContext进行数据查询和保存操作CodeFirst方法的优势:-领域驱动设计:CodeFirst方法与领域驱动设计(DDD)理念高度契合,允许开发者专注于领域模型-数据库无关性:模型独立于特定的数据库实现,可以轻松切换数据库提供商-自动迁移:当模型变更时,可以使用迁移功能自动更新数据库架构,减少手动管理数据库的工作-版本控制:数据库架构作为代码的一部分,可以纳入版本控制系统,便于团队协作和部署-测试友好:可以轻松创建内存数据库用于单元测试,而不需要真实的数据库环境示例:```csharp//实体类publicclassBlog{publicintBlogId{get;set;}publicstringUrl{get;set;}publicList<Post>Posts{get;set;}}publicclassPost{publicintPostId{get;set;}publicstringTitle{get;set;}publicstringContent{get;set;}publicintBlogId{get;set;}publicBlogBlog{get;set;}}//DbContextpublicclassBloggingContext:DbContext{publicDbSet<Blog>Blogs{get;set;}publicDbSet<Post>Posts{get;set;}protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder){optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;");}}```在这个示例中,我们定义了Blog和Post两个实体类,以及一个BloggingContext类。EntityFrameworkCore会根据这些类自动生成相应的数据库表。五、编程题1.答案:```csharpusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;//图书类publicclassBook{publicintId{get;set;}publicstringTitle{get;set;}publicstringAuthor{get;set;}publicintPublicationYear{get;set;}}//图书管理类publicclassBookManager{privateList<Book>books=newList<Book>();privateintnextId=1;//添加图书publicvoidAddBook(Bookbook){if(book==null){thrownewArgumentNullException(nameof(book));}book.Id=nextId++;books.Add(book);}//删除图书publicboolRemoveBook(intid){varbook=books.FirstOrDefault(b=>b.Id==id);if(book!=null){returnbooks.Remove(book);}returnfalse;}//查找图书publicBookFindBook(intid){returnbooks.FirstOrDefault(b=>b.Id==id);}//显示所有图书publicvoidDisplayAllBooks(){if(books.Count==0){Console.WriteLine("没有图书。");return;}Console.WriteLine("所有图书:");foreach(varbookinbooks){Console.WriteLine($"ID:{book.Id},标题:{book.Title},作者:{book.Author},出版年份:{book.PublicationYear}");}}//按作者查找图书publicList<Book>FindBooksByAuthor(stringauthor){returnbooks.Where(b=>b.Author.Equals(author,StringComparison.OrdinalIgnoreCase)).ToList();}//按出版年份查找图书publicList<Book>FindBooksByPublicationYear(intyear){returnbooks.Where(b=>b.PublicationYear==year).ToList();}}//控制台应用程序publicclassProgram{publicstaticvoidMain(){varbookManager=newBookManager();//添加一些图书bookManager.AddBook(newBook{Title="C高级编程",Author="张三",PublicationYear=2020});bookManager.AddBook(newBook{Title=".NETCore实战",Author="李四",PublicationYear=2021});bookManager.AddBook(newBook{Title="ASP.NETCore开发指南",Author="张三",PublicationYear=2022});//显示所有图书bookManager.DisplayAllBooks();//按作者查找图书Console.WriteLine("\n查找作者为'张三'的图书:");varbooksByAuthor=bookManager.FindBooksByAuthor("张三");foreach(varbookinbooksByAuthor){Console.WriteLine($"ID:{book.Id},标题:{book.Title},作者:{book.Author},出版年份:{book.PublicationYear}");}//按出版年份查找图书Console.WriteLine("\n查找出版年份为2021年的图书:");varbooksByYear=bookManager.FindBooksByPublicationYear(2021);foreach(varbookinbooksByYear){Console.WriteLine($"ID:{book.Id},标题:{book.Title},作者:{book.Author},出版年份:{book.PublicationYear}");}//删除图书Console.WriteLine("\n删除ID为1的图书:");varremoved=bookManager.RemoveBook(1);Console.WriteLine($"删除结果:{removed}");//再次显示所有图书Console.WriteLine("\n删除后的所有图书:");bookManager.DisplayAllBooks();}}```2.答案:```csharpusingSystem;usingSystem.ComponentModel.DataAnnotations;usingSystem.Linq;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.EntityFrameworkCore;//用户模型publicclassUser{publicintId{get;set;}[Required][StringLength(50)]publicstringName{get;set;}[Required][EmailAddress]publicstringEmail{get;set;}publicDateTimeCreatedDate{get;set;}}//用户DbContextpublicclassUserDbContext:DbContext{publicUserDbContext(DbContextOptions<UserDbContext>options):base(options){}publicDbSet<User>Users{get;set;}}//用户控制器[ApiController][Route("api/[controller]")]publicclassUserController:ControllerBase{privatereadonlyUserDbContext_context;publicUserController(UserDbContextcontext){_context=context;}//获取所有用户[HttpGet]publicIActionResultGetAllUsers(){varusers=_context.Users.ToList();returnOk(users);}//根据ID获取用户[HttpGet("{id}")]publicIActionResultGetUserById(intid){varuser=_context.Users.FirstOrDefault(u=>u.Id==id);if(user==null){returnNotFound();}returnOk(user);}//添加用户[HttpPost]publicIActionResultAddUser([FromBody]Useruser){if(!ModelState.IsValid){returnBadRequest(ModelState);}user.CreatedDate=DateTime.UtcNow;_context.Users.Add(user);_context.SaveChanges();returnCreatedAtAction(nameof(GetUserById),new{id=user.Id},user);}//删除用户[HttpDelete("{id}")]publicIActionResultDeleteUser(intid){varuser=_context.Users.FirstOrDefault(u=>u.Id==id);if(user==null){returnNotFound();}_context.Users.Remove(user);_context.SaveChanges();returnNoContent();}}//Program.cspublicclassProgram{publicstaticvoidMain(string[]args){varbuilder=WebApplication.CreateBuilder(args);//添加服务builder.Services.AddDbContext<UserDbContext>(options=>options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));builder.Services.AddControllers();varapp=builder.Build();//配置HTTP请求管道if(app.Environment.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseHttpsRedirection();app.UseRouting();app.UseAuthorization();app.MapControllers();app.Run();}}```3.答案:```csharpusingSystem;usingSystem.Collections.Generic;usingSystem.Threading;publicclassCacheEntry<T>{publicTValue{get;set;}publicDateTimeExpirationTime{get;set;}}publicclassCacheSystem<T>{privatereadonlyDictionary<string,CacheEntry<T>>_cache=newDictionary<string,CacheEntry<T>>();privatereadonlyReaderWriterLockSlim_lock=newReaderWriterLockSlim();//添加缓存项publicvoidAdd(stringkey,Tvalue,TimeSpanexpiration){if(string.IsNullOrEmpty(key)){thrownewArgumentException("Keycannotbenullorempty.",nameof(key));}if(value==null){thrownewArgumentNullException(nameof(value));}_lock.EnterWriteLock();try{_cache[key]=newCacheEntry<T>{Value=value,ExpirationTime=DateTime.UtcNow.Add(expiration)};}finally{_lock.ExitWriteLock();}}//获取缓存项publicboolTryGet(stringkey,outTvalue){if(string.IsNullOrEmpty(key)){value=default(T);returnfalse;}_lock.EnterReadLock();try{if(_cache.TryGetValue(key,outvarentry)){if(DateTime.UtcNow<=entry.ExpirationTime){value=entry.Value;returntrue;}else{//缓存已过期,移除它_lock.EnterWriteLock();try{_cache.Remove(key);}finally{_lock.ExitWriteLock();}}}value=default(T);returnfalse;}finally{_lock.ExitReadLock();}}//删除缓存项publicboolRemove(stringkey){if(string.IsNullOrEmpty(key)){returnfalse;}_lock.EnterWriteLock();try{return_cache.Remove(key)!=null;}finally{_lock.ExitWriteLock();}}//清除所有缓存项publicvoidClear(){_lock.EnterWriteLock();try{_cache.Clear();}finally{_lock.ExitWriteLock();}}//获取缓存项数量publicintCount{get{_lock.EnterReadLock();try{//移除过期的缓存项varnow=DateTime.UtcNow;varexpiredKeys=_cache.Where(kv=>now>kv.Value.ExpirationTime).Select(kv=>kv.Key).ToList();if(expiredKeys.Count>0){_lock.EnterWriteLock();try{foreach(varexpir

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论