C#基础面试题(附答案)

 2024-01-20 02:02:40  阅读 0

目录

C#中堆和栈有什么区别?

2.C#中的委托是什么? 活动是佣金吗?

3.C#静态构造函数有什么特点?

4.CTS、CLS、CLR分别是什么解释?

5.C#中什么是值类型和引用类型

6.请详细说明C#中类和结构体的异同?

7.new关键字的作用

8.int和int有什么区别? 和整数?

9.C#中按值传递和按引用传递有什么区别?

10.C#中传递参数时ref和out有什么区别?

11.C#中什么是装箱和拆箱?

12、C#实现多态过程中重载和重写有什么区别?

14、C#中成员变量和成员函数前缀的作用是什么?

15.请描述C#中索引器的实现过程。 只能根据数字来索引吗?

16.C#中的类和类有什么区别?

17.C#中修饰类有什么特点?

18、字符串中str=null、str=""和str=.Empty的区别

19.byte b = 'a'; 字节 c = 1; 字节 d = 'ab'; 字节 e = '啊'; 字节 g = 256; 这些变量有哪些错误?

20. 和的区别,两者性能对比

21.什么是扩展方法?

22.有什么特点? 如何使用?

23.什么是应用程序域()

24.byte a =255;a+=5;a的值是多少?

25.const和const有什么区别?

26. 分析以下代码。 a和b的值是多少?

27.=new(“xyz”);创建了多少个?

28.C#可以直接操作内存吗?

29. 什么是强类型,什么是弱类型? 哪一个更好? 为什么?

30.Math.Round(11.5)等于什么? Math.Round(-11.5) 等于什么?

31.&和&&的区别

32.i++和++i有什么区别?

33.as和is的区别

34.谈谈final和final的区别。

35.C#成员修饰符简述

36.什么是匿名类,它有什么好处?

37.告诉我什么是逐字字符串

38.列出你知道的数字格式转换

39.谈谈字符串拼接和字符串插值方法

40.什么是虚函数? 什么是抽象函数?

41.什么是?

42.ADO.NET中常用的对象有哪些?

43. ASP.NET中的所有自定义用户控件都必须继承自?

44. 在.NET托管代码中,我们不必担心内存泄漏。 是因为这个吗?

45.什么是MVC模式?

47.什么是反射?

48.ORM中延迟加载和直接加载有什么异同?

49.简述Func和?的区别

50.23种设计模式的名称是什么?它们是如何分类的?

回答

1. C#中堆和栈有什么区别?

堆栈:由编译器自动分配和释放。 函数体内定义的变量通常位于堆栈上。 堆:一般由程序员分配和释放。 使用new等内存分配函数分配的内容在堆上。 在栈中存储时,必须管理存储顺序,保持先进后出的原则。 是由系统自动分配和维护的连续的内存域;

堆:它是无序的。 它是一个不连续的内存域,由用户控制和释放。 如果用户不自己释放,当内存达到某个特定值时,就会被垃圾收集器(GC)回收。

栈内存不需要我们管理,也不需要GC管理。 当栈顶元素用完后,立即释放。 堆需要 GC 清理。

使用引用类型时,一般对指针进行操作,而不是对引用类型对象本身进行操作。但是值类型对自身进行操作

2.C#中的委托是什么? 活动是佣金吗?

委托的本质是一个类。 委托就是将一种方法作为参数替换到另一种方法中。 事件是委托的实例,事件是一种特殊的委托。 // 例如:事件中的参数是一个方法。

3.C#静态构造函数有什么特点?

最先执行的构造函数,一个类中只允许有一个不带参数的静态构造函数

执行顺序:静态变量>静态构造函数>实例变量>实例构造函数

4.CTS、CLS、CLR分别是什么解释?

CTS:通用语言系统。 CLS:通用语言规范。 CLR:公共语言运行时。

CTS:类型通用类型系统。 Int32、Int16 → int、→、→ 布尔值。

每种语言都定义了自己的类型。 .NET 通过 CTS 提供公共类型,然后将其转换为生成相应的 .NET 类型。

CLS:通用语言规范。 不同语言的语法是不同的。 每种语言都有自己的语法。 .NET通过CLS提供通用语法,然后对不同的语言进行翻译,生成对应的.NET语法。

CLR:公共语言运行时,也就是GC、JIT等。有不同的CLR,比如服务器

CLR、Linux CLR(单声道)、CLR()。 相当于一个引擎,负责执行IL。

5.C#中什么是值类型和引用类型?

值类型: 、 enum、 int、 float、 char、 bool、

引用类型: 类 、 、 、 数组 、 、

6.请详细说明C#中类和结构体的异同?

类可以实例化并且是引用类型,

类可以实现接口并单继承其他类。 它也可以用作基类型并分配在内存堆上。

它是值类型,不能用作基类型,但可以实现接口并在内存堆栈上分配。

7.new关键字的作用

操作符:创建对象实例

修饰符:在派生类中定义同名方法,隐藏基类方法

:泛型约束定义、约束可以使用的泛型类型

8.int和int有什么区别? 和整数?

整数? 它是可为 null 的类型,默认值可以为 null。

int 默认值为 0

整数? 通过int装箱作为引用类型来实现

9.C#中按值传递和按引用传递有什么区别?

按值传递时,系统首先为被调用方法的形参分配内存空间,并将实参的值一一对应地复制到形参中。

之后,被调用方法中形参值的任何改变都不会影响对应的实参;

引用传递时,系统并不复制实参本身的值传递给形参,而是将其引用值(即地址值)传递给形参。

因此,形参引用的地址处的变量与传递的实参是相同的。 方法体中相应形参值的任何改变都会影响运行。

通过引用传递的实际参数。

简而言之,按值传递并不意味着值参数是值类型,而是形参变量会复制实参变量,这意味着会在堆栈上创建一个额外的参数。

相同的变量。 通过引用传递则不然。 您可以使用 ref 和 out 来确定参数是否通过引用传递。

10.C#中传递参数时ref和out有什么区别?

(1) ref指定的参数必须在函数调用时首先初始化,而out则不能。

(2)out指定的参数在进入函数时会自行清除,所以初始化赋值操作必须在函数内部进行,而ref不需要

总结:ref可以将值传递到方法内部或者方法外部; out 只能在方法外部传递值。

注意:作为特殊的引用类型,其操作与值类型一致。 如果要在方法中传递形参赋值的结果,需要添加 ref 或 out 关键字。

11.C#中什么是装箱和拆箱?

装箱:将值类型转换为引用类型

拆箱:将引用类型转换为值类型

装箱:在堆上为某个值类型分配一个对象实例,并将该值复制到一个新对象。

(1)第一步:新分配托管堆内存(大小为值类型实例大小加上方法表指针。

(2)第2步:将值类型的实例字段复制到新分配的内存中。

(3)第3步:返回新分配的对象在托管堆中的地址。 该地址是对该对象的引用。

拆箱:检查对象实例以确保它是给定值类型的装箱值。 将实例中的值复制到值类型变量中。

装箱时不需要显式类型转换,但拆箱时需要显式类型转换。

整数i=0;

。 对象=我; // 这个过程就是拳击! 只是框我!

int j=(int)obj;//此过程obj拆箱!

12、C#实现多态过程中重载和重写有什么区别?

重写和重载之间的区别。

重载是同名方法,参数或者参数类型不同,进行多次重载,以适应不同的需求。

就是重写基类中的函数。 实现多态性。

重载:方法名称相同但参数或参数类型不同; 重载是一个面向过程的概念。

重写:重写基类中的虚方法。 重写是一个面向对象的概念。 13.C#中关键字的作用是什么?

使用关键字修改类的有意义的字段和方法,称为静态成员,通过类名加访问运算符“.”来访问;

没有关键字的类实例的有意义的字段和方法称为非静态成员或实例成员。

注意:静态字段在内存中只有一份,而非静态字段在每个实例对象中都有一份。以及方法是否

它是静态的,并且在内存中只会有一份副本。 区别只是通过类名或实例名来访问。

14、C#中成员变量和成员函数前缀的作用是什么?

它们被称为常成员变量和常成员函数,也称为类成员变量和类成员函数。

分别用来反映班级的状态。

例如,类成员变量可用于统计类实例的数量,类成员函数可用于统计类实例的数量。

负责本次统计工作。 无需使用新的

15.请描述C#中索引器的实现过程。 只能根据数字来索引吗?

通过提供索引器,C# 可以处理数组等对象。特别是属性,每个元素都通过 get 或 set 方法公开。

dew.索引器不仅可以索引数字(数组下标),还可以索引一些字符串,所以,一般来说,在C#中

一个类通常只有一个索引器,就是THIS,但也可以有无数个,只要你的参数列表不同。 索引器和返回

与返回值无关。 索引器最大的好处就是让代码看起来更自然,更符合实际的思维模式。

微软官方的例子:

索引器允许以与数组相同的方式对类或结构的实例进行索引。索引器与属性类似,不同之处在于它们

访问器接受参数。在下面的示例中,定义了一个泛型类 ( class ) 和一个简单的

单个 get 和 set 访问器方法(作为分配和检索值的方法)。class 创建此类的一个版本用于存储字符串

例子。

16.C#中的类和类有什么区别?

类声明抽象类抽象方法。 如果一个类有抽象方法,那么这个类就是抽象类。 所谓抽象方法不包含主体(不提供实现方法),必须由继承者重写。 因此,抽象类是不可实例化的,只能通过继承被子类覆盖。

声明接口,只提供一些方法规范。 在 C#8 之前的版本中,未提供任何实现。 在C#9版本中,还可以支持接口的实现; 它不能被修改,等等,没有字段,常量,也没有构造函数

两者的区别:

1. 中不能有字段,但类可以; 2. 中不能有其他修饰符,但是

班级可以在场。 3.可以实现多重继承。

17.C#中修饰类有什么特点?

被封印,无法继承。

18、字符串中str=null、str=""和str=.Empty的区别

.Empty 相当于“”,Empty 是静态只读字段。 str="",初始化对象,并分配空字符串的内存空间 str=null,初始化对象,不分配内存空间

19.byte b = 'a'; 字节c = 1; 字节 d = 'ab'; 字节 e = '啊'; 字节 g = 256; 这些变量有哪些错误?

这道题测试的是数据类型可以携带的数据大小。

1byte=8bit,1个汉字=2byte,1个英文字符=1byte=8bit

所以 bc 是对的,deg 是错误的。 'a' 是 char 类型,a 是错误的

java中的byte的取值范围是-128~127,而C#中的一个byte是0~255

20. 和的区别,两者性能对比

它们都是参考类型。 堆上分配的默认容量为 16,这允许扩展其封装的字符串中的字符数。 每个对象都有一定的缓冲容量。 当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。

对于简单的字符串串联操作,性能可能并不总是比字符串好,因为对象的创建也消耗了大量的性能。 在字符串串联相对较少的情况下,过度滥用会导致性能的浪费而不是节省。 仅考虑使用大量不可预测的字符串操作。 从最后分析可以看出,如果是字符串拼接次数比较少的话,根本不会有太大的区别。

使用时最好设置一个合适的容量值,否则会出现容量不足,内存分配频繁的情况。

21.什么是扩展方法?

简而言之,扩展方法使您能够向现有类型“添加”方法,而无需修改类型。

条件:根据扩展方法必须满足的条件,1.必须是静态类中的静态方法2.第一个参数的类型是要扩展的类型,需要加上this关键字来标识它作为扩展方法

建议:一般情况下,只有在万不得已时才实现扩展方法,并且要谨慎地实现它们

用法:不能通过类名调用,直接使用类型调用

22.有什么特点? 如何使用?

特征和属性是两个完全不同的概念,但名称相似。 特征是与目标对象关联的一条配置信息。 它本质上是一个为目标元素提供关联附加信息的类。 这些附加信息存储在dll内部的元数据中,本身没有任何意义。运行时使用反射来获取附加信息

23.什么是应用程序域()

由公共语言运行时围绕在同一应用程序范围内创建的对象(即从应用程序入口点开始的对象激活序列中的任何位置)建立的边界。

应用程序域有助于将一个应用程序中创建的对象与其他应用程序中创建的对象隔离开来,以便运行时行为是可预测的。

单个进程中可以存在多个应用程序域。 应用域可以理解为一个轻量级的进程。 发挥安全作用。 它占用很少的资源。

24.byte a =255;a+=5;a的值是多少?

byte的取值范围是-2的8次方到2的8次方-1、-256到258。当a+=1时,a的值为0。当a+=5时,a的值为0,所以a+=5,值为4

25.const和const有什么区别?

可以识别一个常数。 主要区别如下:

1、初始化位置不同。 const 必须在声明的同时赋值; 即可以在声明时赋值;

2、修改对象不同。 const 可以修改类的字段或局部变量; 它只能修改类的字段

3、const是编译时常量,其值是在编译时确定的; const 是运行时常量,其值在运行时确定。

4. const默认是的; 如果设置为,则需要显示声明

5、修改引用类型时不同。 const 只能修改值为 null 的其他引用类型; 它可以是任何类型。

26. 分析以下代码。 a和b的值是多少?

分析:一个字母或数字占一个字节,一个汉字占两个字节,所以a=8,b=5

27.=new(“xyz”);创建了多少个?

两个对象,一个是“xyz”,另一个是指向“xyz”的引用对象s。

28.C#可以直接操作内存吗?

C#在模式下可以使用指针来操作内存,但在托管模式下不能使用指针。 默认情况下,C#NET 不使用指针运行。 您需要通过右键单击项目 - >属性 - >选择构建 - >“允许”不安全代码”检查 - >保存来设置它

29. 什么是强类型,什么是弱类型? 哪一个更好? 为什么?

强类型是在编译时确定类型的数据,并且在执行期间不能更改类型,而弱类型仅在执行时确定类型。 没有好坏之分,都有各自的优点,强类型安全,因为已经提前确定了,而且高效。一般用在编译型编程语言中,如c++、java、c#等。弱类型是相对不安全,运行时容易出错,但比较灵活,多用于解释型编程语言,如etc。

30.Math.Round(11.5)等于什么? Math.Round(-11.5) 等于什么?

数学.Round(11.5)=12

数学.Round(-11.5)=-12

31.&和&&的区别

相似点:&和&&都可以用作逻辑与运算符,表示逻辑与(与)。 当运算符两边表达式的结果都为真时,结果为真。 否则,只要一侧为假,则结果为假。 (ps:使用逻辑与时&没有意义,&本身不用于此)

=“”;

int a = .Text...().;

整数 b = .; 不同之处

if(!=null&&.(.))

&& 具有短路功能,即如果第一个表达式为 false,则不会计算第二个表达式。 对于上面的表达式,当为null时,后面的表达式不会被执行,所以不会有if将&&改为&,会抛出异常。 (ps:所以逻辑与时&是没有意义的)&用于位运算。总结一下,&是按位运算,返回结果是int类型; &&是逻辑运算,返回结果为bool类型。

32.i++和++i有什么区别?

1.i++先赋值后递增; ++i 先递增,然后赋值。

2.i=0, i++=0, ++i=1;.(++i==i++); 结果是真的

33.as和is的区别

as 确定转换时的兼容性。 如果无法执行转换,则返回 null(不生成新对象)。 as判断转换是否成功。

判断的依据是该位是否为空。 它只做类型兼容性判断,不进行真正的类型转换。 它返回 true 或 false,对象

如果为 null,也会返回 false。

as 比 is 更高效,因为只需要进行一次类型兼容性检查

34.谈谈final和final的区别。

Final:不能作为父类继承。 一个类不能既被声明为final,又被声明为。

:在 try{}catch{}{} 结构中使用,以在异常处理期间执行任何清除操作。

35.C#成员修饰符简述

:表示该方法或属性未实现。

const:指定字段或局部变量的值不能更改。

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码