![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
.NET高级面试指南
文章平均质量分 64
搬砖的诗人Z
全栈工程师,侧重项目技术解决方案规划和开发
展开
-
C#访问关键字this和base有什么作用
this 关键字用于当前实例,而 base 关键字用于基类实例。它们能够帮助你在类的成员和构造函数中正确引用所需的实例。在C#中,关键字 this 和 base 分别用于引用当前实例和基类实例的成员。原创 2024-04-28 10:10:51 · 354 阅读 · 0 评论 -
.NET高级面试指南专题三十【MVC模式介绍,每个组件都有不同的责任,协同工作以实现应用程序的目标】
UserModel表示用户数据,UserView表示用户界面,UserController充当中介来更新模型并将数据显示到视图上。这种分离使得各个组件可以独立开发、测试和维护,提高了代码的可读性和可维护性。是一种软件设计模式,用于将应用程序分解为三个主要组件:模型(每个组件都有不同的责任,协同工作以实现应用程序的目标。原创 2024-04-27 11:39:52 · 734 阅读 · 0 评论 -
.NET高级面试指南专题二十九【备忘录模式介绍,用于需要撤销操作或在发生错误时恢复对象状态的情况】
备忘录模式是一种行为型设计模式,用于捕获对象的内部状态并在不破坏其封装性的情况下将其保存,以便稍后可以将对象恢复到先前的状态。这种模式通常用于需要撤销操作或在发生错误时恢复对象状态的情况。原创 2024-04-27 11:36:31 · 399 阅读 · 1 评论 -
.NET高级面试指南专题二十八【模板模式介绍,通过共享对象来最大程度地减少内存使用和提高性能】
Game 类是抽象模板类,其中包含了模板方法 Play(),定义了游戏的基本流程。Cricket 和 Football 类是具体的游戏类,它们通过继承 Game 类来实现自己的游戏流程。通过模板方法 Play(),可以确保每个游戏类都遵循相同的基本流程,但又可以根据需要重写特定的步骤。模板模式是一种行为设计模式,它定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。模板模式通过将共同的行为封装在一个模板方法中,并允许子类重写特定步骤的行为来实现算法的不同变体。原创 2024-04-23 09:37:43 · 431 阅读 · 0 评论 -
.NET高级面试指南专题二十七【享元模式介绍,通过共享对象来最大程度地减少内存使用和提高性能】
类是享元工厂,负责创建并管理共享的对象。通过共享相同的圆形对象,可以减少内存使用和提高性能。内部状态是对象共享的部分,而外部状态是对象的变化部分,它们在对象被创建后可以被改变。在享元模式中,对象被分为两种部分:内部状态(类表示具体的享元类,原创 2024-04-23 09:32:23 · 532 阅读 · 0 评论 -
.NET高级面试指南专题二十六【适配器模式介绍,用于将一个类的接口转换成客户端所期待的另一个接口】
适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期待的另一个接口,使得原本由于接口不兼容而不能在一起工作的类能够协同工作。这种模式通常用于软件系统的升级和重构中,可以使得原有的代码能够与新的接口相兼容,同时不改变原有代码的情况下实现功能的更新和扩展。,使得客户端可以通过调用新接口的方法来间接调用旧接口的方法。类充当了适配器的角色,将旧接口。原创 2024-04-21 08:52:47 · 706 阅读 · 0 评论 -
.NET高级面试指南专题二十五【 建造者模式介绍,将复杂对象的构建过程与其表示分离】
建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它允许客户端通过指定要构建的类型和可选参数来构建对象,而不需要了解对象的具体构建细节。原创 2024-04-21 08:48:28 · 720 阅读 · 0 评论 -
https和http有什么区别,为什么要用https
使用HTTPS的网站会使用SSL证书,这些证书由受信任的第三方机构(如Let’s Encrypt、Comodo、Symantec等)颁发。这些证书可以证明网站的身份,增加了用户对网站的信任度。搜索引擎(如Google)更倾向于显示和排名使用HTTPS的网站,因为HTTPS提供了更高的安全性和数据完整性,这也是许多网站选择使用HTTPS的原因之一。)之间的主要区别在于安全性。原创 2024-04-14 10:19:10 · 296 阅读 · 0 评论 -
数据库是怎么做到事务回滚的呢?
回滚操作:当事务发生错误或者用户显式地执行回滚操作时,数据库管理系统会根据事务日志中的Undo日志信息,逆向执行相应的撤销操作,将事务所做的修改全部撤销,恢复数据库到事务开始之前的状态。事务日志记录了事务的所有操作,在事务提交之前,将修改操作记录在日志中,以便在事务回滚时进行恢复。Undo Log记录了事务的“逆操作”,Redo Log记录了事务的“正向操作”,而Binlog记录了数据库的所有修改操作,它们分别用于支持事务的原子性和一致性、数据库系统的崩溃恢复以及数据库的备份和恢复等功能。原创 2024-03-27 10:19:06 · 902 阅读 · 0 评论 -
.NET高级面试指南专题二十四【一文搞懂数据库的触发器】
数据库触发器是一种特殊的数据库对象,它在数据库中的表上监视特定的事件(如插入、更新、删除等),并在这些事件发生时自动执行预定义的操作。触发器通常用于实施业务规则、数据完整性和一致性要求,以及记录日志和审计信息等场景。当users表的记录更新时,触发器会检查用户名或邮箱是否发生变化,如果发生变化,则将变更记录插入user_change_log表中。假设有一个简单的用户表users,我们希望在用户信息更新时记录变更日志。原创 2024-03-27 09:56:47 · 454 阅读 · 0 评论 -
.NET高级面试指南专题二十二【 数据库索引】
索引的原理是通过在数据库表的列上创建一个有序的数据结构,通常是 B 树或 B+ 树,使得数据库引擎可以更快地定位和访问数据行。数据库索引是一种数据结构,用于提高数据库查询效率。它们类似于书籍的目录,能够快速指引数据库引擎去查找特定的数据行。应根据实际查询需求和数据分布情况选择合适的列创建索引,避免过度索引和不必要的索引。如果查询条件不是索引列或者不满足索引列的前缀条件,数据库引擎可能无法使用索引。原创 2024-03-24 11:19:01 · 655 阅读 · 0 评论 -
.NET高级面试指南专题二十【 一文详解数据库锁】
乐观锁的思想是假设并发冲突很少发生,不会立即对数据加锁,而是在数据更新时检查数据是否被其他事务修改过,如果没有则进行更新,如果有则放弃更新或者进行重试。悲观锁的思想是在访问数据之前,先获取锁来确保数据的独占性,认为并发访问可能导致数据冲突,因此采取悲观的态度,始终认为会发生并发冲突。在更新数据时,先读取当前数据的值和版本号,然后比较新的数据值和版本号是否和读取时一致,如果一致则更新数据,否则认为发生了并发冲突。是一种用于管理并发访问数据库资源的技术,通过控制数据的访问权限,确保数据的一致性和完整性。原创 2024-03-21 10:10:53 · 1552 阅读 · 0 评论 -
C#中的override和overload介绍
override 用于派生类中重新定义基类中的虚方法或抽象方法,实现多态性;而 overload 则是在同一个类中定义多个同名方法,但参数列表不同,以提供不同的功能或处理方式。而 overload 则是在同一类中,方法名称相同但参数不同,主要用于重载同一操作的不同形式。:override 关键字用于在派生类中重新定义(覆盖)基类中的虚方法或抽象方法。:overload 指的是在同一个类中定义多个具有相同名称但参数列表不同的方法。:主要用于实现多态性,即派生类可以为其基类中的虚方法或抽象方法提供自己的实现。原创 2024-03-20 10:15:28 · 1061 阅读 · 0 评论 -
C#中的值类型和引用类型
引用类型存储在堆上,而变量本身存储的是对该数据的引用(即内存地址)。因此,当你将一个引用类型赋值给另一个引用类型时,它们实际上引用的是相同的对象。在C#中,数据类型可以分为值类型和引用类型。这两者在内存中存储和处理方式不同,理解它们之间的区别对于编写高效且正确的代码至关重要。值类型直接包含它们的数据,它们存储在堆栈上。当你将一个值类型赋值给另一个值类型时,会创建一个新的独立副本。理解这些概念有助于避免常见的内存管理错误,并能够更好地设计和优化代码。原创 2024-03-19 10:57:27 · 599 阅读 · 0 评论 -
.NET高级面试指南专题十九【 数据库设计-4范式】
通过将数据结构化为不同的范式,可以降低数据冗余,减少数据更新异常,提高数据的可靠性和一致性。是的,因为它唯一地标识了教师ID。假设有一个关系模式R,包含属性集合{学生ID,课程ID,教师ID},其中函数依赖为{学生ID,课程ID} → {教师ID}。:一个名为“学生”的表,包含姓名、年龄和课程,如果将课程字段设计为包含多个课程的列表,就违反了第一范式。:第一范式消除了重复的数据和集合类型的字段,确保每个字段都是单一值,简化了数据的处理和查询。非平凡的函数依赖是指Y不能是X的真子集,否则它是一个平凡的依赖。原创 2024-03-18 10:10:54 · 470 阅读 · 0 评论 -
.NET高级面试指南专题十八【 外观模式模式介绍,提供了简化的接口,隐藏系统的复杂性】
集成开发环境通常包含了许多功能,如代码编辑器、编译器、调试器等,外观模式可以用来封装这些功能,为开发者提供简单的接口来开发软件。是一种结构设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。:操作系统中的系统调用和API通常也使用外观模式来隐藏底层硬件和系统的复杂性,为应用程序提供简单的接口来访问系统资源。:在大型企业应用程序中,可能涉及到多个子系统,外观模式可以用来封装这些子系统,提供一个统一的接口给客户端使用。:外观类提供了一个简单的接口,隐藏了子系统的复杂性,使得客户端更容易使用。原创 2024-03-14 10:31:15 · 773 阅读 · 0 评论 -
.NET高级面试指南专题十七【 策略模式模式介绍,允许在运行时选择算法的行为】
是一种行为设计模式,它允许在运行时选择算法的行为。它定义了一系列算法,将每个算法封装到一个对象中,并使它们可以互相替换。这使得算法可独立于使用它的客户端变化。:维护一个对策略对象的引用,并在运行时选择所需的具体策略。:每个具体策略都会创建一个对象,可能会导致类的数量增加。:客户端需要了解不同的策略,以便选择正确的策略。可以复用现有的算法,不需要重复实现。能够在运行时动态地改变对象的行为。:实现策略接口的具体算法。容易增加新的算法或策略。:定义一组算法的接口。原创 2024-03-14 09:58:18 · 1033 阅读 · 0 评论 -
.NET高级面试指南专题十六【 装饰器模式介绍,包装对象来包裹原始对象】
装饰器模式通过创建一个包装对象来包裹原始对象,并在包装对象上添加额外的功能。这种模式允许将一个或多个装饰器叠加在原始对象上,从而实现功能的组合。Pattern)是一种结构型设计模式,用于动态地给对象添加额外的职责,而不改变其原始类的结构。它允许向对象添加行为,而无需生成子类。装饰器模式(Decorator。原创 2024-03-10 08:37:42 · 517 阅读 · 0 评论 -
什么是MVVM模式?MVVM 模式有什么优势
分离关注点(Separation of Concerns):MVVM模式通过将用户界面(视图)与应用程序逻辑(视图模型)和数据(模型)分离,使代码更易于理解、维护和测试。MVVM的实现原理是通过数据绑定来实现视图与视图模型之间的通信,以及通过命令绑定来实现视图模型与视图之间的交互。数据绑定:WPF中提供了强大的数据绑定机制,可以将视图模型的属性绑定到视图的控件上,实现数据的自动同步。命令绑定:WPF中的命令绑定允许将视图模型中的命令与视图中的事件关联起来,从而实现用户交互的响应。原创 2024-03-10 08:37:15 · 1667 阅读 · 0 评论 -
.NET高级面试指南专题十五【 原型模式介绍,Clone要这样去用】
原型模式是一种创建型设计模式,其主要目的是通过克隆现有对象来创建新对象,而不是通过实例化新的对象。这种模式在需要创建相似对象时非常有用,尤其是当对象的创建过程比较昂贵或复杂时。原型模式通过克隆已有的对象来创建新的对象。除了复制对象本身外,还会递归复制对象内部的引用对象。只复制对象本身,不复制对象内部的引用对象。原创 2024-03-09 09:17:20 · 512 阅读 · 0 评论 -
.NET高级面试指南专题十四【 观察者模式介绍,最常用的设计模式之一】
观察者模式(Observer Pattern)是一种行为型设计模式,其目的是定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。原创 2024-03-04 09:29:20 · 1306 阅读 · 0 评论 -
.NET高级面试指南专题十三【 单例模式介绍,用单例模式写个缓存器】
单例模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这在某些情况下很有用,特别是当系统中只应该存在一个实例时,如数据库连接、日志记录器、线程池等。这种方式在类加载时就创建了实例,因此称为“饿汉式”。它的优点是实现简单,线程安全,但缺点是可能造成资源浪费,因为不管是否使用都会创建实例。它的优点是节省资源,但需要考虑线程安全性,可以使用锁或者双重检查锁定等方式来保证线程安全。单例模式在需要确保只有一个实例存在并且提供全局访问点的情况下是非常有用的。原创 2024-03-03 08:57:49 · 456 阅读 · 0 评论 -
.NET高级面试指南专题十二【 工厂模式介绍,工厂模式和抽象工厂模式的区别】
工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式,同时隐藏了创建对象的复杂性。抽象工厂模式通过引入一个抽象工厂接口和多个具体工厂类来实现,每个具体工厂类负责创建一组相关的产品,这些产品通常在逻辑上属于同一个产品族或者具有相关特性。在抽象工厂模式中,客户端通过与具体工厂的接口交互来创建产品,而不是直接实例化具体产品。工厂模式包含一个工厂类,该类负责创建其他类的对象。总之,工厂模式更注重单一对象的创建,而抽象工厂模式更注重一组相关对象的创建,它们各自的设计目标和使用场景不同。原创 2024-03-02 07:32:26 · 547 阅读 · 0 评论 -
C#中什么是非托管代码?托管代码和非托管代码有什么区别
COM(Component Object Model)组件:COM 是一种面向对象的二进制接口标准,可以编写使用 C/C++ 编写的 COM 组件,并通过 Interop Services 在 C# 中调用。这种方式常用于与操作系统交互、进行系统级编程等。这些是C# 中使用非托管代码的一些常见场景,包括调用 C/C++ 动态链接库函数、使用 COM 组件、以及调用 Win32 API 函数。在C#中,托管代码和非托管代码是两种不同类型的代码,它们在内存管理和执行环境上有所不同。)技术在 C# 中调用。原创 2024-03-02 07:32:10 · 1981 阅读 · 0 评论 -
理解C#里面的集合有哪些?怎么用,什么是安全集合?
在C#中,集合是一种用于存储和操作多个元素的数据结构。它们提供了各种操作,如添加、删除、查找等,以及遍历集合中的元素。这些线程安全的集合类型能够在多线程环境中保证数据的一致性和完整性,避免出现竞态条件和死锁等问题。在C#中,集合类型有很多种,每种都有其特定的使用环境和适用场景。,以支持迭代和枚举集合中的元素。适用于频繁的插入和删除操作,但不适用于随机访问。适用于需要通过键进行查找和检索的场景。适用于需要频繁添加或删除元素的场景。适用于需要快速查找和有序遍历的场景。接口的对象,用于遍历集合中的元素。原创 2024-02-29 09:50:39 · 1683 阅读 · 0 评论 -
什么是面向切面编程?实战解释:AOP实现一个日志记录
虽然静态代理简单,但是每个需要被代理的类都需要一个代理类,如果应用中有多个类需要被代理,就会产生大量的代理类,维护起来相对复杂。动态代理可以实现通用的代理类,避免了静态代理中每个类都需要一个代理类的问题。等技术实现动态代理。动态代理通常结合切面和连接点的概念,根据切面和连接点的定义,在目标对象的方法执行前后插入相应的通知。,可以集中管理应用中的横切关注点,这使得修改和更新这些关注点变得更加方便,减少了重复代码的产生。):代理是一个包装了目标对象的对象,它拦截对目标对象的访问,并在必要时应用一个或多个切面。原创 2024-02-28 09:45:13 · 1380 阅读 · 0 评论 -
.NET高级面试指南专题十【 迭代器(Iterators),惰性求值】
延迟加载和节约内存:迭代器可以实现延迟加载,即只有在需要时才生成集合中的元素,这样可以节省内存空间,并提高程序的性能。隐藏集合实现细节:使用迭代器可以隐藏集合的内部实现细节,使得开发人员在使用集合时不需要关心其具体的存储结构或遍历方式。这样可以提高代码的封装性,降低代码的耦合度。简化集合遍历:迭代器允许开发人员通过简洁的语法来遍历集合中的元素,而无需手动管理遍历过程中的索引或指针。迭代器是一种用于遍历集合中元素的机制,它提供了一种简洁而优雅的方式来逐个访问集合中的元素,而不需要暴露集合的内部实现细节。原创 2024-02-26 09:41:29 · 469 阅读 · 0 评论 -
.NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
设计模式不是一种具体的编程语言特性或语法,而是一种通用的设计思想或模板,可以帮助开发人员设计出结构良好、易于理解、可扩展和可维护的软件系统。假设我们正在开发一个计算机游戏,其中有多种不同类型的角色(如玩家角色、敌人角色等),每种角色都有自己的能力和行为。这样,当我们需要添加新的角色类型时,只需要修改工厂类即可,而不需要修改现有的代码。提高代码的重用性:设计模式提供了经过验证的解决方案,可以帮助开发人员设计出可重用的代码,避免重复编写相似的代码。来创建不同类型的角色对象,以及策略模式来处理不同角色的行为。原创 2024-02-26 09:41:04 · 1140 阅读 · 0 评论 -
C#反射学习,利用反射机制尝试写个插件
是一种强大的编程技术,它允许在运行时获取类型信息、调用类型成员(如方法、属性、字段等),以及动态创建类型实例。通过反射,可以在不知道具体类型的情况下操作它们,这在一些特定的场景下非常有用,比如编写通用代码、插件系统等。我们将创建一个接口来定义插件的规范,然后编写一个插件类,实现该接口,并在主程序中使用反射加载和调用插件。主程序将使用反射加载插件程序集,并调用插件的 Run 方法。在C#中,反射是通过System.Reflection命名空间提供的类和方法来实现的。原创 2024-02-22 09:37:09 · 815 阅读 · 0 评论 -
C#的Ioc(Inversion of Control)控制反转原理详解,自己动手简单实现一个Ioc
IoC(Inversion of Control,控制反转)的原理是将程序的控制权从应用程序内部转移到外部容器中,使得对象之间的依赖关系由容器来管理。对象的生命周期可以是短暂的(transient)、单例的(singleton)、作用域的(scoped)等。容器通常提供了灵活的配置方式,可以通过配置文件、代码配置或注解等方式来配置对象的注册和解析。总的来说,IoC 的原理是通过将对象的创建和依赖关系的管理交给外部容器来实现,从而降低了代码的耦合度,提高了代码的可维护性和可测试性。注册对象和解析对象:在。原创 2024-02-21 09:42:41 · 1176 阅读 · 0 评论 -
C# 中数组、链表、Hash的优缺点
所以,选择合适的数据结构取决于具体的应用场景和需求。数组适用于需要快速访问元素和固定长度的场景,链表适用于频繁的插入和删除操作,而哈希表则适用于需要快速查找和存储大量数据的场景。在 C# 中,数组(Array)、链表(LinkedList)和哈希表(Hash)是常用的数据结构,每种都有其自身的优缺点。原创 2024-02-21 09:42:15 · 614 阅读 · 0 评论 -
.NET高级面试指南专题九【 泛型概念,常用泛型类和方法,泛型约束,协变与逆变】
C#中的泛型(Generics)是一种强大的编程特性,它允许你在编写代码时使用不特定数据类型,而在编译时确定这些数据类型。泛型使得代码更加灵活、可重用,并提高了类型安全性原创 2024-02-20 10:09:56 · 1208 阅读 · 0 评论 -
.NET高级面试指南专题八【 垃圾回收机制GC】
总体而言,.NET的垃圾回收机制是CLR(Common Language Runtime)的一部分,它通过自动追踪和释放不再使用的对象,确保.NET应用程序的内存使用是高效和可靠的。需要注意的是,垃圾回收的触发时机是由垃圾回收器实现决定的,具体情况可能会因编程语言、运行时环境和垃圾回收算法的不同而异。垃圾回收的触发条件一般与各代的内存使用情况相关。例如,新生代的触发条件可能是新生代的内存空间即将用完,中生代的触发条件可能是新生代的回收次数达到一定阈值,老生代的触发条件可能是老生代的内存空间即将用完。原创 2024-02-17 09:36:22 · 1303 阅读 · 0 评论 -
.NET高级面试指南专题七【Socket&WebSocket】
HTTP协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。request的Header是非常长的,为了传输一个很小的数据 需要付出巨大的代价,是很不合算的,占用了很多的宽带。展示了一个基本的服务器和客户端通信。以前网站上的即时通讯是很常见的,比如网页的QQ,聊天系统等。原创 2024-02-14 08:49:56 · 1339 阅读 · 0 评论 -
.NET高级面试指南专题六【线程安全】5种方法解决线程安全问题
多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题。所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。是指在多线程环境中,对共享资源的访问不会导致数据不一致或不确定的结果。在C#中,确保线程安全是至关重要的,因为多个线程并发地访问共享的数据结构可能导致竞态条件(race condition)和数据污染。提供原子操作,可以在不使用锁的情况下确保对共享资源的安全访问。原创 2024-02-10 09:50:35 · 723 阅读 · 0 评论 -
.NET高级面试指南专题五【线程池】
每个进程都有一个线程池,一个进程中只能有一个实例,它在各个应用程序域(AppDomain)是共享的,线程池仅仅保留相当少的线程,保留的线程可以用SetMinThread这个方法设置,当程序需要一个线程时,线程池中没有空闲的线程时,线程池就会负责创建这个线程,调用完后,不会立即销毁,而是把它放在池子里,以备下次使用,但是,如果超出一定时间没使用,线程池就会回收线程,所以线程池里存在的线程数实际是个动态的过程。减少线程创建的开销: 线程的创建和销毁会消耗大量资源,通过线程池可以重用现有线程,减少这些开销。原创 2024-02-07 14:54:07 · 1163 阅读 · 0 评论 -
【C#奇淫技巧】类继承接口,怎么直接调用接口里面已经写好的函数
3.是我要说的一种更方便的方式,定义一个接口,包含通用方法的实现,然后让多个类调用接口。如果某些方法我在多个类里面都会通用,我们一般有几种方法可以实现?原创 2024-02-04 09:57:33 · 583 阅读 · 0 评论 -
.NET高级面试指南专题四【异步和多线程】
异步和多线程是两个不同的概念,不能这样比较.异步请求一般用在IO等耗时操作上,他的好处是函数调用立即返回,相应的工作线程立即返还给系统以供重用。若使用异步方式,用这些固定数目的线程在固定的时间内就可以服务更多的请求,而如果用同步方式,那么每个请求都自始至终占用这一个线程,服务器可以同时服务的请求数就少了。当异步操作执行完成后,系统会从可用线程中选取一个执行回调程序,这时的这个线程可能是刚开始发出请求的那个线程,也可能是其他的线程,因为系统选取线程是随机的事情,所以不能说绝对不是刚开始的那个线程。原创 2024-01-28 12:26:52 · 1252 阅读 · 0 评论 -
.NET高级面试指南专题三【线程和进程】
进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高。通信机制上面,正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。原创 2024-01-28 12:26:33 · 493 阅读 · 0 评论 -
NET高级面试指南专题二【泛型】
答案:常见的泛型约束包括where T : class(T必须是引用类型)、where T : struct(T必须是值类型)、where T : new()(T必须有无参数的构造函数)、where T : SomeInterface(T必须实现某个接口)等。答案:泛型是一种C#中的编程机制,允许我们在编写类、方法、接口时使用通用类型,提高了代码的重用性、类型安全性和性能。答案:非泛型代码在编写时需要明确指定数据类型,而泛型代码在编写时使用通用类型,可以在编译时指定具体的类型。原创 2024-01-27 14:07:06 · 682 阅读 · 0 评论