C#面试题目含参考答案(二)

前言

        面试是应聘一个工作岗位的环节,来考察一个人的工作能力与综合素质。在应聘C#程序员或与C#相关岗位时,我们都会被问到一些与.NET、C#、数据库、业务知识或编程思想等问题。

题目

31、值类型和引用类型的区别

参考答案:

1、值类型的数据存储在内存的栈中,引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的;

2、值类型的变量直接存放实际的数据,而引用类型的变量存放的则是内存堆中数据的地址,即对象的引用;

3、值类型继承自System.ValueType,引用类型继承自System.Object;

4、栈的内存分配是自动释放,而堆在.NET中会有GC来释放;

5、值类型存取速度快,引用类型存取速度慢;

6、值变量赋值时,会在栈中保存两个完全相同的值,改变值独立;引用变量赋值时,会拷贝对相同对象的同一个引用,改变变量值实际是改变堆地址对象中的值,会影响另一个引用变量值。

32、string name=null与string name="" 有什么区别

参考答案:string str=null 把这个引用指向了一个null,没有地址没有值的地方,即没分配内存空间;string str="" 把这个引用指向了一个地址,地址里面存的是空的字符,即占用了内存空间。

33、什么是链式委托

参考答案:链式委托也称多播委托是一种委托的使用方式,它将多个委托对象连接成一个链表。当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。

// 定义声明
private delegate void PrintingMethod(object contents);
// 实例化委托 使用其他类的方法
PrintingMethod printingMethod = new PrintingMethod(Log.Printing);
// 添加
printingMethod += Log.End;
// 调用委托实例 一次执行二个方法            
printingMethod("委托调用执行Printing与End方法");
// 删除
printingMethod -= Log.End;

34、序列化有何作用

参考答案:序列化是将对象转换为字节流以将其保存在内存、数据库或文件中的过程。1、保存内存中的各种对象的状态,并且可以把保存的对象状态在读出来;2、可以实现数据的持久化;3、对象数据的远程通信;4、保证对象的完整性和可传递性。

35、委托回调静态方法和实例方法有何区别

参考答案:委托可以回调静态方法或实例方法。委托回调静态方法时,它不需要实例对象。而委托回调实例方法时,需要提供目标对象,方法将在该目标对象上调用,它需要实例对象。

36、StringBuilder有什么作用

参考答案:StringBuilder用于构建可变字符串,并提供了高效地进行字符串拼接和修改的方法。以及常用来和非托管代码交互。

37、描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

参考答案:首先,需要定义一个包含索引器的类或结构体。可以通过在类或结构体内部添加this关键字来创建索引器。然后,指定索引器的返回值类型和参数列表。这些信息将告诉编译器如何调用索引器并获取所需的值。其次,根据自己的需求实现索引器的逻辑。可以使用任意合法的语句、条件判断等来处理索引操作。最后,提供相应的getter(获取特定索引位置上的值)和setter(设置位置上的值)方法。

下面是一个索引器的示例:

public class WeekDays
{
   string[] days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
   // 定义具有表达式体的只有get访问器的索引器
   public int this[string day] => FindDayIndex(day);
   //
   private int FindDayIndex(string day)
  {
       for (int j = 0; j < days.Length; j++)
      {
           if (days[j] == day)
          {
               return j;
          }
      }
  }
}
//使用示例
var week = new DayCollection();
Console.WriteLine(week["Friday"]);

38、ADO.NET 访问数据库的基本步骤是什么?

参考答案:访问数据库的基本步骤是1、创建数据库连接对象;2、打开连接;3、创建命令对象;4、执行SQ语句;5、关闭连接。

示例:

// 声明连接字符串变量
string connectionString = "Persist Security Info=False;Integrated Security=true;Initial Catalog=msdb;server=(local)";
// 创建数据库连接对象
SqlConnection sqlConnection =new SqlConnection(connectionString);
try      
{
   // 打开数据库连接
   sqlConnection.Open();
   // 创建命令对象
   SqlCommand command = sqlConnection.CreateCommand();
   command.CommandType = CommandType.Text;
   // 编写待执行SQL语句
   command.CommandText = @"select * from sysjobs";
   //待执行SQL语句
   SqlDataReader reader = command.ExecuteReader();
}
catch (Exception exception)
{
   throw new Exception(exception.Message)
}
finally
{
   // 关闭数据库连接
   sqlConnection.Close();
}

39、ADO.NET 访问数据库常用的对象有哪些

参考答案:DataConnection=数据库连接对象;Command=执行SQL命令和存储过程;DataReader=向前只读的数据流;DataAdapte=适配器,支持增删查询;DataSet=独立数据集合的数据存储器。

40、ADO.NET中DataSet与DataReader的区别是什么

参考答案:1、获取数据的方式不同:DataReader 为在线操作数据,DataSet 为离线操作数据。2、获取数据的机制不同:DataReader通过ExecuteReader来读取数据;DataSet通过DbDataAdapter.Fill来填充数据。

41、DataSet与DataTable的区别

参考答案:DataSet是数据集,DataTable是数据表,DataSet存储多个DataTable。DataSet和DataTable像是专门存储数据的一个容器,可以将查询数据库得到的结果存储在里面。

42、简单介绍下ADO.NET和ADO主要有什么改进

参考答案:ADO以Recordset存储,而ADO.NET则以DataSet表示,ADO.NET提供了数据集和数据适配器,有利于实现分布式处理,降低了对数据库服务器资源的消耗。

43、列举ADO.NET中的共享类和数据库特定类

参考答案:共享类:DataSet,DataTable,DataRow,DataColumn,DataRealtion,Constraint,DataColumnMapping,DataTableMapping。特定类:根据数据提供程序X=[Sql、Mysql等] (X)Connection,(X)Command,(X)CommandBuilder,(X)DataAdapter,(X)DataReader,(X)Parameter,(X)Transaction。

44、类和对象的区别和关系是什么

参考答案:类是对象的抽象,它属于该类的全部对象提供了统一的抽象描述。类是对象的模板。对象是类的实例。

45、静态字段与非静态字段有什么区别

参考答案:加static修饰字段时,则该字段为静态字段,静态字段不属于某个实例对象,只与类相关联,因此,对静态字段的访问只与类关联,访问时使用类名.字段,实例字段的访问与实例对象关联,访问时使用对象名.字段

46、&和&&的区别

参考答案:&是位运算符表示按位与运算,&&是逻辑运算符表示逻辑与。

示例:

// 定义一个布尔变量 x
bool x = true;
// 定义一个布尔变量 y
bool y = false;
// 两个变量进行逻辑与运算
bool result = (x && y);  //结果为false

// 20的二进制为 0001 0100
int i = 20;
// 12的二进制为 0000 1100
int j = 12;
// 整型类型二进制与运算符
int result = i & j;  // 结果为4

47、readonly与const的区别

参考答案:const为编译时常量,只有内置类型可声明为const且声明时初始化,只能内置类型可;readonly 为运行时常量,在声明时可以不初始化,可以在类的构造函数中进行设置,在运行时第一次赋值后将不可以改变。

48、简述C#中using的几种用法

参考答案:1、引用命名空间;2、定义对象的使用范围,即时释放对象;3、引用命名空间使用别名。

示例:

// 引用命名空间
using System;
// 引用命名空间使用别名
using RedefinPrint= System.Drawing.Printing;
// 定义对象的使用范围,即时释放对象
using (PrintDocument printDocument = new PrintDocument())
{
   printDocument.Print();
}

49、NET的错误处理机制是什么

参考答案:采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。

示例:

try      
{
 // 执行代码
}
catch (Exception exception)
{
 // 捕获和处理异常
 throw new Exception(exception.Message)
}
finally
{
 // 代码始终都会执行,确保资源的释放和清理
}

50、简述ref 、out和in在用作函数参数修饰符时的区别

参考答案:1、ref参数可用于输入或输出,变量使用前必须初始化。2、out 参数只用于输出,使用前无需初始化。3、in参数只用于输入,按引用传递,它能确保在使用过程中不被修改,变量使用前必须初始化。

51、.NET中所有类的基类是

参考答案:.NET中所有类的基类是object。

52、.Net中所有可序列化的类都被标记为什么

参考答案:都被标记为[serializable]

示例:

[Serializable]
public class Person
{
   /// <summary>
   ///
   /// </summary>
   public Person()
  {
  }
   /// <summary>
   ///
   /// </summary>
   public int Age { get; set; }
   /// <summary>
   ///
   /// </summary>
   public decimal Weight { get; set; }
}

53、列举C#中集合类型

参考答案:数组集合类型、ArrayList 和List 集合类型、Hashtable 和 Dictionary 、SortedList 和SortedDictionary 集合类型、队列Queue集合类型、堆栈Stack集合类型、HashSet 集合类型、LINQ Set 运算。

54、在.NET的C#语言中,Appplication.Exit与Form.Close有什么不同

参考答案:Appplication.Exit是退出整个应用程序,Form.Close是关闭其中一个窗体。

55、如何Array复制到ArrayList中

参考答案:1、使用foreach循环,将array数组中的数据逐步放入ArrayList的对象中;2、直接使用构造方法传入;3、使用ArrayList的adpater的方法 ,将整个Array对象封装到ArrayList对象中。

示例:


string[] dayArray =new string[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
// 定义
ArrayList arrayList = new ArrayList();
//方法一
foreach (string day in dayArray)
{
    arrayList.Add(day);
}
// 方法二 直接使用构造方法传入,因为Array实现了ICollection
ArrayList copyArrayList = new ArrayList(dayArray);
//方法三
ArrayList dayArrayList = new ArrayList();
dayArrayList = ArrayList.Adapter(dayArray);

56、Func<T> 与Action<T> 的区别

参考答案:Func<T>有返回类型;Action<T>只有参数类型,不能传返回类型。所以Action<T>的委托函数都是没有返回值的。

57、什么是泛型约束

参考答案:泛型约束是一种在泛型类型参数上定义约束条件的机制,它可以帮助我们限制泛型类型参数的取值范围。约束是使用 where 上下文关键字指定的。

示例:


//构造函数约束:要求泛型参数必须有构造函数
public class Person<T> where T : new()
{

}

58、C#中的接口和类有什么异同

参考答案:接口是可以多继承,类只有单继承。接口强调了你必须实现,而没有具本实现的方法和虚类有点相似。

接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。接口可以包含事件、索引器、方法和属性。

59、new关键字用法

参考答案:1、当运算符时用于创建对象和调用构造函数。2、当修饰符时用于向基类成员隐藏继承成员。3、当约束时用于在泛型声明中约束可能用作类型参数的参数的类型。

60、下面这段代码有错误吗?如有是什么错误

public static const int i=1;

参考答案:存在错吴,const关键字不能用static修饰。

小结

        以上是30个C#面试题目,后续继续列举一些问题及提供参考答案,敬请关注后续内容。

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fountyuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值