C#程序员经常遇到的30道基础面试题,想你所想 - Go语言中文社区

C#程序员经常遇到的30道基础面试题,想你所想


C#程序员经常遇到的30道基础面试题,想你所想

1、请解释new与override的区别?

在C#中,new关键字可用作运算符和修饰符。
(1)new运算符用于在堆上创建对象和调用构造函数。
(2)new修饰符用于隐藏基类成员的继承成员。
使用override修饰符来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。
不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。
重写声明不能更改虚方法的可访问性。重写方法和虚方法必须具有相同的访问级的修饰符。不能使用下列修饰符修改重写方法:new、static、virtual、abstract。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、抽象的或重写的。

2、请解释virtual的含义?

virtual关键字用于修改方法和属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。
调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟的。
不能重写非虚方法。不能将virtual修饰符与以下修饰符一起使用:static、abstract、override。
除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
(1)在静态属性上使用virtual修饰符是错误的。
(2)通过包括使用override修饰符的属性声明,可在派生类中重写虚拟继承属性。

3、请解释接口的显示实现有什么意义?

接口是其他类型为确保它们支持某些操作而实现的引用类型。接口从不直接创建而且没有实际的表示形式,其他类型必须转换为接口类型。一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以包含方法、属性、索引器和事件作为成员。

4、请以图示的方式解释.net framework?

在这里插入图片描述

5、什么是.net?

.net是一种平台和框架,.net不是单纯的语言也不是单纯的工具,它是从底层平台开始构建起来的一个整体框架。

6、ref与out有什么不同?

方法参数上的ref方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在在该变量中。若要使用ref参数,必须将变量作为ref参数显示传递到方法。变量的值被传递到ref参数。传递到ref参数的变量必须要先初始化。
与out参数相比,变量在传递到out参数之前不必显示初始化。属性不是变量,不能作为ref参数传递。如果两个方法的声明仅在它们对ref的使用方面不同,则将出现重载。但是,无法定义仅在ref和out方面不同的重载。
方法参数上的out方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明out方法非常有用。使用out参数的方法仍然可以返回一个值。一个方法可以有一个以上的out参数。若要使用out参数,必须将变量作为out参数显示传递到方法。out变量的值不会传递到out参数。属性不是变量,不能作为out参数传递。如果两个方法的声明仅在out的使用方面不同,则会发生重载。不过,无法定义仅在ref和out方面不同的重载。

7、值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型。

大多数编程语言提供内置的数据类型(比如整数和浮点数),这些数据类型会在作为参数传递时被复制(即,它们通过值来传递)。在.NET Framework中,这些称为值类型。您可以创建值类型的实例,将它们作为参数传递,将它们存储为局部变量,或将它们存储在另一值类型或对象的字段中。值类型没有与存储类的实例相关的系统开销,并且它们不需要构造函数。值类型可以有字段、属性和事件。它们也有静态和非静态方法。当它们被装箱时,会从System.ValueType继承虚方法,并可实现零个或更多接口。值类型是密封的,这意味着不能从它们派生出其他类型。但是,可以直接对值类型定义虚方法,并且即可对该类型的已装箱形式,也可对未装箱形式调用这些方法。尽管不能从一种值类型派生出另一种类型,但是当所用语言处理虚方法比处理非虚方法或静态方法更方便时,可以对值类型定义虚方法。
引用类型的变量又称为对象,可存储对实际数据的引用。以下用于声明引用类型的关键字:
(1)class
(2)interface
(3)delegate

8、结构体是值类型还是引用类型?

是值类型

9、装箱与拆箱是什么含义?

装箱是值类型到object类型(引用类型)或到该值类型所实现的任何接口类型的隐式转换。将一个值类型的值装箱会分配一个对象实例并将该值复制到新的对象中。
拆箱是从object类型(引用类型)到值类型或从接口类型到实现该接口的值类型的显示转换,拆箱包括:
(1)检查对象实例,确保它是给定值类型的一个装箱值。
(2)将该值从实例复制到值类型变量中。

10、没有经过装箱的对象可不可以拆箱?

不能。但是可以通过类型转换实现对象值向值类型变量的转化,比如Convert.ToXXX(obj.ToString());和int.TryParse();

11、C#中有没有静态构造函数,如果有是做什么用的?

有。静态构造函数用于初始化类。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。静态构造函数既没有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。
静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。

12、在C#中如何实现多态?

“多态性”指定义具有功能不同但名称相同的方法或属性的多个类的能力,这些类可由客户端代码在运行时交换使用。也就是由重载和重写实现多态。重载一般是同一类中的一组同名方法,但签名。重写主要是在继承中体现,就是在基类中定义方法并在派生类中使用新实现重写它们。

13、什么是反射?如何实现反射?

反射提供了访问程序集、模块和类型信息的一种机制。您可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。通过反射命名空间中的类以及System.Type,您可以获取有关已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。您也可以使用反射在运行时创建类型实例,然后调用和访问这些实例。

14、请解释流与文件有什么不同?

文件是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合。因此,对于文件,人们常会想到目录路径、磁盘存储、文件和目录名等方面。相反,流提供一种向后备存储器写入字节和从后备存储器读取字节的方式,后备存储器可以为多种存储媒介之一。正如除磁盘外在多种后备存储器一样,除文件流之外也存在多种流。例如,还存在网络流、内存流和磁带流等。

15、程序集与命名空间有什么不同?

命名空间是用于避免命名冲突,专用于组织代码,当代码要在其他某个应用程序中重用时,可以降低复杂性。
程序集是重用代码的一种方式,通常对应一个工程类库(dll),在一个程序集中可以有属于不同命名空间的类和接口。可以将相同命名空间中的类部署到不同的程序集中,也可以将不同命名空间中的类部署到一个程序集中。

命名空间 程序集
有逻辑编译时机制 有物理编译时机制
不是运行时实体 是运行时实体
为源代码元素的名称提供逻辑结构 为可执行文件的运行时提供物理结构

16、请编写一个捕获所有异常的异常处理代码?

try 
{
	...
}
catch(Exception ex)
{
	...
}

17、委托与事件是什么关系?为什么要使用委托?

委托提供了封装方法的方式,事件是某动作已发生的说明,事件是建立于委托之上的。
(1)程序运行时同一个委托能够用来调用不同的方法只要改变它引用的方法即可。
(2)同一个委托能够用来调用不同的方法,只要改变它引用的方法即可,因此委托调节器用的方法不是在编译时决定的,而是在运行时确定的。

18、一个类中有几种元素?

类由字段、属性、方法组成。

19、请解释这种语法现象

Session["name"] = 20;

给类的索引器赋值。

20、一个构造函数能否调用另一个构造函数,如果能请写出简单代码?

能。

class Class1
{
	int y;
	public Class1()
	{
		new Class1(5);
	}
	public Class1(int i)
	{
		this.y = i;
	}
	public void X()
	{
		Console.WriteLine(y.ToString());
	}
	static void Main(string[] args)
	{
		Class1 c1 = new Class1();
		c1.X();
	}
}

21、params是什么含义?

params关键字可以指定在参数数目可变处定义参数的方法。在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。

22、C#中没有运算符重载?能否使用指针?

重载操作符意味着使该操作符具有不同的行为,使用操作符可以使方程式简单易懂。C# 允许用户定义的类型通过使用 operator 关键字定义静态成员函数来重载运算符。注意必须用public修饰且必须是类的静态的方法。
C#为了类型安全,默认并不支持指针。但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式。在不安全模式下,我们可以直接操作内存,这样就可以使用指针了。在不安全模式下,CLR并不检测unsafe代码的安全,而是直接执行代码。unsafe代码的安全需要开发人员自行检测。
在下列情况中可以开启不安全代码使用指针
(1)处理磁盘上的现有结构
(2)涉及内部包含指针的结构的高级COM或平台调用方案
(3)性能关键代码
不鼓励在其他情况下使用不安全上下文。具体地说,不应该使用不安全上下文尝试在C#中编写C代码。

23、C#中有很多类被定义为public有什么意义?

public关键字将公共访问权限授予一个或多个被声明的编程元素。对公共元素的可访问性没有限制。

24、internal修饰符有什么含义?

internal关键字是类型和类型成员的访问修饰符。内部成员只有在同一程序集中的文件内才是可访问的。内部访问通常用于基于组件的开发,因为它使用一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开。例如,用于生成图形用户界面的框架可以提供“控件”类和“窗体”类,这些类通过使用具有内部访问能力的成员进行合作。由于这些成员是内部的,它们不向正在使用框架的代码公开。在定义具有内部访问能力的成员的程序集外部引用该成员是错误。

25、JAVA的代码是半编译半解释的,C#代码是否也是这样的?

C#源代码经过语言编译器执行第一次编译,变为中间语言,然后再由CLR编译成可执行代码。

26、私有程序集与共享程序集有什么区别?

私有程序集:
(1)默认情况下,C#程序编译为私有程序集。
(2)需要放在应用程序所在的文件夹中。
(3)程序集的名称在应用程序中应当是唯一的。
共享程序集:
(1)可以被不同的应用程序共享。
(2)在所有使用程序集的应用程序中,程序集名称应当是唯一的。
(3)放在全局程序集缓存中。

27、请解释进程与线程的区别?进程与程序的区别?

用最简短的话来说,进程就是当前运行的应用程序。线程是操作系统向其分配处理器时间的基本单位。线程可执行进程的任何一部分代码,包括当前由另一线程执行的部分。

28、CLR与IL分别是什么含义?

CLR(共同语言运行库):能管理内存,能够轻松地设计其对象可以跨语言互动的组件和应用程序,编译一次,并可以在任何支持运行库的CPU和操作系统上运行,跨语言集成(特别是跨语言继承)。
IL(中间语言):可用于语言互操作性,IL不是字节代码,但很接近字节代码,因此执行应用程序时,IL到机器代码的转换要快很多。独立于CPU的指令集。由CLR转换为特定于CPU的代码。

29、对象能否调用静态方法?

对象能调用静态方法。

30、请编写创建一个线程的代码?

public class ThreadDemo
{
	public static void Main(string[] args)
	{
		System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(DoWork));
	}

	public static void DoWork()
	{
		try
		{
			while(true)
			{
				Console.WriteLine("进入线程执行...");
				System.Threading.Thread.Sleep(2000);
			}
		}
		catch(Exception ex)
		{
			Console.WriteLine(ex.Message);
		}
	}
}
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zlbdmm/article/details/103788924
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢