C#.NET笔试题基础篇
C#中堆和栈的区别?
解答
在C#中,堆和栈是两种不同的内存分配方式。堆是由程序员控制的内存区域,通常使用new
关键字分配,用于存放对象实例,而栈是由编译器自动管理的内存区域,用于存放局部变量和调用函数时的上下文信息。堆内存的生命周期需要通过垃圾回收器(GC)来回收,而栈内存则在函数调用结束后自动释放。
C#中的委托是什么?事件是不是一种委托?
解答
C#中的委托是一种特殊的类型,它可以持有对方法的引用。委托允许将方法作为参数传递给其他方法,或者将方法作为回调方法存储起来。事件是基于委托的概念实现的,是一种特殊的委托,用于处理对象状态改变时的通知机制。
C#静态构造函数特点是什么?
解答
C#中的静态构造函数是不带任何参数的构造函数,它在任何实例构造函数之前被执行,且在类第一次加载时只执行一次。静态构造函数用于初始化类的静态成员。
CTS、CLS、CLR分别作何解释
解答
CTS(Common Type System)是.NET中的通用类型系统,它定义了所有.NET语言共同使用的类型。CLS(Common Language Specification)是.NET的通用语言规范,确保不同语言编写的代码能够互操作。CLR(Common Language Runtime)是.NET的公共语言运行时,负责执行.NET程序,提供垃圾回收、类型检查等功能。
C#中什么是值类型与引用类型?
解答
在C#中,值类型包括结构(struct)、枚举(enum)等,它们存储在栈上,被复制传递。引用类型包括类(class)、接口(interface)、数组等,它们存储在堆上,通过引用传递。
请详述在C#中类(class
)与结构(struct)的异同?
解答
类和结构在C#中都可以定义自定义数据类型,但它们有以下主要区别:类是引用类型,可以有继承、实现接口,且不是所有的类都能被实例化;结构是值类型,不能被继承,可以有接口,且所有的结构都可以被实例化。类可以有静态成员,而结构不能有静态构造函数。
new关键字的作用
解答
new
关键字在C#中用于创建对象实例或调用构造函数。它分配内存,并返回一个指向新对象的引用。
int?和int有什么区别
解答
int?
是可空的整型(Nullable<int>
),它可以存储int
类型的值,也可以存储null
值。而int
是值类型,不能存储null
。
C#中值传递与引用传递的区别是什么?
解答
值传递会复制变量的值到新的位置,对参数的修改不会影响到原始变量。引用传递则传递变量的内存地址,对参数的修改会影响到原始变量。
C#中参数传递 ref 与 out 的区别?
解答
ref
和out
关键字都用于按引用传递参数,但ref
要求变量在传递前必须被初始化,而out
则不需要。out
参数在方法内部必须被赋值,而ref
则没有这个要求。
C#中什么是装箱和拆箱?
解答
装箱是将值类型转换为引用类型的过程,通常发生在将值类型赋给引用类型变量时。拆箱是将引用类型转换回值类型的过程,需要显式转换。
C#实现多态的过程中 overload重载与override重写的区别?
解答
重载(overload)是方法名相同,参数不同的方法,用于实现同一个类中不同参数的多个方法。重写(override)是派生类中对基类虚方法的实现,用于改变方法的行为。
C# 中static关键字的作用?
解答
static
关键字用于定义类的静态成员,这些成员属于类本身,而不是类的实例。静态成员可以通过类名直接访问,不需要创建类的实例。
C# 成员变量和成员函数前加static的作用?
解答
在成员变量和成员函数前加static
关键字,意味着它们是静态成员,属于类而不是类的实例。静态成员可以通过类名直接访问,通常用于存储类级别的数据,如配置信息。
C#中索引器的实现过程,是否只能根据数字进行索引,请描述一下
解答
索引器允许对象像数组一样通过索引来访问元素。在C#中,索引器不仅限于数字索引,也可以通过其他类型如字符串来索引。索引器通过定义get
和set
访问器来实现。
C#中 abstract class和interface有什么区别?
解答
抽象类(abstract class)可以包含部分实现的方法和属性,并且不能被实例化。接口(interface)是完全抽象的,只包含方法和属性的签名,不包含实现,可以被多个类实现。
C#中用sealed修饰的类有什么特点?
解答
用sealed
修饰的类不能被其他类继承。它可以包含虚方法,但是这些虚方法不能被子类重写。
字符串中string str=null和string str=""和string str=string.Empty的区别
解答
string str=null
声明了一个字符串引用,但是没有分配内存空间。string str=""
声明了一个空字符串,分配了内存空间。string str=string.Empty
使用string.Empty
常量,它是一个空的字符串字面量,通常用于初始化字符串变量。
byte b = 'a'; byte c = 1; byte d = 'ab'; byte e = '啊'; byte g = 256; 这些变量有些错误是错在哪里?
解答
这些变量声明中的错误包括:
byte b = 'a';
:正确,'a'是ASCII字符,可以赋值给byte。byte c = 1;
:正确,整数字面量可以直接赋值给byte。byte d = 'ab';
:错误,'ab'是两个字符,不能赋值给byte。byte e = '啊';
:错误,'啊'是一个多字节字符,不能赋值给byte。byte g = 256;
:错误,256超出了byte的取值范围(0-255)。
string和StringBuilder的区别,两者性能的比较
解答
string
是不可变的引用类型,每次修改都会创建新的字符串对象。StringBuilder
是可变的,可以在原有基础上进行修改,不需要创建新对象。在频繁修改字符串内容的场景下,StringBuilder
性能更优。
什么是扩展方法?
解答
扩展方法是在现有类型上添加新方法的一种技术,它通过静态类中的静态方法实现,并且第一个参数使用this
关键字修饰,表示扩展方法的作用对象。
特性是什么?如何使用?
解答
特性(Attribute)是一种提供元数据的方式,它可以修饰程序的元素(如类、方法等),并在运行时通过反射获取。特性用于描述程序元素的行为或应用的配置信息。
什么叫应用程序域(AppDomain)
解答
应用程序域(AppDomain)是.NET中的一种隔离机制,用于将一个应用程序范围内创建的对象与在其他应用程序中创建的对象隔离,确保运行时行为的可预测性。它可以在单个进程中创建多个应用程序域。
byte a = 255; a += 5; a的值是多少?
解答
由于byte的数据范围是0到255,当a的值达到255后再增加5,将会发生溢出,结果是0。
const和readonly有什么区别?
解答
const
是编译时常量,必须在声明时初始化,不能被修改。readonly
是运行时常量,可以在声明时或在构造函数中初始化,一旦赋值后不能被修改。const
可以用于修饰类字段和局部变量,而readonly
只能用于修饰类字段。
什么是强类型,什么是弱类型?哪种更好些?为什么?
解答
强类型(Strongly Typed)是指在编译时检查类型,类型一旦声明就不能更改。弱类型(Weakly Typed)是指在运行时确定类型,类型可以在运行时更改。强类型更安全,因为它可以提前发现类型错误,提高代码的可读性和可维护性。弱类型更灵活,但容易在运行时出现类型错误。
Math.Round(11.5)等于多少?
Math.Round(-11.5)等于多少?
解答
Math.Round(11.5)
的结果是12,Math.Round(-11.5)
的结果是-12。Math.Round
方法按照四舍五入的原则进行数值的舍入。
&和&&的区别
解答
&
是按位与运算符,用于位运算。&&
是逻辑与运算符,用于布尔逻辑运算。&&
具有短路特性,如果第一个操作数为false
,则不会计算第二个操作数。
i++和++i有什么区别?
解答
i++
是后缀自增运算符,先返回变量i的原始值,然后i的值加1。++i
是前缀自增运算符,先将i的值加1,然后返回增加后的值。
as和is的区别
解答
is
用于检查对象是否兼容特定类型,但不执行类型转换。as
用于尝试将对象转换为特定类型,如果转换失败则返回null
。as
比is
更高效,因为它只需进行一次类型兼容性检查。
谈谈final、finally的区别
解答
final
是一个类或方法的修饰符,表示它不能被继承或重写。finally
是异常处理的一部分,与try
和catch
一起使用,无论是否发生异常,finally
块中的代码都会被执行。
简述C#成员修饰符
解答
C#中的成员修饰符用于控制成员的访问级别和行为,包括public
、private
、protected
、internal
、static
、readonly
、const
等。
什么是匿名类,有什么好处?
解答
匿名类是没有名称的类,通常用于实现一次性使用的简单对象。它的好处是简化代码,避免复杂的类定义,提高代码的灵活性和简洁性。
什么是逐字字符串
解答
逐字字符串(Verbatim String)是C#中一种特殊类型的字符串,它忽略字符串中的转义字符,直接按字面意义解释。在字符串前加上@
符号来定义逐字字符串。
列举你知道的数字格式化转换
解答
数字格式化转换包括但不限于:
- 标准格式化字符串,如
"N"
表示数字格式化为带有逗号分隔的数值。 - 自定义格式化字符串,如
"{0:000.00}"
表示数字格式化为三位整数部分和两位小数。 - 内置快捷方式,如
ToString("C")
表示货币格式。 - 格式化方法,如
string.Format("{0:0.00}", 1234.5678)
。
说说字符串拼接、字符串内插法
解答
字符串拼接可以使用+
运算符或String.Concat
方法将多个字符串连接成一个新的字符串。字符串内插法是一种方便的字符串格式化技术,使用$""
表示法,可以在字符串中直接嵌入变量或表达式。
什么是虚函数?什么是抽象函数?
解答
虚函数(Virtual Function)是可以在派生类中被重写的函数。抽象函数(Abstract Function)是不能被实例化的抽象类中的函数,必须在非抽象派生类中被重写。
什么是WebService?
解答
WebService是基于网络的分布式模块化组件,它执行特定的任务并遵守具体的技术规范,这些规范使得WebService能与其他兼容的组件进行互操作。
ADO.NET常用对象有哪些?
解答
ADO.NET中的常用对象包括Connection
、Command
、DataReader
、DataAdapter
和DataSet
,它们用于数据库连接、命令执行、数据读取和数据缓存等操作。
在ASP.NET中所有的自定义用户控件都必须继承自什么?
解答
在ASP.NET中,所有的自定义用户控件都必须继承自System.Web.UI.Control
类。
在.NET托管代码中我们不必担心内存泄漏,这是为什么?
解答
在.NET托管代码中,内存管理是由.NET运行时环境负责的,它使用垃圾回收器(GC)来自动回收不再使用的对象,从而防止内存泄漏。
什么是MVC模式
解答
MVC(Model-View-Controller)模式是一种设计模式,用于分离应用程序的业务逻辑、用户界面和控制逻辑。模型(Model)负责数据和业务逻辑,视图(View)负责显示,控制器(Controller)负责接收用户输入并调用模型和视图去完成用户的请求。
能foreach遍历访问的对象的要求
解答
可以使用foreach
遍历访问的对象必须实现IEnumerable
接口或声明GetEnumerator
方法,这样才能支持迭代器模式。
什么是反射?
解答
反射是.NET中的一种机制,允许程序在运行时检查和使用类型信息。反射可以动态地创建类型的实例,设置现有对象的类型或获取现有对象的类型,调用类型的方法和访问类型的字段属性。
ORM中的延迟加载与直接加载有什么异同?
解答
延迟加载(Lazy Loading)是在真正需要数据时才进行加载,减少了不必要的数据加载。直接加载(Eager Loading)是在查询时就加载所有相关数据。延迟加载可以提高性能,但可能导致N+1查询问题;直接加载一次性加载所有数据,但可能增加不必要的数据加载。
简述Func与Action的区别?
解答
Func
是有返回值的委托,而Action
是没有返回值的委托。Func
可以指定返回类型和参数类型,Action
只能指定参数类型。
23种设计模式分别叫什么名称,如何分类?
解答
设计模式分为三类:创建型、行为型和结构型。
- 创建型:单例模式、工厂模式、建造者模式、原型模式、工厂方法模式。
- 行为型:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
- 结构型:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。