朝花夕拾_面试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  阅读(43)  评论(0)    收藏  举报