C#面试题汇总:字符串、类和结构、委托、线程安全

需积分: 10 2 下载量 14 浏览量 更新于2024-07-28 1 收藏 84KB DOC 举报
C# 面试题详解 以下是对给定文件中的知识点的详细解释: **1. string str = null 与 string str = "" 的区别** 在 C# 中,string 是一个引用类型,具有两个不同的状态:null 和空字符串("")。当我们将 string 变量设置为 null 时,就是说我们没有为该变量分配任何内存空间。相反,当我们将 string 变量设置为空字符串("")时,我们实际上为该变量分配了一个长度为 0 的内存空间。 在内存中,null 变量不占用任何空间,而空字符串("")变量则占用了一个长度为 0 的空间。这种区别对于我们在编程中处理字符串时非常重要。 **2. 类 (class) 和结构 (struct) 的异同** 在 C# 中,类 (class) 和结构 (struct) 都是用户定义的类型,但是它们有着根本的区别。 类 (class) 是一个引用类型,它们的实例是分配在内存的堆 (heap) 上的。这意味着,当我们创建一个类的实例时,系统会在堆上分配一个新的内存空间,并将该实例的引用返回给我们。 结构 (struct) 则是一个值类型,它们的实例是分配在内存的栈 (stack) 上的。这意味着,当我们创建一个结构的实例时,系统会在栈上分配一个新的内存空间,并将该实例的副本返回给我们。 **3. 委托 (delegate) 的应用** 委托 (delegate) 是一个类型安全的函数指针,它允许我们将方法作为参数传递或从方法中返回。在上面的代码中,我们定义了一个名为 OnDBOperate 的委托,该委托表示一个没有参数的方法。 在 UserControlBase 类中,我们定义了一个名为 OnNew 的事件,该事件是 OnDBOperate 委托类型的。当我们点击工具栏按钮时,我们需要调用 OnNew 事件。在这个方法中,我们首先检查 OnNew 是否为空,如果不为空,则调用 OnNew 委托。 **4. 字符串编码和长度** 在这个问题中,我们需要分析以下代码的执行结果: ```csharp string strTmp = "abcdefg某某某"; int i = System.Text.Encoding.Default.GetBytes(strTmp).Length; int j = strTmp.Length; ``` 在这个代码中,我们首先定义了一个字符串 strTmp,然后使用 System.Text.Encoding.Default.GetBytes 方法将其转换为字节数组,并将该数组的长度赋值给 i。最后,我们将 strTmp 的长度赋值给 j。 执行完毕后,i 的值为 13,因为 Default 编码将每个 Unicode 字符编码为 2 个字节,而 strTmp 中有 6 个 Unicode 字符。j 的值为 10,因为 strTmp 的长度为 10 个 Unicode 字符。 **5. SQL SERVER 服务器的查询** 在这个问题中,我们需要使用一句 SQL 语句获得最后更新的事务号。在 SQL SERVER 中,我们可以使用以下语句: ```sql Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1) ``` 这个语句首先使用子查询获得表 table1 中的最大 LastUpdateDate,然后使用该日期获得最后更新的事务号。 **6. 线程安全的相关知识** 在这个问题中,我们需要分析以下代码的执行结果: ```csharp public class MyClass { private int i = 0; public void Test() { for (int j = 0; j < 10; j++) { i++; if (i > 10) { // do something } } } } ``` 在这个代码中,我们定义了一个名为 MyClass 的类,该类具有一个私有整型字段 i 和一个名为 Test 的方法。在 Test 方法中,我们使用一个循环将 i 逐步递增,并检查 i 是否大于 10。如果 i 大于 10,我们将执行某些操作。 在多线程环境中,这个代码可能会出现问题,因为多个线程可能会同时访问和修改 i 字段,导致不确定的结果。为了解决这个问题,我们需要使用线程安全的机制,例如锁机制或原子操作。