朝花夕拾_面试C#小记
C#软件工程师面试
1. 介绍Json,XML特点、区别、使用场景
1.1.区别
| 特性 | Json | XML | 
|---|---|---|
| 格式 | 轻量级,基于键值对,类似于JavaScript对象 | 标签结构,类似于HTML,具有严格的层次结构 | 
| 可读性 | 较高,简洁易读 | 较低,标签较多,结构复杂 | 
| 数据体积 | 较小,占用带宽较少 | 较大,标签和属性增加了数据量 | 
| 解析速度 | 较快,解析简单 | 较慢,解析复杂 | 
| 扩展性 | 较差,结构固定 | 较好,支持自定义标签和复杂结构 | 
| 数据类型支持 | 支持基本数据类型:字符串,数字,布尔等 | 支持复杂数据结构:CDATA,注释等 | 
| 命名空间 | 不支持 | 支持,支持复杂数据模型 | 
| 注释 | 不支持 | 支持 | 
1.2.总结:
JsonJSON在效率上全面优于XML,尤其在解析速度、数据体积和序列化性能方面;XML适合需要复杂数据结构或严格验证的场景,但效率较低;
2. C#中有哪些Timer,各自区别
若timer执行频率为1s1次,任务耗时3s,会发生什么???
1.System.Window.Forms.Timer
- 命名空间:System.Window.Forms
 - 适用场景:winform
 - 特点:
 
- 基于Windows消息循环,依赖于UI线程;
 - 计时器触发的事件在UI线程上执行,因此可以直接更新UI;
 - 精度较低,最小间隔为55ms;
 
2.System.Timer.Timer
- 命名空间:System.Timers
 - 适用场景:多线程环境,适合后台任务。
 - 特点:
 
- 基于线程池,计时器触发的事件在单独的线程上执行。
 - 精度较高,适合需要精确计时的场景。
 - 可以通过 AutoReset 属性设置是否重复触发。
 
3. System.Threading.Timer
- 命名空间:System.Threading
 - 适用场景:多线程环境,适合高性能、低开销的计时任务。
 - 特点:
 
- 基于线程池,计时器触发的事件在单独的线程上执行。
 - 轻量级,性能最优。
 - 需要手动管理计时器的启动和停止。
 
4. System.Diagnostics.Stopwatch
- 命名空间:System.Diagnostics
 - 适用场景:高精度计时,用于性能测试或测量时间间隔。
 - 特点:
 
- 不是真正的计时器,而是用于测量时间间隔的工具。
 - 精度非常高(取决于硬件),适合测量代码执行时间。
 
5. System.Web.UI.Timer
- 命名空间:System.Web.UI
 - 适用场景:ASP.NET Web Forms 应用程序。
 - 特点:
 
- 用于在 Web 页面中实现定时刷新或异步更新(如 AJAX)。
 - 基于服务器端计时,触发回发(PostBack)或异步请求。
 
6. DispatcherTimer
- 命名空间:System.Windows.Threading
 - 适用场景:WPF 应用程序。
 - 特点:
 
- 基于 WPF 的 Dispatcher 队列,事件在 UI 线程上执行。
 - 适合在 WPF 中实现定时更新 UI。
 
7. PeriodicTimer (.NET 6 引入)
- 命名空间:System.Threading
 - 适用场景:异步任务,适合需要异步等待的计时场景。
 - 特点:
 
- 基于异步编程模型,支持 await。
 - 轻量级,适合现代异步编程。
 
对比总结
| 计时器类型 | 适用场景 | 线程模型 | 精度 | 是否支持 UI 更新 | 备注 | 
|---|---|---|---|---|---|
| System.Windows.Forms.Timer | Windows Forms 应用程序 | UI 线程 | 低(55ms) | 是 | 依赖 UI 消息循环 | 
| System.Timers.Timer | 多线程环境 | 线程池 | 高 | 否 | 适合后台任务 | 
| System.Threading.Timer | 多线程环境 | 线程池 | 高 | 否 | 轻量级,性能最优 | 
| System.Diagnostics.Stopwatch | 高精度计时 | 无 | 非常高 | 否 | 用于测量时间间隔 | 
| System.Web.UI.Timer | ASP.NET Web Forms | 服务器端 | 低 | 是 | 用于 Web 页面定时刷新 | 
| DispatcherTimer | WPF 应用程序 | UI 线程 | 低 | 是 | 依赖 WPF Dispatcher | 
| PeriodicTimer | 异步任务 | 异步 | 高 | 否 | 适合现代异步编程(.NET 6+) | 
选择建议
- 如果需要更新 UI,选择 System.Windows.Forms.Timer(WinForms)或 DispatcherTimer(WPF)。
 - 如果需要高性能的后台计时,选择 System.Threading.Timer 或 System.Timers.Timer。
 - 如果需要高精度计时,选择 System.Diagnostics.Stopwatch。
 - 如果需要异步支持,选择 PeriodicTimer(.NET 6+)。
 
3. Winform、Wpf的界面渲染的区别
1. 渲染引擎
WinForms:
- 基于 GDI/GDI+(Graphics Device Interface)进行渲染。
 - GDI/GDI+ 是一种基于 CPU 的渲染技术,适合简单的 2D 图形和控件。
 - 渲染性能受限于 CPU,复杂图形或动画可能会导致性能问题。
 
WPF:
- 基于 DirectX 进行渲染。
 - DirectX 是一种基于 GPU 的渲染技术,支持硬件加速,适合复杂的 2D/3D 图形和动画。
 - 渲染性能更高,尤其是在处理复杂 UI 或动画时。
 
2. 图形模型
WinForms:
- 
使用基于像素的绘图模型。
 - 
控件是简单的矩形区域,渲染方式较为直接。
 - 
不支持矢量图形,缩放时可能会出现锯齿或失真。
 
WPF:
- 
使用基于矢量的绘图模型。
 - 
控件和图形是矢量化的,支持无损缩放和分辨率独立性。
 - 
支持复杂的图形效果(如渐变、阴影、透明度等)。
 
3. UI 声明方式
WinForms:
- 
使用代码(C# 或 VB.NET)动态创建和布局控件。
 - 
设计界面通常通过拖放控件的方式完成,生成的是代码文件(如 Form1.Designer.cs)。
 
WPF:
- 
使用 XAML(eXtensible Application Markup Language)声明式语言定义 UI。
 - 
XAML 是一种基于 XML 的语言,支持数据绑定、样式、模板等高级特性。
 - 
设计界面与逻辑代码分离,便于维护和扩展。
 
4. 数据绑定
WinForms:
- 
数据绑定功能较弱,通常需要手动编写代码来同步数据和 UI。
 - 
支持简单的数据绑定(如绑定到数据源),但功能有限。
 
WPF:
- 
提供强大的数据绑定机制,支持双向绑定、数据验证、数据模板等。
 - 
数据绑定是 WPF 的核心特性之一,能够轻松实现 MVVM(Model-View-ViewModel)模式。
 
5. 控件和样式
WinForms:
- 
控件是固定的,样式和外观受限于操作系统主题。
 - 
自定义控件外观需要重写绘制逻辑,较为复杂。
 
WPF:
- 
控件是完全可定制的,支持通过样式(Style)和模板(Template)重新定义控件的外观和行为。
 - 
支持动态资源、主题和皮肤,能够轻松实现现代化的 UI 设计。
 
6. 动画和特效
WinForms:
- 
动画支持较弱,通常需要手动编写代码实现简单的动画效果。
 - 
复杂的动画或特效可能会导致性能问题。
 
WPF:
- 
内置强大的动画支持,可以通过 XAML 或代码定义动画。
 - 
支持复杂的特效(如模糊、阴影、3D 变换等),且性能较好。
 
7. 分辨率独立性
WinForms:
- 
不支持分辨率独立性,UI 在高 DPI 显示器上可能会出现模糊或布局错乱。
 - 
需要额外处理高 DPI 缩放问题。
 
WPF:
- 
支持分辨率独立性,UI 在不同 DPI 的显示器上能够自动缩放,保持清晰和一致。
 - 
基于矢量的图形和布局系统使其非常适合现代高分辨率显示器。
 
8. 开发效率
WinForms:
- 
适合快速开发简单的桌面应用程序。
 - 
对于复杂的 UI 或现代化设计,开发效率较低。
 
WPF:
- 
适合开发复杂的、现代化的桌面应用程序。
 - 
学习曲线较陡,但一旦掌握,开发效率较高。
 
9. 兼容性和生态系统
WinForms:
- 
历史悠久,生态系统成熟,有大量的第三方控件库。
 - 
兼容性较好,适合维护旧项目。
 
WPF:
- 
生态系统较为现代化,但第三方控件库相对较少。
 - 
适合新项目开发,尤其是需要现代化 UI 的项目。
 
总结
| 特性 | WinForms | WPF | 
|---|---|---|
| 渲染引擎 | GDI/GDI+(CPU 渲染) | DirectX(GPU 渲染) | 
| 图形模型 | 基于像素 | 基于矢量 | 
| UI 声明方式 | 代码驱动 | XAML 声明式 | 
| 数据绑定 | 较弱 | 强大 | 
| 控件和样式 | 固定,自定义复杂 | 完全可定制 | 
| 动画和特效 | 支持较弱 | 强大支持 | 
| 分辨率独立性 | 不支持 | 支持 | 
| 开发效率 | 适合简单应用 | 适合复杂应用 | 
| 兼容性和生态系统 | 成熟,适合旧项目 | 现代化,适合新项目 | 
- 
如果需要快速开发简单的桌面应用,WinForms 是一个不错的选择。
 - 
如果需要开发复杂的、现代化的桌面应用,WPF 更为适合。
 
4. string & StringBuilder
| 特性 | string | StringBuilder | 
|---|---|---|
| 可变性 | 不可变 | 可变 | 
| 内存分配 | 频繁分配新对象 | 动态调整缓冲区,减少分配 | 
| 性能 | 低(频繁修改时) | 高 | 
| 使用场景 | 少量或一次性字符串操作 | 频繁修改或大量字符串操作 | 
| 内存管理 | 较差 | 高效 | 
- 
使用 string:适合字符串内容不频繁变化的场景。
 - 
使用 StringBuilder:适合需要频繁修改字符串内容的场景,尤其是高性能要求的场景。
 
5. 值类型 & 引用类型
| 特性 | 值类型 | 引用类型 | 
|---|---|---|
| 存储位置 | 栈(除非是类的成员) | 堆 | 
| 传递方式 | 按值传递(副本) | 按引用传递(引用副本) | 
| 默认值 | 零值(如 0、false) | null | 
| 性能 | 访问速度快 | 访问速度较慢 | 
| 内存管理 | 自动释放(栈) | 垃圾回收(GC) | 
| 可变性 | 通常不可变(除非是字段) | 可变 | 
| 示例类型 | int、struct、enum | class、string、array | 
- 
值类型:适合存储小型数据,性能高,但灵活性较低。
 - 
引用类型:适合存储大型或复杂数据,灵活性高,但性能较低。
 
6. 抽象类 & 接口
1. 异同点
| 特性 | 抽象类 (Abstract Class) | 接口 (Interface) | 
|---|---|---|
| 定义 | 用 abstract 关键字声明,可以包含抽象方法和具体方法 | 用 interface 关键字声明,只能包含方法签名 | 
| 实现 | 子类通过 override 实现抽象方法 | 类通过 implements 实现接口 | 
| 多继承 | 不支持,一个类只能继承一个抽象类 | 支持,一个类可以实现多个接口 | 
| 字段 | 可以包含字段和属性 | 不能包含字段,只能包含属性 | 
| 构造函数 | 可以有构造函数 | 不能有构造函数 | 
| 访问修饰符 | 方法可以有 public, protected, internal 等 | 方法默认是 public,不能使用其他修饰符 | 
| 默认实现 | 可以提供方法的默认实现 | C# 8.0 开始支持默认实现 | 
| 使用场景 | 适用于有共同基类的类,提供部分通用实现 | 适用于定义行为契约,不关心具体实现 | 
                    
                
                
            
        
浙公网安备 33010602011771号