1. 项目概述
"C#.NET必备50道面试题(初级)31~40道"是一份面向初级开发者的技术面试指南,聚焦C#和.NET框架的核心知识点。作为系列文章的第四部分,它延续了前30道题目的风格,针对具有1-3年经验的开发者设计,涵盖了从基础语法到常用框架的实战考察点。
在当前的就业市场中,C#/.NET开发岗位的初级面试往往围绕语言特性、框架理解和基础编码能力展开。这10道题目精选自真实面试场景,既包含经典的语法题,也融入了.NET Core等现代技术栈的考察要素。通过这些问题,面试官可以快速评估候选人对类型系统、集合操作、异步编程等基础概念的掌握程度。
2. 核心知识点解析
2.1 接口与抽象类对比
接口(Interface)和抽象类(Abstract Class)是面向对象编程中最容易混淆的概念之一。在C#中:
// 接口示例
public interface ILogger
{
void Log(string message);
}
// 抽象类示例
public abstract class LoggerBase
{
public abstract void Log(string message);
public virtual void Flush()
{
// 默认实现
}
}
关键区别在于:
- 接口仅包含方法签名(C#8.0前),而抽象类可包含实现
- 类可实现多个接口但只能继承单个抽象类
- 接口成员默认public,抽象类可定义访问修饰符
- 接口更适合定义契约,抽象类适合共享基础实现
实际面试中常要求举例说明何时使用接口而非抽象类。比如当需要跨不同类层次结构实现相同功能时(如序列化能力),接口是更合适的选择。
2.2 集合与泛型
List 和Dictionary<K,V>是面试高频考点。以下代码演示了常见陷阱:
var list = new List<int> { 1, 2, 3 };
foreach (var item in list)
{
if (item == 2)
list.Remove(item); // 抛出InvalidOperationException
}
解决方案是使用for循环或创建副本:
for (int i = list.Count - 1; i >= 0; i--)
{
if (list[i] == 2)
list.RemoveAt(i);
}
2.3 异步编程模式
从早期的Begin/End模式到现在的async/await,C#的异步编程不断演进。关键知识点包括:
// 正确用法
public async Task<string> FetchDataAsync()
{
using var client = new HttpClient();
return await client.GetStringAsync("https://api.example.com");
}
// 反模式:async void
private async void Button_Click(object sender, EventArgs e)
{
await Task.Delay(1000); // 异常无法捕获
}
常见面试问题包括:
- Task vs Thread的区别
- ConfigureAwait(false)的应用场景
- 异步方法中的异常处理
3. 典型面试题详解
3.1 第31题:值类型与引用类型
题目:解释C#中值类型和引用类型的区别,并说明装箱/拆箱操作的影响。
参考答案: 值类型(int, struct等)直接存储数据,分配在栈上;引用类型(class, string等)存储数据地址,分配在堆上。装箱是将值类型转换为引用类型的过程:
int i = 123;
object o = i; // 装箱
int j = (int)o; // 拆箱
装箱会导致:
- 内存分配开销


2350

被折叠的 条评论
为什么被折叠?



