百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

CSharp(dotNet)绝版面试题,面试大全(一)

liebian365 2025-03-23 20:57 1 浏览 0 评论

1.什么是CLR?

CLR全称Common Language Runtime,翻译为 公共语言运行时/公共语言运行库。因为 .NET 是一个多语言的平台,任何符合这个平台标准的编程语言编译后都可以在这个平台上运行,这些语言通过各自的编译器编译后生成中间代码CIL。既然是“公共”语言运行时,顾名思义就是可以被多种编程语言公共使用的。CLR提供了很多功能,比如内存管理(GC)、程序集加载、安全性、异常处理和线程同步等等功能。所以,基于CLR的编程语言都能使用这些功能。

2.什么是应用程序域?

应用程序域,英文Application Domain,一般简写为AppDomain。

本来在Windows NT操作系统上,只有进程(Process)和线程(Thread)的概念。

微软的 .NET 平台是基于Windows的,对Windows的抽象,所以 .NET 除了支持在操作系统原生的Process和Thread的概念外,还多抽象了一个叫做AppDomain的东西。

对了,准确来说,是 CLR 对操作系统的抽象。Windows NT 进程的出现是为了把应用程序和其他应用程序以及操作系统内核代码隔离开来。通过怎么隔离的呢,一般来说,一个程序是一个进程,每个把程序的代码和数据以及要用到的资源放在一个特定的内存区域[虚拟地址空间],这样其他程序(进程)就不能轻易的访问到这个程序的数据,这个进程也不能轻易的访问其他程序的地址空间和Windows操作系统内核代码所在的内存。这样,Windows就在操作系统级别实现了程序之间和程序与OS内核之间资源的隔离。微软的 .NET 平台是基于Windows NT之上的抽象,所以Windows NT的很多东西都在 .NET平台(准确来说是CLR)都有相关的抽象。Windows NT 的进程对应于CLR 的进程,CLR的进程和Windows NT进程一样,也是为了应用程序之间的资源的。

前面说了Windows NT 进程是为了隔离程序与程序的,但是为了可扩展性,每个程序(进程)都可以加载第三方的DLL,这个DLL直接被加进了进程之中,成了进程的一部分,这个DLL可以访问进程里的所有资源了,也可以访问的原进程所能访问的所有资源了。这样第三方DLL就可能会破坏程序的数据和代码甚至会访问本来无权访问的资源。

而CLR在Windows NT基础上增加了AppDomain来解决上面的问题。AppDomain可以把第三方DLL放进程序所在的进程运行,但是却不会破环进程的数据结构、代码和其他资源。很多时候,可以把AppDomain理解为.NET平台上的缩小版进程。

AppDomain还解决了一个问题,在一个Window NT进程里有多个AppDomain,而每个AppDomain都可以是一个应用程序。所以,.NET 平台的一个进程可以运行多个应用程序了,这也是AppDomain的功能之一。在IIS7里,每个工作进程w3wp.exe就通过运行多个AppDomain来运行多个Web应用程序的。这样对于操作系统来说,只需要1个进程就可以运行多个应用程序实例了,节省了资源,提高了系统健壮性。

3.什么是托管代码?

托管代码和非托管代码是两个相对的概念。非托管代码是指直接运行在操作系统上的代码。而托管代码顾名思义就是需要在某个东西委托管理它的代,这个东西在.NET平台上就是CLR,说白了托管代码就是受CLR管理的代码,CLR[它的JIT编译器]负责把这些代码转换成操作系统能执行使用的代码。Java的中间代码就相当于.NET的托管代码,Java的虚拟机就相当于.NET的CLR。

4.什么是强类型系统?

语言是静态类型是指:这门语言中每个变量和大部分表达式都有一个特定的类型,而且这个类型是在编译时已知的。而动态类型语言相反,某个变量的类型不但可以改变,而且只能在运行的时候才知道是否正确。

C#属于静态语言,C#4.0出现的dynamic关键字,让C#具有了一部分动态语言的特性,C#不再是一门纯粹的静态类型语言。

在很多资料和文档里,强类型指的得就是静态类型。

强类型的定义是不明确的,在很多地方并不相同。所以我但是为了严谨起见,我一般不说强类型/弱类型,而是说静态类型/动态类型。

  1. 什么是重载?

重载,overload。重载就是允许在一个类型中有多个同名的语言构造,比如一个类中有多个同名的方法,一个类中有多个同名的索引器等。

C#支持方法重载,实例构造函数重载,索引器重载和操作符重载。

方法重载是指允许同一个类中存在同名的多个方法,只需要满足一个条件:这些方法具有不同的签名。对于方法来说,签名是:方法的名称、参数的类型、个数和位置,不包括参数名、不包括返回值、不包括params修饰符,ref和out会被认为是相同的。【顺便说说,这是C#的规定,CLR是允许通过方法的返回值来区分同名方法的】

6.是否可以继承String类?

不能。.NET FCL中System.String类定义为sealed,表示不可继承。之所以会被定义为sealed的是因为字符串太常用,太常见,CLR对它进行了特殊对待,比如拘留池和不可变性,如果String可以被继承的话,会打破CLR对它的一系列特殊对待和字符串的不可变性。

7.using关键字有什么用?什么是IDisposable?

①引入命名空间,这样减轻敲代码的工作量和代码量。

②给名字冲突的类取别名,这样就可以区分不同命名空间里的同名类。

③为所包括的所有实现了IDisposable接口的类型变量代表的资源进行释放。本质是会自动生成一个try块和finally块,并在finally块里把变量转换成IDisposable并调用Dispose方法。

IDisposable是一个接口,是为使用了非托管资源的类销毁资源准备的。如果某个类使用了非托管资源,就应该让这个类实现这个接口,这是.NET的非托管资源销毁的标准实现。IDisposable有一个Dispose方法,实现这个方法来销毁需要销毁的资源。使用这个接口来销毁非托管资源有3种方法,①手动在finally块调用这个方法。②使用using包含这个变量,让编译器生成代码帮我们调用。③如果大意之下,没有调用这个方法,这个方法最终也会在终结器中被调用。

8.string str= null 和 string str="" 说明其中的区别?

前者仅仅声明了一个字符串引用str,只是在线程栈上占用了4个字节的空间,str引用指向进程的虚拟内存地址空间的0x00000000,也就是没有指向任何对象。

后者语句会在当前进程的字符串拘留池中查找,如果已经存在一个只为 "" 的字符串,则直接把这个 "" 所在虚拟空间的首地址(4字节)赋值给str变量,如果当前进程的字符串拘留池中没有 "" 这个字符串,则会在托管堆的GC堆里创建这个字符串,然后这这个字符串对象所在的首地址赋值给变量str。

说白了,前者只定义了一个字符串引用,后者不但定义了一个字符串引用,而且把这个引用执行了一个具体的对象。在前者上调用方法会出现null引用错误,后者则不会。

9.StringBuilder和String的区别?

System.String是对应于C#的string,是C#的基元类型,受到了CLR和C#编译器的特殊对待,它是不可变字符串。

每一个String实例构造以后,都不能改动或增长,每次对String的改动操作,其实都不是在原String对象上执行的,都会生成一个新的字符串。所以,String不适合用在大规模的字符串操作(截断、增长、替换等)上,这样会生成很多的String对象,而导致内存增大和GC回收的压力。

而StringBuilder仅仅是万千.NET FCL类型中的一个普通引用类型而已,如果说特殊的话,仅仅特殊在它表示的数据是字符串而已。如果需要频繁对字符串进行变化操作的话,使用它比使用String能获得更行的性能。

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

虚函数只能可以有子类重写override,子类可以选择重写还是不重写。

抽象函数必须由子类重写,子类没有选择权。

虚函数可以定义在普通类里,也可以定义在抽象类里。而抽象函数只能定义在抽象类。

11.用sealed修饰的类有什么特点?

sealed类不能被继承。

12..NET的错误处理机制是什么?

.NET的错误处理机制是基于Windows NT的「结构化异常实处理机制SEH」建立的。在C#中是使用try catch finally块表示的。

13.C#的checked和unchecked的作用是什么?

checked 和 unchecked是用来只是编译器检查或者不检查包含着的代码是否进行「算术计算溢出检查」的。

如果checked的话,包围着的代码在运行时,如果出现算术计算溢出时,则会抛出异常。

如果unchecked的话,即使溢出,也不会抛出异常。既不checked,也不unchecked的时候,默认是unchecked。

14.C#中的三元操作符是什么?

C#只有一个三元操作符,它就是:条件操作符,【?:】。

a?b:c 这个表达式的值是:如果a为True,则表达式值为b;如果a为False,则表达式的值为c。

15.C#的is和as运算符有什么作用?

is:检查对象的真实类型是否与给定类型兼容。兼容返回True,不兼容则返回False。

as:把对象转换为给定的引用类型。能转换则返回引用,不能转换则返回null。

is运算符既然检查是否兼容与引用类型也能检查是否兼容于值类型,但是不考虑用户自定义转换。

as运算符只能把对象转换为引用类型,不能作用于值类型之上。

16.C#中如何利用DateTime获取季度?

①通过DateTime.Now.Month属性拿到当前月份 month。

②【month / 4 +1】就是季度数。

17.如何在DateTime时间追加工作日?

//

18.类和结构的区别是什么?

类作为引用类型的代表,结构作为值类型的代表,他们之间的区别很多就是引用类型和值类型的区别。

值类型继承自ValueType;而引用类型继承自System.Object。

值类型变量包含其实例数据,每个变量保存了其本身的数据拷贝(副本),因此在默认情况下,值类型的参数传递不会影响参数本身;而引用类型变量保存了其数据的引用地址,因此以值类型进行参数传递时会影响到参数本身,因为两个变量会引用了内存中的同一块地址。

值类型有两种表示:装箱与拆箱;引用类型只有装箱一种形式。而引用类型通常只有一种形式:装箱。

值类型的内存不由GC控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。

值类型是密封的(sealed),因此值类型不能作为其他任何类型的基类,但是可以单继承或者多继承接口;而引用类型一般都有继承性。

值类型不具有多态性;而引用类型有多态性。

值类型变量不可为null值,值类型都会自行初始化为0值;而引用类型变量默认情况下,创建为null值,表示没有指向任何托管堆的引用地址,所以会引发null引用异常。

19.如何进行DateTime和字符串时间之间的转换?

DateTime => 字符串时间 :ToString()方法以及几个重载,另外ToXxString方法。

字符串时间 => DateTime : ① DateTime.Parse和DateTime.TryPase两个静态方法。② Convert.ToDateTime("2013-03-21")

其实系统预定义的这些常见类型,比如Int32、DateTime等,特定类型和字符串直接的相互转换都有上面3种模式。

20.简述C#中的虚方法?

C#的虚方法用 virtual 关键字修饰。虚方法表示这个方法可以被子类重写override,当然子类是否重写由自己决定。

虚方法是C#中实现多态的一种方式。当用一个父类型的变量调用虚方法时候,会根据这个变量指向的真实子类型调用子类的方法。

如果亲们对.net感兴趣,又希望快速提高自己的技能。欢迎关注我的小店~

我独家整理的教程资源哦
~~https://cxxjiaocheng.taobao.com/

2016最新传智博客.net视频教程,24期/21期/19期/11期黑马.net教程:

https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-14058386861.2.iInC3o&id=531143949983

2016最新传智博客.net视频教程,24期/21期/19期/11期黑马.net教程:

https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-14058386861.2.iInC3o&id=531143949983

相关推荐

深度解密epoll 如何工作的?(epoll基本处理流程)

epoll...

大乐透第19082期:头奖开出7注1000万分落六地 奖池41亿元

2019年7月17日晚开奖的体彩超级大乐透第19082期开奖号码为:前区06、18、20、21、31,后区03、04。本期大乐透前区号码五区比为1:0:3:0:1,二区和四区号码没有给出。当期前区和值...

【开奖】4月27日周六:福彩、体彩(2021年4月27日体彩开奖结果)

4月27日开奖福彩3D第2019110期:61222选5第2019110期:0812202122排列3第19110期:303排列5第19110期:30305大乐透第19047期:0304...

“红狒狒”落户哈尔滨铁路局(哈尔滨铁路红肠)

这几天,“红人”“红狒狒”在牡丹江机务段可引起了不小的轰动,众粉丝争相与其拍照留念,在该段人气爆棚!“红狒狒”到底何许人也?“红狒狒”,中文名:和谐3D型电力机车;绰号:红狒狒、番茄;制造商:大连机...

2D、3D、2.5D,做游戏还是搞噱头?玩家都晕了

前言游戏类型就像某种潮流,一种流行罢,另一种接棒成为主流。前两年的新作大多以“开放世界”为标签,在追求纯沙盒的过程中打造出一些细致的分类,比如说“类GTA沙盒”。诚然,纯碎的沙盒游戏并不多见,业内只有...

《战神4》PC版宣传片发布 GTX 1070即可60帧畅玩

在今年10月的时候索尼PlayStation官方正式宣布圣莫尼卡2018年的《战神4》将于2022年1月14日推出PC版本,官方在今天公布了一段PC版宣传片,并且公开了游戏的配置需求。下面让我们一起来...

男星深情好丈夫形象崩塌,半夜搂美女坐大腿,举止亲密

近日,于晓光被拍到深夜在酒吧玩,结束后与一名女子一起上车离开。上车后,女子直接坐在了他腿上,他也顺势搂着美女,美女满脸笑容地坐在他腿上玩手机离开。可能有人会好奇,于晓光是谁呢?于晓光是韩国艺人秋瓷炫的...

d3d12dll丢失怎么修复?d3d12dll加载失败怎么解决?

  d3d12.dll丢失怎么修复?d3d12.dll加载失败怎么解决?很多朋友想要运行游戏的时候都会遇到这个问题,这种情况该怎么办呢?今天系统之家小编给朋友们讲讲具体的解决方法,操作其实还蛮简单的。...

许多玩家反馈《生化4RE》PC一直崩溃 无法进入游戏

今日(3月24日),卡普空《生化危机4:重制版》正式发售,然而有部分PC玩家遇到了游戏崩溃等问题。很多玩家在贴吧发帖称游戏遇到了严重的崩溃问题,且经常反复,报错代码普遍为FatalD3Derror...

微软正式推出适用于WSL Linux的D3D12 GPU视频加速技术

今天,微软正式向WindowsSubsystemforLinux(WSL)用户发布了Direct3D12GPU视频加速支持。在微软通过WSL允许在Linux下使用Open...

《怪物猎人:崛起》曙光系统报错“Fatal d3d error”的解决办法

《怪物猎人:崛起》曙光系统报错“Fatald3derror”的解决办法不少小伙伴反应《怪物猎人:崛起》DLC曙光预载以后打不开游戏,出现了Fatald3derror类似的错误代码,这类问题的解...

Mac+双屏,前端程序员的专业配置 - Loctek 乐歌 D3D 双屏电脑显示器支架

做FE也有一段日子了,电脑屏幕每天在设计稿、浏览器、IDE、即时通讯工具、Terminal、邮箱之间切换。虽然mac的工作区带来了很多灵活,但是依然略显不足。于是入手支架,把公司配的电脑和显示器发挥起...

RPC 的原理和简单使用(rpc详解)

RPC的概念RPC,RemoteProcedureCall,翻译成中文就是远程过程调用,是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数。在调用的...

大厂开源的golang微服务rpc框架 — kitex

提前rpc估计所有的开发同学都知道,不知道的也无所谓,毕竟我也好几年没用了,今天带大家在复习一下。RPC(RemoteProcedureCall):远程过程调用,...

干货!一文掌握Protobuf所有语言所有用法,快收藏

说实话,Protobuf这个库,让人相见时难别亦难,东风无力百花残,每次等到要用它的时候,总感觉还没有完全掌握它的用法,而实际上等去百度或者谷歌的时候,教程都是多么的凌乱不堪。学会它,最直接关系到的,...

取消回复欢迎 发表评论: