亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C# 面试题精选 50 道(2021 版)—— 面向初学者与资深开发者

C# 是一种运行在 .NET 框架上的多功能、面向对象的编程语言。它广泛应用于 ASP.NET Web 应用、桌面软件开发,甚至通过 Unity 引擎用于游戏开发。如果你正在寻求 C# 相关职位,掌握这些高频面试题将帮助你向招聘经理展示扎实的知识广度与深度。

下面整理了最常见的 C# 面试题,涵盖从初学者基础到资深开发者进阶的各个层面。每道题后附有简洁权威的参考答案,反映行业最佳实践。

免费 PDF 下载:C# 面试题合集

C# 基础面试题(适合 0-5 年经验)

这些问题考察基本概念、语法及常见陷阱,是面试官期望候选人必须掌握的核心内容。

1. 什么是 C#?

C# 是一种静态类型、类型安全、面向对象的语言,由 .NET 运行时编译为 Microsoft 中间语言 (MSIL) 执行。

2. 说明 C# 中的注释类型并举例

• 单行注释:// 这是单行注释
• 多行注释:/* 这是多行注释
可以跨越多行 */

• XML 文档注释:/// <summary>设置错误消息</summary>

3. 多个 catch 块能否同时执行?

不能。一旦匹配到某个 catch 块并执行,控制流会转至 finally 块(若存在),随后继续执行 try-catch 结构之后的代码。

4. public、static、void 有何区别?

public – 任何引用该类型的代码均可访问。
static – 属于类型本身,而非某个实例。
void – 表示方法不返回值。

5. 什么是对象?

对象是类的实例,通过 new 关键字创建。它提供对类成员(方法、属性、字段)的访问。

6. 什么是构造函数?

构造函数是与类同名的特殊方法,在实例创建时自动运行,用于初始化字段和执行设置逻辑。

7. 什么是交错数组?

交错数组是“数组的数组”,每个元素可引用不同长度的数组,从而实现不规则数据结构。

8. ref 与 out 参数的区别?

ref 要求调用前变量已初始化。out 无需初始化,但被调用方法必须在返回前赋值。

9. C# 中 using 语句的作用?

using 块确保实现 IDisposable 的资源在块结束时自动释放,即使发生异常也能保证释放。

10. 什么是序列化?

序列化将对象转换为字节流以便存储或传输;反序列化则是逆过程,重建对象。类型需标记 [Serializable] 或实现 ISerializable。

11. static 方法中能否使用 this 关键字?

不能。this 指向当前实例,而静态方法不属于任何实例。

12. 常量与只读字段的区别?

常量是编译时确定的值,不可更改。只读字段在运行时赋值一次(内联或在构造函数中),此后不可修改。

C# 进阶面试题(适合 3-10 年经验)

13. 什么是接口?请举例。

接口声明一组方法和属性的契约,不包含实现。示例:

public interface IGreeter { void SetName(string name); string Greet(); } public class FriendlyGreeter : IGreeter { private string _name; public void SetName(string name) => _name = name; public string Greet() => $"Hello, {_name}!"; }

14. 值类型与引用类型的区别?

值类型(如 int、struct)直接在栈上存储数据。引用类型(如 class、string)在堆上存储对象,栈上仅保存引用。

15. 自定义控件与用户控件的区别?

自定义控件编译为 DLL,可直接拖放到窗体。用户控件(.ascx)由现有控件组合而成,适合复用 UI 组件。

16. 什么是密封类?

密封类不可被继承。sealed 修饰符阻止子类化,确保类行为不被改变。

17. 什么是方法重载?

方法重载允许多个同名方法共存,但参数列表不同。编译器根据实参选择合适的重载版本。

18. Array 与 ArrayList 的区别?

Array 大小固定且元素类型单一。ArrayList(现多由 List<T> 替代)大小动态且存储 object 类型。

19. 私有虚方法能否被重写?

不能。私有方法对派生类不可见,因此无法重写。

20. 说明 protected internal 访问修饰符。

标记为 protected internal 的成员,在同一程序集内或其他程序集的派生类中均可访问。

21. System.String 与 System.Text.StringBuilder 的区别?

String 不可变,每次修改都会创建新实例。StringBuilder 可变,专为高效字符串操作设计。

22. Array.CopyTo() 与 Array.Clone() 的区别?

Clone() 创建整个数组的浅表副本。CopyTo() 将元素复制到已存在的目标数组中。

23. 如何对数组进行降序排序?

先用 Array.Sort() 升序排序,再用 Array.Reverse() 反转;或提供自定义比较器。

24. C# 捕获异常的语法示例。

示例:

try { GetAllData(); } catch (Exception ex) { // 处理错误 }

25. 接口与抽象类的区别?

接口仅声明签名,所有成员隐式为 public 抽象。抽象类可提供具体实现和私有成员。

26. Finalize() 与 Dispose() 的区别?

Dispose 显式释放非托管资源,确定性强。Finalize(析构函数)由 GC 调用,非确定性。

27. 什么是循环引用?

两个或多个对象相互引用,可能阻碍垃圾回收,导致内存泄漏。

28. C# 中的泛型是什么?

泛型实现类型安全的可复用代码(如 List<T>),减少运行时装箱拆箱,提升性能。

29. .NET 中的对象池是什么?

.NET 对象池维护一组已初始化的对象供重复使用,减少昂贵的分配和垃圾回收开销。

30. 列举 .NET 常见异常类型。

ArgumentException、ArgumentNullException、ArgumentOutOfRangeException、ArithmeticException、DivideByZeroException、OverflowException、IndexOutOfRangeException、InvalidCastException、InvalidOperationException、IOException、NullReferenceException、OutOfMemoryException、StackOverflowException 等。

31. 什么是自定义异常?

自定义异常是继承自 Exception 的用户定义类型,针对特定错误场景。

32. 什么是委托?

委托是类型安全的函数指针,支持回调和事件处理。

33. C# 中如何继承类?

使用冒号语法:

public class Derived : Base { }

34. 所有 .NET 类派生的基类是什么?

System.Object。

35. 方法重写与重载的区别?

重写改变虚方法在派生类中的实现。重载创建同名但签名不同的多个方法。

36. 方法重载的不同方式?

通过改变参数类型、顺序或数量。

37. 为什么接口中的方法不能指定访问修饰符?

接口成员隐式为 public,显式指定修饰符会冗余。

38. 如何允许类被继承但禁止方法被重写?

在非密封类中将该方法声明为 sealed。

39. 继承的接口若有同名方法冲突怎么办?

在派生类中实现一次该方法,确保满足所有接口契约。

40. 结构体与类的区别?

结构体是值类型,存储在栈上,不支持继承,习惯设计为不可变。类是引用类型,存储在堆上。

41. .NET 中如何使用可空类型?

在值类型后加 ?:

int? id = null; if (id.HasValue) { /* 使用 id.Value */ }

42. 如何创建非默认值的数组?

使用 Enumerable.Repeat 或集合初始化器。

43. is 与 as 运算符的区别?

is 检查类型兼容性并返回布尔值。as 尝试转型,失败返回 null。

44. 什么是多播委托?

引用多个方法的委托;调用时按顺序依次执行所有挂载的方法。

45. C# 中的索引器是什么?

索引器让对象像数组一样通过索引访问:

public int this[int index] { get { … } set { … } }

46. throw 与 throw ex 的区别?

throw 保留原始堆栈跟踪;throw ex 重置堆栈跟踪,增加调试难度。

47. C# 特性及其意义?

特性为类型和成员添加元数据,运行时可通过反射查询。

48. 如何实现单例模式?

示例:

public sealed class Singleton { private static readonly Singleton _instance = new Singleton(); public static Singleton Instance => _instance; private Singleton() { } }

49. DirectCast 与 CType 的区别?

DirectCast 要求运行时类型与目标类型完全匹配。CType 执行目标类型定义的转换,可能调用转换运算符。

50. C# 是托管代码还是非托管代码?

C# 是托管代码;CLR 将其编译为 MSIL 并负责内存管理。

51. 什么是控制台应用程序?

控制台应用在命令提示符窗口运行,通常是 .NET 初学者的第一步。

52. 从队列移除元素的示例

使用 Dequeue() 移除队首元素:

Queue<int> queue = new Queue<int>(); queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); int removed = queue.Dequeue(); // removed = 1

C语言

  1. Robotics & Automation News宣布2021年颁奖典礼 虚拟活动定于年底举行
  2. 智能制造2021:重塑生产的10大新兴趋势
  3. 2019 供应链金融:趋势、挑战与关键问题
  4. MEO 四级电气口试:核心问答与实操指南
  5. CNC 车间无人值守制造:常见问题与实施指南
  6. 2021 年度压缩空气与气体热门文章 TOP 5:关键创新与行业标准
  7. 驱动最终用户体验与性能的关键云指标
  8. 2024云计算面试宝典:专家精选高频题与标准答案
  9. 2017 年 IIoT 系统工程师与架构师必备 5 大资源
  10. 5G 面临的五大挑战:频谱、成本、覆盖、设备与安全
  11. 5G与边缘计算:2021年新兴网络安全挑战
  12. 2021 年 Windows/macOS/Linux 十大 C# IDE 评测