面试复习基础题目-c#相关

面试复习基础题目

c#相关问题

  1. delegate和event的区别是什么?

    Delegate用来声明委托类型,event用来声明委托对象;

    事件是委托的一种应用,事件是带有event关键词的委托对象,对委托对象进行了封装,本质就是委托对象。

    调用上event只能+=和-=,这样做的意义是为了防止,其余的方法覆盖,但是delegate并没有这种限制,不仅可以+=,-=,还可以直接=一个方法。

    委托定义的是一个类型,而事件定义的是一个成员。

    对于delegate,我们在定义它的类外,不仅可以采用 += 和-=的运算符号,还可随时调用;但是对于event,在类外只能采用 += 和-=的运算符号,不能调用,也就是event把它本身的invoke函数和括号调用的函数变成拥有这个event类的私有函数。

    什么时候用委托?什么时候用事件?

    如果一个委托不需要在其定义的类之外进行触发,那就将其转化为事件,保证不会在不可知的情况下被触发。

  2. new和override分别有什么作用?什么情况下用new或者override?

    用override关键字重写父类中的虚方法或抽象方法,可以实现多态性,重写方法的访问修饰符必须与被重写方法的访问修饰符相同或更为宽松。

    用new关键字来覆盖一个父类中的成员办法或成员变量。

    不管是重写还是覆盖都不会影响父类自身的功能,当用子类创建父类的时候,重写会改变父类的功能,即调用子类的功能,而覆盖不会,仍然会调用父类功能。

    虚方法和实方法都可以使用new,但是抽象方法和接口不可以;

    抽象方法和接口和virtual的方法都可以override,实方法不可以。

    重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。

  3. Async和await是如何使用的?本质核心是什么?方便的点在哪?

    Async是异步的意思,await可以理解为async wait,async用来声明一个异步方法,而await是用来等待异步方法执行。

    Async是一个通过异步执行并隐式返回promise作为结果的函数,promise对象的结果由async函数执行的返回值决定。

    Await右侧的表达式一般为promise对象,也可以是其他的值,如果表达式是promise对象,await会阻塞函数候面的代码,等着promise对象resolve/reject,如果await等待的是一个非promise对象,会隐式的将该对象包装成一个已经resolve的promise对象。

    使用async/await可以实现用同步代码的风格来编写异步代码,因为async/await的基础技术使用了生成器和promise,利用生成器能实现生成器函数的暂停和恢复。

    Async/await是为了优化.then链开发出来的。Await必须写在async函数中,而async函数中可以没有await,如果await的promise失败了,就会抛出异常,需要通过try...catch来捕获异常。

  4. Async void和async task有什么区别?何时使用void?

    Async void是使用async关键字但具有void返回类型的方法,通常用于事件处理器或顶级入口点。Async void和async task的主要区别在于异常处理方式,async void方法不允许适当的异常处理,如果未捕获异常,可能导致应用程序崩溃;async task方法允许更好的错误处理和异常传播。Async void应当尽可能避免使用,使用时应实现适当的异常处理,例如使用try/catch块并到位异步操作的日志记录和监控。

  5. 设计模式中单例模式分为几种?分别什么用途?

    单例模式的特点是一个类只能有一个实例,自己创建这个实例,整个系统都要使用这个实例。

    分为饿汉模式、经典的单例模式、双重检查(保证原子性)、静态内部类实现、枚举实现。

    由于单例模式在内存中只有一个实例,减少了内存开支,减少系统的性能开销,可以避免对资源的多重占用,可以在系统设置全局的访问点。缺点:不适用于变化的对象,扩展困难。

  6. 设计模式工厂模式又是什么?有什么用途?

    工厂模式通过定义一个公告接口或抽象类来创建对象,而具体的对象创建则由工厂类来实现。工厂模式是一种常见的对象创建型模式,具有封装性、可扩展性、复杂对象的创建和解耦等优点,适用于解决复杂对象创建问题。

  7. Is和As的区别是什么?什么时候用Is什么时候用As?

    As在转换的同时兼判断兼容性,如果无法进行转换,则as返回null而不是引发异常,判断是否转换成功要判断是否为null,as是引用类型的类型转换或者装箱转换,不能用与值类型的转换。

    Is只是做类型兼容判断,并不知晓真正的类型转换,返回true或者false不会返回null,对象为null也会返回false。Is判断之后还需要手动代码去完成类型转换。

  8. 解释一下c#多态是什么?接口与抽象类又有何异同?

    多态是父类对象表现多种子类的形态的能力的特征,对于父类中的一个方法,在不同子类中有不同的实现,父类引用子类对象,调用父类被重写的方法时,子类有不同的响应。多态的前提时继承和方法重写。

    接口和抽象类的不同点:1.关键字不同,接口实现时implements,定义是interface;抽象类继承是extends定义是abstracts class。2.权限修饰不同,抽象方法可以有public、protected和default,接口只能是public。3.抽象类中可以有构造方法,而接口中不能有构造方法。4.抽象类中既可以有抽象方法也可以有普通方法,接口中只能有抽象方法。5.抽象类中增加方法可以不影响子类,而接口中增加方法通常都影响子类。6.抽象类中的变量可以是普通变量,接口里定义的变量只能是公共的静态的变量。7.抽象方法可以继承单个类和实现多个接口,接口可以多继承接口。

    接口和抽象类的相同点:1.都可以被继承。2.都不能被实例化。3.都可以包含方法声明。4.派生类必须实现未实现的方法。

  9. 如何实现线程同步?

    Lock,参数必须是基于引用类型的对象,不要使用字符串作为lock的参数,最好避免使用public类型或不受程序控制的对象实例,这样很可能导致死锁。

    System.threading.interlocked实现对整数数据类型的简单操作按照原子操作执行。

    Mutex可以跨进程也可以实现进程内的线程同步。

    ReaderWriterLock,如果在某一时刻资源并没有获取写的独占权,那么可以获得多个读的访问权,单个写入的独占权,如果某一时刻已经获取了写入的独占权,则其他读取的访问权必须进行等待。

    SynchronizationAttribute,可以确保类的实例无法被多个线程同时访问。

    MethodImplAttribute,会使整个方法加锁,直到方法返回,才释放锁。

    同步事件和等待句柄,同步事件有两种AutoResetEvent和ManualResetEvent,实现线程同步的同时线程之间要有交互。可以调用waitone、waitany、waitall来使线程等待事件。

  10. 什么是依赖注入?如何实现依赖注入?

    依赖注入使指程序运行过程中,如果需要调用另一个对象协助时,不需要在代码中创建对象,而是依赖于外部的注入,应用程序在运行时依赖IOC容器来动态注入对象需要的外部资源。DI依赖注入是控制反转的具体实现方式,控制反转是创建对象,依赖注入是为对象的属性赋值。

    创建实例的声明周期:1.Transient瞬时模式,每次访问都会创建一个新的实例。2.Scoped域模式,在同一个scope内只初始化一个实例。3.Singleton单例模式,整个应用程序生命周期只创建一个实例。

    依赖注入的实现方式:1.以接口的形式暴露服务 2.自己注入自己,以实现形式暴露服务 3.需要传参的构造函数的类的注入。

  11. Ref和out和in有什么异同?

    Ref参数成为引用参数,in参数成为输入参数,out参数成为输出参数。

    相同点:ref、out、in标记的参数都是引用传递,关键字都不能约束方法签名,形参使用了ref、out、in关键字,传递参数时也需要添加关键字。

    不同点:in形参不让修改,所以in实参必须初始化;out形参必须修改,所以out实参不需要初始化;ref形参修改和不修改都行,ref实参也是必须初始化。

  12. Yield的用途是什么,请写出简易循环代码?

    Yield在函数中相当于return又不同于return,当函数执行遇到yield的时候,函数会停止执行,并返回yield后的值。

  13. Linq是做什么的?如何编写一个延迟查询?

    Linq代表语言集成查询,允许用sql查询数据库的方式来查询数据的集合。

  14. 在winform中有一个窗体,包含静态字段,实例字段,属性,方法,构造函数,它的执行顺序是什么?

    静态字段-静态构造方法-实例字段-实例构造方法,属性和方法实在调用的时候才执行。

  15. Asp.Net core中,中间件是什么,用途是什么,五大异常过滤器分别是哪些?简述执行顺序?

    在.net core中,中间件是asp.net core应用程序处理请求和响应的组件,中间件位于应用程序的请求处理管道中,它可以截获请求,执行一些逻辑,并将请求传递给下一个中间件或终止请求的执行。一个简单的中间件是一个可以调用的组件,包含一个处理请求的方法。

    五大异常过滤器为:

    Authorization Filter:优先级最高,通常用于验证request合不合法,不合法就直接跳过。

    Resource filter:第二优先,在authorization之后,model binding之前执行,通常会是需要对model加工处理才用。

    Exception Filter:异常处理的filter。

    Action filter:最常使用的filter,封包进出都会经过,跟resourcefilter类似,但不会经过model binding。

    Result Filter:当action完成后,最终会经过的filter。

  16. Using作用是什么并举例说明

    1、 引用命名空间,比如 using System.Text;

    2、 为命名空间或类型创建别名,比如using a=System.Drawing.Point;

    3、 使用using语句定义一个范围,将在此范围之外释放一个或多个对象,比如using (SqlConnection conn = new SqlConnection()){conn.Open();throw new exception("exception");}

  17. Task.waitAll和task.whenall有什么区别?如何使用?

    Task.waitall阻止当前线程,直到所有其他任务完成执行为止,task.whenall方法用于创建仅当所有其他任务均已完成时才完成的任务。例如需要在用户界面中显示一些动画,如果我们使用task.waitall则在所有相关任务完成并释放该块之前,该用户界面将被阻止并且不会更新,但如果我们使用task.whenall则不会阻塞UI线程而是会照常更新。

  18. 现在有一个Task执行循环任务,从0开始 每秒循环一次每次递增1 我如何取消任务? 10秒后我取消任务并且输出 那么最终输出是多少? 是否是你想要的值,如果不是,如何处理?

    使用CancellationTokenSource对象外部对task控制,如取消或定时取消等。

    需要声明new一个cancellationTokenSource对象,使用Task.factory.Startnew(task,cancelTokenSource);cancelTokenSource.cancel()即可停止task。此函数还可以管理多个Task的取消。

  19. 什么是深拷贝,什么是浅拷贝,什么时候用深拷贝?那么引用类型和值类型分别有哪些?

    深拷贝是通过复制对象的内容来实现的,意味着新对象和原对象将拥有各自独立的内存空间,互相不受影响。

    浅拷贝是只复制对象的指针或引用来,而不复制对象本身,新对象和原对象将共享同一块内存空间,当一个对象被修改时,另一个对象也会受到影响。

    当希望在改变新的数组的时候不改变原数组对象的时候需要用到深拷贝,当类持有其他资源时比如动态分配的内存或者指向其他数据的指针等,默认的拷贝构造函数就不能拷贝这些资源了,就需要显式的定义拷贝构造函数以完整的拷贝对象的所有数据。

    值类型:数值类型、bool、结构、枚举

    引用类型:字符串、数组、类、接口

    值类型和引用类型的区别:1.值类型赋值会拷贝一个副本,引用类型变量的赋值只复制对对象的引用;2.内存空间不同,值类型会放在栈上面,引用类型会放在堆和栈上面;3.参数传递。

  20. 如果只有调试的时候才可以获取到属性值,那么在非调试中应该怎么获取属性值?

    c# GetType().GetProperty()获取属性,getvalue获取值

  21. 在winform中,我点击一个按钮,此时界面卡死,我应该如何做?

Invoke使用委托,begininvoke不用工作线程等待

  1. 如何托管和非托管代码交互?一般都是调用第三方

  2. Net的内置委托有哪几种?分别是什么作用?

    委托跟方法类似,有参数、有返回值、有修饰符、+delegate;委托的本质时委托类。

    Func是有返回值的委托,Action是没有返回值的委托。

相关推荐
程序员勋勋1 小时前
【自动化测试】如何在jenkins中搭建allure
职场和发展·jenkins·测试覆盖率
独行soc2 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
咕咕吖2 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
理想不理想v2 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
Envyᥫᩣ2 小时前
C#语言:从入门到精通
开发语言·c#
sszmvb12343 小时前
测试开发 | 电商业务性能测试: Jmeter 参数化功能实现注册登录的数据驱动
jmeter·面试·职场和发展
测试杂货铺3 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
王佑辉3 小时前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
真忒修斯之船3 小时前
大模型分布式训练并行技术(三)流水线并行
面试·llm·aigc
ZL不懂前端4 小时前
Content Security Policy (CSP)
前端·javascript·面试