主题
试题列表(真实面试250610)
1. string str = null 和 ""、string.Empty 有什么区别?
解答
null:表示字符串引用为空,没有分配堆内存实例,调用任何实例方法会抛出NullReferenceException;"":空字符串实例,已分配内存,长度为0,是合法字符串对象;string.Empty:静态只读空字符串常量,本质等价于"",更规范、节省重复实例开销,推荐业务使用。
2. String 和 StringBuilder 有什么区别?
解答
string(String):不可变字符串,每次修改、拼接都会生成新对象,频繁操作会产生大量内存垃圾;StringBuilder:可变字符容器,内部维护字符缓冲区,增删拼接不会新建对象,循环高频拼接场景性能更强;- 适用场景:短字符串简单操作用
string;循环拼接、大量文本组装使用StringBuilder。
3. 接口和抽象类的区别是什么?
解答
| 对比项 | 接口interface | 抽象类abstract class |
|---|---|---|
| 继承限制 | 支持多实现 | 仅支持单继承 |
| 成员限制 | 无字段、无构造函数(C#8前仅抽象成员) | 可包含字段、构造函数、普通方法 |
| 访问修饰 | 默认public | 可自定义public/private/protected |
| 设计目的 | 定义行为规范、能力契约 | 抽取公共代码、实现模板复用 |
4. 委托是什么?在什么场景下使用?
解答
委托是一种方法类型安全的引用类型,可以将方法作为参数传递、存储与调用;- 内置常用委托:
Func<T>(带返回值)、Action(无返回值)、Predicate<T>(返回布尔); - 适用场景:回调函数、事件绑定、异步回调、策略模式、解耦业务逻辑、批量方法执行。
5. 如何实现懒汉式单例?
解答
线程安全懒汉式(双重检查锁 DCL) 标准实现:
csharp
public class Singleton
{
private static Singleton _instance;
private static readonly object _lockObj = new object();
// 私有构造,禁止外部实例化
private Singleton() { }
public static Singleton GetInstance()
{
if (_instance == null)
{
lock (_lockObj)
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}懒汉特点:首次使用才创建实例,延迟加载,节省资源。
6. 数据库中死锁的成因与解决方案?
解答
成因
- 多个事务互相持有对方需要的锁,循环等待资源释放;
- 事务执行顺序不一致、长事务、不合理的锁级别(行锁升级表锁)。
解决方案
- 统一数据表操作执行顺序,避免循环等待;
- 缩短事务执行时长,避免事务中嵌套复杂逻辑;
- 合理设置隔离级别,减少悲观锁使用;
- 开启数据库死锁检测,自动回滚牺牲较小事务;
- 使用
nolock查询、乐观锁(版本号)规避锁竞争。
7. 如何设计一个积分模块?(支持过期、优先扣除)
解答
- 数据表设计
- 用户积分主表:记录总积分、冻结积分、可用积分;
- 积分流水表:记录增减、来源、过期时间、积分批次、状态。
- 核心规则
- 积分批次化管理:每笔发放积分绑定
过期时间; - 扣除策略:采用先过期先扣除原则,优先消耗即将到期积分;
- 定时任务:定时清理过期积分、扣减失效额度。
- 核心能力
- 积分发放、消费、退回、冻结/解冻;
- 过期自动失效、流水溯源查询;
- 分布式场景增加分布式锁,防止超扣、并发异常。