C#面试精华:null字符串差异、类与struct对比及多线程安全

需积分: 11 3 下载量 33 浏览量 更新于2024-11-06 收藏 18KB DOCX 举报
在C#面试题中,面试官通常会关注程序员对基础语法和概念的理解深度。以下是几个关键知识点的详细解析: 1. **string str = null vs string str = ""**: 在C#中,`string str = null` 表示将变量str设置为`null`,这表明str没有指向任何有效的字符串对象。这时,str并没有占用任何内存空间,因为它并不指向一个已存在的字符串实例。然而,`string str = ""` 是创建了一个空字符串对象,系统会为这个对象分配内存,即使它的内容为空。当你试图访问str的属性或方法时,会抛出异常,因为null引用没有实际内容。 2. **类(class)与结构(struct)**: C#中的类(Class)与结构(Struct)的主要区别在于内存管理和行为。类是引用类型,当你声明一个类的实例时,实际上是创建了一个对象的引用,并将其存储在堆内存中。这意味着类的对象可以有状态(成员变量)且支持继承和多态。相反,结构(Struct)是值类型,它们在栈上分配内存,每次创建新实例时都会复制整个数据结构,不支持继承,但通常更轻量级,适用于小对象的性能优化。 3. **委托(delegate)的使用**: 委托是一种类型的别名,用于封装方法,允许你在不关心具体实现的情况下,将方法作为参数传递。在给出的代码中,`OnDBOperate OnNew;` 是一个委托声明,表示一个接受无参数且返回类型为void的方法。在`toolBar_ButtonClick`方法中,当事件触发时,如果`OnNew`委托不为null,就可以调用它,传递当前的sender和事件参数。 4. **字符串编码和长度计算**: `string strTmp = "abcdefg某某某";` 这行代码创建了一个包含中文字符的字符串。`System.Text.Encoding.Default.GetBytes(strTmp)` 将字符串转换为字节数组,中文字符占用2个字节,所以`i = System.Text.Encoding.Default.GetBytes(strTmp).Length` 的结果是13,因为有6个英文字符加上5个中文字符(10个英文字符编码为10*1+2=12,加上最后的两个空位)。而`j = strTmp.Length` 只计算了字符数量,包括中文字符,所以`j = 10`。 5. **SQL查询获取最新更新的事务号**: 使用SQL的子查询和`MAX`函数,你可以找出`LastUpdateDate`字段的最新值,然后通过`WHERE`子句找到具有该日期的事务号。查询语句如下: ```sql SELECT ID FROM table1 WHERE LastUpdateDate = (SELECT MAX(LastUpdateDate) FROM table1) ``` 6. **线程安全与死锁分析**: 题目没有提供具体的test方法,但从一般的角度分析,如果`test`方法在没有适当的同步机制时试图修改共享资源(如i变量),并且存在多个线程同时读取和写入的情况,可能会导致死锁。如果`i > 10`的条件在修改i的过程中检查,而其他线程也在等待某个条件导致i的改变,就可能导致死锁。为了防止死锁,必须确保线程间的资源请求顺序一致,并使用锁或其他并发控制机制。 面试时,这些问题旨在考察应聘者的基础理论知识,以及他们在实际编程中的应用能力。准备充分,理解这些概念的细微差别,可以帮助你在面试中表现出色。