目录

C#面试问题(C# Interview Questions)

亲爱的读者,这些C# Interview Questions专门设计用于让您了解在面试C#时可能遇到的问题的本质。 根据我的经验,很好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的问题 -

C#是由Microsoft开发的一种现代的,通用的,面向对象的编程语言。 C#专为公共语言基础结构(CLI)而设计,它由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。

Jagged数组是一个数组数组。

您可以将锯齿状数组初始化为 -

int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};

其中,得分是两个整数数组的数组 - 得分[0]是3个整数的数组,得分[1]是4个整数的数组。

参数可以通过三种方式传递给方法 -

  • Value parameters - 此方法将Value parameters的实际值复制到函数的形式参数中。 在这种情况下,对函数内部参数所做的更改不会对参数产生影响。

  • Reference parameters - 此方法将对参数的内存位置的引用复制到形式参数中。 这意味着对参数所做的更改会影响参数。

  • Output parameters - 此方法有助于返回多个值。

是! 使用输出参数。 return语句可用于仅从函数返回一个值。 但是,使用输出参数,您可以从函数返回两个值。

输出参数与参考参数类似,不同之处在于它们将数据传输出方法而不是传输到方法中。 Reference参数将对参数的内存位置的引用复制到形参中。 这意味着对参数所做的更改会影响参数。

命名空间旨在提供一种方法来保持一组名称与另一组名称分离。 在一个名称空间中声明的类名称与在另一个名称空间中声明的相同类名称不冲突。

using关键字用于在程序中包含命名空间。 程序通常具有多个using语句。

可以直接为值类型变量分配值。 它们派生自System.ValueType类。

值类型直接包含数据。 一些示例是int,char和float,它们分别存储数字,字母和浮点数。 声明int类型时,系统会分配内存来存储该值。

引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。

换句话说,它们指的是存储位置。 使用多个变量,引用类型可以引用内存位置。 如果内存位置中的数据由其中一个变量更改,则另一个变量会自动反映此值的更改。 内置引用类型的示例包括:object,dynamic和string。

对象类型是C#通用类型系统(CTS)中所有数据类型的最终基类。 Object是System.Object类的别名。 可以为对象类型分配任何其他类型,值类型,引用类型,预定义或用户定义类型的值。 但是,在分配值之前,它需要进行类型转换。

将值类型转换为对象类型时,称为装箱。

将对象类型转换为值类型时,称为取消装箱。

您可以在动态数据类型变量中存储任何类型的值。 对这些类型的变量进行类型检查是在运行时进行的。

声明动态类型的语法是 -

dynamic <variable_name> = value;

例如,

dynamic d = 20;

动态类型与对象类型类似,除了对象类型变量的类型检查在编译时进行,而动态类型变量的类型检查在运行时进行。

指针类型变量存储另一种类型的内存地址。 C#中的指针与C或C ++中的指针具有相同的功能。

声明指针类型的语法是 -

type* identifier;

例如

char* cptr;
int* iptr;

is运算符确定对象是否属于某种类型。

如果(福特是汽车)//检查福特是否是汽车类的对象。

如果转换失败,则运算符强制转换而不引发异常。

Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;

封装被定义为“将一个或多个项目封装在物理或逻辑包中的过程”。 在面向对象的编程方法中,封装阻止了对实现细节的访问。

使用访问说明符实现封装。

访问说明符定义类成员的范围和可见性。

公共访问说明符允许类将其成员变量和成员函数公开给其他函数和对象。 可以从课外访问任何公共成员。

私有访问说明符允许类从其他函数和对象隐藏其成员变量和成员函数。 只有同一个类的函数才能访问其私有成员。 即使是类的实例也无法访问其私有成员。

受保护的访问说明符允许子类访问其基类的成员变量和成员函数。 这样它有助于实现继承。

内部访问说明符允许类将其成员变量和成员函数公开给当前程序集中的其他函数和对象。 换句话说,可以从定义成员的应用程序中定义的任何类或方法访问具有内部访问说明符的任何成员。

受保护的内部访问说明符允许类从其他类对象和函数中隐藏其成员变量和成员函数,但同一应用程序中的子类除外。 在实现继承时也使用它。

C#提供了一种特殊的数据类型,可以为空的类型,您可以为其分配正常的值范围以及空值。

例如,您可以存储-2,147,483,648到2,147,483,647之间的任何值,或者在Nullable 变量中存储null。 同样,您可以在Nullable 变量中指定true,false或null。

null合并运算符与可空值类型和引用类型一起使用。 它用于将操作数转换为另一个可空(或非)值类型操作数的类型,其中可以进行隐式转换。

如果第一个操作数的值为null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。

通过使用params关键字,可以指定一个方法参数,该参数采用可变数量的参数甚至不参数。

没有! 在方法声明中的params关键字后,不允许使用其他参数。 方法声明中只允许使用一个params关键字。

Array类是C#中所有数组的基类。 它在System命名空间中定义。 Array类提供了各种用于处理数组的属性和方法。

使用Array.sort(数组)函数。 它使用Array的每个元素的IComparable实现对整个一维Array中的元素进行排序。

首先使用Array.sort(array)对数组进行排序,然后使用Array.reverse(array)方法将其反转。

在C#中,结构是值类型数据类型。 它可以帮助您使单个变量保存各种数据类型的相关数据。 struct关键字用于创建结构。

结构用于表示记录。 要定义结构,必须使用struct语句。 struct语句定义一个新的数据类型,为您的程序提供多个成员。

类和结构具有以下基本差异 -

  • 类是引用类型,结构是值类型。

  • 结构不支持继承。

  • 结构不能有默认构造函数。

枚举是一组命名的整数常量。 使用enum关键字声明枚举类型。

C#枚举是值数据类型。 换句话说,枚举包含自己的值,不能继承或不能传递继承。

类类型的默认访问说明符是内部的。

成员的默认访问权限是私有的。

面向对象编程中最重要的概念之一是继承。 继承允许我们根据另一个类定义一个类,这使得创建和维护应用程序变得更容易。 这也提供了重用代码功能并加快实现时间的机会。

在创建类时,程序员可以指定新类应该继承现有类的成员,而不是编写全新的数据成员和成员函数。 此现有类称为基类,新类称为派生类。

继承的想法实现了IS-A关系。 例如,哺乳动物是动物,狗是IS-A哺乳动物,因此也是狗IS-A动物,等等。

没有! C#不支持多重继承。

类可以从多个类或接口派生,这意味着它可以从多个基类或接口继承数据和函数。 C#中用于创建派生类的语法如下 -

<acess-specifier> class <base_class>
{
   ...
}
class <derived_class> : <base_class>
{
   ...
}

多态性这个词意味着有许多形式。 在面向对象的编程范例中,多态性通常表示为“一个接口,多个函数”。

多态性可以是静态的或动态的。 在静态多态性中,对函数的响应在编译时确定。 在动态多态中,它在运行时决定。

C#提供了两种实现静态多态的技术。 他们是 -

  • 函数重载

  • 运算符重载

在编译期间将函数与对象链接的机制称为早期绑定。 它也称为静态绑定。

您可以在同一范围内对同一函数名称具有多个定义。 函数的定义必须通过参数列表中的参数的类型和/或数量彼此不同。 您不能重载仅由返回类型不同的函数声明。

动态多态性由抽象类和虚函数实现。

当一个类被声明为密封时,它不能被继承。

没有! 它无法创建,因为抽象类不能声明为密封。

如果要在要继承的类中实现的类中定义函数,则使用虚函数。 虚函数可以在不同的继承类中以不同方式实现,并且将在运行时决定对这些函数的调用。

您可以重新定义或重载C#中可用的大多数内置运算符。 因此,程序员也可以使用具有用户定义类型的运算符。

重载运算符是具有特殊名称的函数,关键字运算符后跟要定义的运算符的符号。 与任何其他函数类似,重载运算符具有返回类型和参数列表。

n接口被定义为一个语法契约,继承该接口的所有类都应该遵循。 接口定义了语法契约的“什么”部分,派生类定义了语法契约的“如何”部分。

接口定义属性,方法和事件,它们是接口的成员。 接口仅包含成员的声明。 派生类负责定义成员。 它通常有助于提供派生类将遵循的标准结构。

预处理程序指令指示编译器在实际编译开始之前预处理信息。

所有预处理程序指令都以#开头,并且只有空格字符可能出现在一行上的预处理程序指令之前。 预处理程序指令不是语句,因此它们不以分号(;)结尾。

您可以使用#if指令创建条件指令。 条件指令对于测试一个或多个符号以检查它们是否计算为true非常有用。 如果它们的计算结果为true,则编译器会评估#if和next指令之间的所有代码。

C#异常由类表示。 C#中的异常类主要直接或间接地从System.Exception类派生。 从System.Exception类派生的一些异常类是System.ApplicationException和System.SystemException类。

System.ApplicationException类支持应用程序生成的异常。 因此,程序员定义的异常应该来自这个类。

System.SystemException类是所有预定义系统异常的基类。

接下来是什么? (What is Next ?)

此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。

↑回到顶部↑
WIKI教程 @2018