朝花夕拾_面试C#小记

C#软件工程师面试

1. 介绍Json,XML特点、区别、使用场景

1.1.区别

特性 Json XML
格式 轻量级,基于键值对,类似于JavaScript对象 标签结构,类似于HTML,具有严格的层次结构
可读性 较高,简洁易读 较低,标签较多,结构复杂
数据体积 较小,占用带宽较少 较大,标签和属性增加了数据量
解析速度 较快,解析简单 较慢,解析复杂
扩展性 较差,结构固定 较好,支持自定义标签和复杂结构
数据类型支持 支持基本数据类型:字符串,数字,布尔等 支持复杂数据结构:CDATA,注释等
命名空间 不支持 支持,支持复杂数据模型
注释 不支持 支持

1.2.总结:

  • Json JSON在效率上全面优于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 开始支持默认实现
使用场景 适用于有共同基类的类,提供部分通用实现 适用于定义行为契约,不关心具体实现
posted @ 2025-03-05 23:06  弗里德里希恩格hao  阅读(74)  评论(0)    收藏  举报