C# 面试题及答案

2025 年 3 月 16 日 | 阅读 12 分钟
C# Interview Questions

以下是 top 经常被问到的 C# 面试题及答案。

1) 什么是 C#?

C# 是一种简单、现代、通用的编程语言。它是一种面向对象的编程语言,由微软开发。它是一种安全且托管的语言,由 .NET Framework 编译以生成 Microsoft 中间语言(机器代码)。


2) C# 发明的背后原因是什么?

C# 是为通用语言基础设施 (CLI) 而设计的。它包含可执行代码和运行时环境,使用户能够在不同的计算机平台和体系结构上使用各种高级语言。


3) 使用 C# 语言的主要原因有哪些?

以下是使用 C# 语言的主要原因:

  • 易于学习
  • 通用且面向对象的编程语言
  • 面向组件
  • 结构化语言
  • 它可以在各种计算机平台上编译
  • 生成高效的程序
  • .NET Framework 的一部分

4) public, static 和 void 有什么区别?

可以在应用程序的任何位置访问 public 声明的变量。

Static 声明的变量在不创建类实例的情况下全局可访问。

Void 是一种类型修饰符,它指定方法不返回值。


5) C# 中的构造函数是什么?

构造函数是类中的成员函数,其名称与其类名相同。每当创建类对象时,构造函数都会自动调用。它在初始化类时构造数据成员的值。


6) C# 中有哪些不同类型的构造函数?

基本上,有五种类型的构造函数:

  • 静态构造函数
  • 私有构造函数
  • 拷贝构造函数
  • 默认构造函数
  • 参数化构造函数

7) 什么是静态构造函数?

静态构造函数用于在类第一次被引用时初始化静态数据成员。


8) C# 中的方法重载是什么?

方法重载是在同一类中创建多个同名但具有唯一签名的机制。编译时,编译器使用重载解析来确定要调用的特定方法。


9) 是否可以在同一类中重写函数?

不能


10) 什么是数组?

数组是一组相关的实例,可以是值类型或引用类型。

C# 支持三种类型的数组:

  • 一维数组:它包含一行。它也称为向量数组。
  • 多维数组:它是矩形的,包含行和列。
  • 交错数组:它也包含行和列,但形状不规则。

11) 什么是 ArrayList?

ArrayList 是一个动态数组。您可以在运行时向 ArrayList 添加和删除元素。在 ArrayList 中,元素不会自动排序。


12) 什么是集合?

集合用作其他类实例的容器。所有类都实现 ICollection 接口。


13) 什么是接口?

接口是一个抽象类,只有公共抽象方法。这些方法只有声明而没有定义。这些抽象方法必须在继承的类中实现。


14) C# 中的 lock 语句是什么?

lock 语句用于确保当一个线程在关键代码段时,另一个线程不会进入该关键代码段。如果另一个线程尝试进入锁定的代码,它将等待,阻塞,直到对象被释放。


15) 什么是序列化?

如果您想通过网络传输一个对象,您必须将该对象转换为字节流。将对象转换为字节流的过程称为序列化。


16) 如何在类中声明属性?


17) C# 中早期绑定和晚期绑定有什么区别?

早期绑定和晚期绑定是多态性的概念。C# 中有两种多态性。

  • 编译时多态:也称为早期绑定。
  • 运行时多态:也称为晚期绑定、方法重写或动态多态。

18) C# 中有哪些可访问修饰符?

以下是通常用于可访问性的可访问修饰符:

  • Public:如果您将属性或方法定义为 public,则可以在项目的任何代码中访问它。
  • Private:私有定义的属性或方法只能由包含类内的任何代码访问。
  • Protected:如果您将方法或属性定义为 protected,则可以在继承类中的任何方法以及同一类中的任何方法中访问它。
  • Internal:如果您将属性或方法定义为 internal,则它仅限于当前位置程序集中的类。
  • Protected internal:如果您将属性或方法定义为 protected internal,则访问仅限于当前项目程序集中的类或派生自包含类的类型。

19) C# 中的抽象类和接口有什么区别?

抽象类可以包含抽象方法和具体方法,而接口只有抽象方法。


20) C# 中的 dispose() 和 finalize() 方法有什么区别?

dispose() 方法由用户显式调用以释放非托管资源,如文件、数据库连接等,而 finalize() 方法由垃圾回收器隐式调用以释放非托管资源,如文件、数据库连接等。

dispose() 方法属于 IDisposable 接口,而 finalize() 方法属于 Object 类。


21) C# 中的方法重载和方法重写有什么区别?

方法重载中的方法参数必须不同,而在方法重写中则必须相同。

方法重载不需要继承,它发生在同一个类中。但方法重写需要继承。


22) .Net 中的对象池是什么?

对象池是现成可用对象的容器。它减少了创建新对象的开销。


23) C# 中的委托是什么?

C# 中的委托是一个持有方法引用的对象。它类似于 C++ 中的函数指针。


24) 什么是 Hashtable?

Hashtable 是一个键/值对的集合。它根据键包含值。


25) 什么是反射?

反射允许我们在运行时获取对象的元数据和程序集。


26) 什么是垃圾回收?

垃圾回收是一个自动释放不再可访问的对象所占用内存的过程。


27) 什么是命名空间,C# 中需要它吗?

命名空间是一种机制,它将来自同一组或功能的类组织在同一个名称下。我们可以将其视为一个模块。但是,将类包含在命名空间中不是必需的。正如我们在以下语法中看到的:


28) 解释 C# 中的注释类型。

C# 中主要有三种类型的注释。它们如下:

1. 单行注释

单行注释写在一行中。它们可以定义如下:

2. 多行注释

多行注释写在两行中。它们可以定义如下:

3. XML 注释

XML 注释写在多行中。它们可以定义如下:


29) C# 中的索引器是什么?

索引器允许我们使用类似数组的索引来访问类或结构实例。它们也称为智能数组。当我们为类指定索引器时,该类就像一个虚拟数组。之后,我们可以使用数组访问运算符 ([]) 来访问此类的实例。


30) C# 中的部分类是什么?

部分类是 C# 的一项重要功能。它提供了跨多个文件实现单个类功能的独特能力,并在应用程序编译时,所有文件合并为单个类文件。partial 关键字用于创建部分类。将接口、方法和结构的功能划分为多个文件非常有用。

语法

它具有以下语法:


31) C# 中的密封类是什么?

在 C# 中,创建密封类是为了限制需要继承的类的需求。sealed 修饰符阻止了对类的任何派生。一旦类被指定为 sealed,就不能继承它。当将密封类定义为基类时,会产生编译时错误。


32) 如何在 C# 中将一个类继承到另一个类?

在 C# 中,我们可以使用冒号作为继承运算符将一个类继承到另一个类。我们需要使用冒号并在其后跟类名。


33) C# 中“is”和“as”运算符的主要区别是什么?

C# 中“is”和“as”运算符的主要区别在于,“is”运算符检查一个对象是否为特定类型,它返回一个布尔值。它不执行任何类型转换。另一方面,“as”运算符可用于将对象转换为指定的类型或类。


34) C# 中的 throw 语句是什么意思?

该语句允许我们在 C# 程序执行期间手动抛出异常。


35) 如果继承的接口中的方法名称发生冲突会怎样?

当来自多个接口的方法需要不同数据时,可能会发生问题。但是,编译器本身不应该有问题。


36) C# 中的元组是什么?

C# 中的元组是一种数据结构,它将多种类型的值收集到一个单元中。它对于从方法返回多个值而无需创建自定义类或结构非常有用。


37) C# 中的“using”语句是什么?

C# 中的“using”关键字用于通过确保实现 IDisposable 的对象在超出范围时自动进行处理来高效地管理资源。当我们在处理文件、网络连接、流、数据库连接和许多非托管资源时,此语句非常有用。


38) C# 中的竞态条件是什么意思?

在 C# 中,当多个线程同时访问同一资源并希望修改它时,就会发生竞态条件。


39) C# 中的交错数组是什么意思?

在 C# 中,交错数组是数组的数组,其中每个子数组在每行都可以有不同的长度。与多维数组不同,交错数组允许每一行具有不同数量的元素,这使得它在不需要统一性的情况下更具灵活性。


40) C# 中的 IEnumerable<> 是什么?

在 C# 中,IEnumerable 是一个接口,它表示一组可以逐个枚举的对象。IEnumerable 是一个只有一个方法 GetEnumerator 的接口,该方法返回一个 IEnumerator 接口。它允许对集合进行只读访问,该集合可与 for-each 语句在 IEnumerable 集合上一起使用。


41) C# 中常量和只读(Read-only)的主要区别是什么?

常量和只读(Read-only)之间有几个区别。在这里,我们将逐一讨论这些区别:

Constant

  • 它通过 const 关键字定义。
  • 值在编译时分配,并且不能更改。
  • 它包含一个编译时常量值。
  • 它可以在任何场景中使用,例如数组大小。

只读(Read-Only)

  • Read-only 通过 readonly 关键字定义。
  • 值在运行时分配,并且之后不能更改。
  • 它包含一个类实例,并且值在不同实例之间可能不同。
  • 它可以用于实例级别的常量值,这些值在运行时定义。

42) C# 中的文件处理是什么?

在 C# 中,文件处理是处理文件(如读取或写入)的技术。C# 语言在 System.IO 命名空间中提供了许多类和方法来执行各种文件操作。它允许我们读取、写入、删除和操作文件。它允许高效地管理存储在文件中的数据。


43) C# 中的装箱和拆箱过程是什么?

装箱

在 C# 中,装箱是将值类型(如 int、char 等)变量转换为引用类型变量(object)的过程。Object 类型用于隐式转换过程。它将值存储在 System.Object 或接口类型中。

示例

让我们看一个说明 C# 中装箱的示例。

拆箱

拆箱是将引用类型(Object)变量转换为值类型(如 int、char 等)的过程。它是一个显式类型转换过程。

示例

让我们看一个说明 C# 中拆箱的示例。


44) 编写一个在 C# 中反转字符串的程序。

输出

 
Enter a string to Reverse: Hello! This is TtechPoint
Reversed String: tnioPhcetT si sihT !olleH

45) 编写一个在 C# 中检查给定字符串是否为回文的程序。

输出

 
Enter a String: 64
The String is not a palindrome.
Enter a String: 77
The String is a palindrome.   

46) C# 中 Async 和 Await 的用途是什么?

在 C# 中,async 和 await 用于异步编程,它允许任务的非阻塞执行。它们通过在等待长时间运行的操作(如文件 I/O、数据库访问和 Web 请求)时释放资源来帮助提高应用程序的响应能力。Async 和 Await 关键字创建异步方法。


47) C# 中的 LINQ 是什么?

LINQ 代表 Language Integrated Query(语言集成查询)。它是 C# 中的一项重要功能,它允许我们使用类似 SQL 的语法以一致、可读且简洁的方式查询和操作各种类型的数据,包括集合、数组、数据集、SQL Server 和 XML。它允许我们在 C# 中直接编写类似 SQL 的查询,从而提供强大而高效的数据查询功能。它简化了数据操作和检索,提高了 C# 开发的生产力和可读性。


48) C# 中的构造函数链是什么意思?

构造函数链是一个过程,其中一个构造函数调用程序中基类或同一类中的另一个构造函数。它使我们能够避免同一类中的代码重复并确保正确初始化。它通过提供多种方式来创建具有不同参数的对象来简化对象初始化,从而提高代码的灵活性和清晰度。


49) 编写一个程序,使用 C# 中的单个循环查找数组中的第三大整数。

输出

 
The Third largest number in the array is: 65   

50) C# 中用于执行鸭子类型(duck typing)的关键字是什么?

Dynamic 关键字用于在 C# 中实现鸭子类型。