C#.NET初级面试题解析:接口、集合与异步编程

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; // 拆箱

装箱会导致:

  1. 内存分配开销
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值