如何通过C#面试:常见问题与解答
C#/.NET 开发人员面试既考察对平台的理论知识,也检验实际编码技能。雇主希望看到的不仅是一个能写代码的人,而是一位了解 .NET 内部机制、内存管理、异步编程和 SOLID 原则的工程师。
在本文中,我们整理了C#面试中最常被问到的 十大问题。您将不仅学到正确答案,还能了解面试官特别关注的 陷阱。本文对初级开发者和中级专家都同样有用。
1. C# 面向对象编程基础问题
不理解面向对象编程,就不可能通过C#面试。面试官不仅考察定义,还考察在实践中的应用能力。
C# 实现了哪些 OOP 原则?
C# 完全支持面向对象编程的四大支柱:
- 封装 — 通过访问修饰符(
private、protected、internal)隐藏内部实现。 - 继承 — 一个类可以从一个基类继承行为(单继承)。
- 多态 — 通过单一接口操作不同类型的能力(虚方法、抽象类)。
- 抽象 — 突出对象的本质特征,忽略非本质特征(接口、抽象类)。
示例问题:"抽象类和接口有什么区别?"
这是一个经典问题。关键区别在于,接口仅定义契约(没有实现的方法签名),而抽象类可以包含实现和状态(字段)。在C#中,从8.0版本开始,接口可以包含默认实现,但这并不否定概念上的差异。
// 抽象类public abstract class Animal{ public string Name { get; set; } public abstract void MakeSound(); // 无实现 public void Sleep() => Console.WriteLine("Zzz..."); // 有实现}
// 接口public interface IMovable{ void Move(); // 仅契约}2. 内存管理与垃圾回收器
理解GC的工作原理是经验丰富的开发人员的标志。这方面的题目通常作为初级与中级开发者的分水岭。
.NET 中的垃圾回收器是如何工作的?
GC 在托管堆上工作,释放不再被引用的对象所占用的内存。它采用代际模型(第0代、第1代、第2代):
- 第0代 — 短期存对象(最常被清理)。
- 第1代 — 第0代和第2代之间的缓冲区。
- 第2代 — 长期存对象(很少被清理)。
示例问题:"什么是终结器和 IDisposable?"
终结器(~ClassName())在释放内存前由GC调用,但其执行时间是不确定的。为了确定性清理非托管资源,使用 IDisposable 模式:
public class ResourceHolder : IDisposable{ private bool _disposed = false;
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }
protected virtual void Dispose(bool disposing) { if (_disposed) return; if (disposing) { /* 释放托管资源 */ } /* 释放非托管资源 */ _disposed = true; }
~ResourceHolder() => Dispose(false);}3. 异步编程:async/await
现代C#面试很少有不问异步编程问题的。这是一个关键主题