在C#面试准备过程中,理解语言底层机制与日常编码习惯同样重要。下面整理几道出现频率较高的题目,并给出清晰解答与示例代码。

值类型与引用类型的区别是什么
这是最基础的C#面试题之一。值类型直接存储数据,引用类型存储指向托管堆中对象的引用。
- 值类型包括 int、struct、enum,分配在栈或内联于包含类型中
- 引用类型包括 class、string、delegate,实例分配在托管堆
- 赋值行为不同:值类型赋值复制全部数据,引用类型赋值只复制引用地址
async和await是如何实现异步的
async和await是C#简化异步编程的语法糖。编译器会将异步方法转换为状态机,在 awaited 任务未完成时把控制权交还调用方,完成后通过上下文继续后续代码。
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Demo
{
// 异步获取网页内容长度
static async Task<int> GetLengthAsync(string url)
{
using (HttpClient client = new HttpClient())
{
string html = await client.GetStringAsync(url);
return html.Length;
}
}
static async Task Main()
{
int len = await GetLengthAsync("https://ipipp.com");
Console.WriteLine("长度:" + len);
}
}
简要说明C#的垃圾回收机制
CLR的垃圾回收器(GC)自动管理托管堆内存。它通过可达性分析标记存活对象,回收不可达对象并压缩堆。分代回收提升效率,分为0、1、2代,新对象在0代,存活久的晋升到更高代。
| 代 | 说明 |
|---|---|
| 0代 | 新分配对象,回收最频繁 |
| 1代 | 0代回收后存活的对象 |
| 2代 | 大对象及长期存活对象 |
什么是装箱和拆箱
装箱指将值类型转换为 object 或接口类型,会在堆上分配对象;拆箱是将引用类型转换回值类型。频繁装箱拆箱影响性能,应使用泛型避免。
面试中能结合代码说明装箱代价,往往比单纯背概念更得分。
示例代码
int num = 10; object boxed = num; // 装箱 int unboxed = (int)boxed; // 拆箱
string和StringBuilder有何不同
string是不可变类型,每次拼接都生成新对象;StringBuilder在内部可变缓冲区操作,适合大量字符串拼接场景。
using System.Text;
StringBuilder sb = new StringBuilder();
sb.Append("a");
sb.Append("b");
string result = sb.ToString();
以上题目覆盖了C#面试中常被问到的核心点。复习时建议动手写代码验证,并理解背后原理,这样在真实面试中才能灵活应对。