尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

C#.NET初级面试题解析:接口、集合与多线程

C#.NET初级面试题解析:接口、集合与多线程 1. C#.NET初级面试题精选31~40道解析刚入行那会儿我总以为把语法背熟就能应付面试直到被面试官连续追问为什么用抽象类而不用接口时才意识到基础概念理解的重要性。这10道题覆盖了C#初级开发者最常遇到的接口、集合、异常处理等核心知识点每个问题背后都藏着实际开发中的典型应用场景。2. 核心题目解析与实战要点2.1 接口与抽象类第31~33题31. 接口和抽象类的主要区别是什么接口(Interface)是行为的契约抽象类(Abstract Class)是不完全的类型定义。实际开发中接口适合定义跨继承体系的能力如IDisposable抽象类适合为派生类提供公共实现如Stream基类踩坑记录接口新增方法会破坏所有实现类而抽象类可以添加带默认实现的方法32. 什么时候该用接口而不是抽象类需要多重继承时C#不支持类多继承定义服务契约时如WCF接口团队协作时规范模块边界33. 显式接口实现的作用interface ILogger { void Log(); } class FileLogger : ILogger { void ILogger.Log() { } // 显式实现 }解决命名冲突当实现多个接口有同名方法时隐藏非核心功能通过强制类型转换访问2.2 集合与泛型第34~36题34. ArrayList和List 的根本区别ArrayList arr new ArrayList(); // 非泛型装箱拆箱开销 Listint list new Listint(); // 类型安全性能更好实测10万次插入操作ListT比ArrayList快3倍以上35. Dictionary的哈希冲突解决机制拉链法每个桶(bucket)存储链表自动扩容当元素数 容量*0.72时重建哈希表36. IEnumerable和IQueryable的核心差异// IEnumerable客户端过滤所有数据加载到内存 var local db.Users.AsEnumerable().Where(xx.Age20); // IQueryable服务端过滤生成SQL语句 var remote db.Users.Where(xx.Age20);2.3 异常处理第37~38题37. finally块在return之后执行吗string Test() { try { return try; } finally { Console.Write(finally); } } // 输出顺序finally → try即使有return或异常finally也必定执行。常用于释放资源38. 自定义异常的最佳实践继承Exception而非ApplicationException提供至少三个构造函数无参、消息、消息内联异常类名以Exception结尾序列化支持加[Serializable]特性2.4 多线程基础第39~40题39. lock关键字的实现原理基于Monitor.Enter/Monitor.Exit锁对象应是私有引用类型避免字符串驻留等问题private readonly object _lock new object(); lock(_lock) { /* 临界区 */ }40. Task.Run和直接new Thread的区别特性Task.Runnew Thread线程来源线程池新建线程开销低高异常处理通过AggregateException捕获直接抛出返回值支持有无3. 高频误区与调试技巧3.1 接口设计常见陷阱过度细分接口导致接口污染版本兼容问题新增方法破坏现有实现误用显式实现导致单元测试困难3.2 集合使用性能优化预分配容量ListT初始化时指定容量避免在循环中查询Count属性特别对于LinkedList字典查找前先用ContainsKey检查避免异常开销3.3 多线程调试技巧VS的并行堆栈窗口查看所有线程调用栈给线程命名Thread.CurrentThread.Name使用ThreadPool.GetAvailableThreads监控线程池状态4. 实战模拟题场景电商订单处理系统interface IOrderValidator { bool Validate(Order order); } abstract class OrderProcessorBase { public abstract void Process(Order order); protected void Log(string message) { // 公共日志实现 } } class DiscountOrderProcessor : OrderProcessorBase, IOrderValidator { public bool Validate(Order order) order.Total 100; public override void Process(Order order) { if(!Validate(order)) throw new InvalidOperationException(); // 折扣逻辑... } }问题为什么这里既用接口又用抽象类 答案接口定义验证能力可单独测试抽象类提供日志等公共实现避免重复代码5. 扩展学习建议深入理解yield return与迭代器模式掌握SpanT在高性能场景的应用学习Channel类实现生产者消费者模式研究Record类型与不可变对象设计记得当年第一次被问到IEnumerable延迟执行特性时我在白板上画了整个LINQ查询执行流程。面试官后来告诉我正是这种对原理的深究态度让我脱颖而出。建议每个题目都自己写demo验证光靠死记硬背是经不住追问的。
返回列表