摘录-IT企业必读的200个.NET面试题-03 .NET类型语法基础

基础类型和语法

Q: System.Object中包含哪些方法,哪些是虚方法

System.Object包含了Finalize在内的8个方法,其中有3个虚方法:Equals、GetHashCode和ToString方法。

Q: 值类型和引用类型的区别

所有的值类型都继承自System.ValueType,常用的值类型包括结构、枚举、整数型、浮点型、布尔型等。值类型的赋值会产生一个新的数据副本,所以每个值类型都拥有一个数据副本,而引用类型的赋值则是赋值引用。值类型的对象分配在堆栈上,而引用类型的对象分配在堆上。当比较两个值类型时,进行的是内容比较,比较两个引用类型时,进行的是引用比较。

Q: 简述装箱和拆箱原理

分析:装箱就是把堆栈上的值类型移到堆上;拆箱就是把堆中的对象复制到堆栈中,并且返回其值。先看一下装箱所需要的步骤:在堆上分配一个内存空间,大小等于需要装箱的值类型对象的大小加上两个引用类型对象都拥有的成员:类型对象指针和同步块引用;把堆栈上的值类型对象复制到堆上新分配的对象;返回一个指向堆上新对象的引用,并且存储到堆栈上被装箱的那个值类型的对象里。

答案:装箱和拆箱本质上是值类型在转换到System.Object时引发的堆栈和堆的一系列移动操作。装箱时值类型从堆栈上被复制到堆上,而拆箱时从堆上复制到堆栈上。装箱和拆箱对性能有较大的影响。

Q: C#中是否有全局变量

C#没有传统的意义的全局变量,在C#程序中,任何对象数据都必须属于某个类型。通过公共静态变量可以实现全局变量的功能。

Q: struct和class的区别,struct适用哪些场合

结构是值类型而类是引用类型。结构不具备继承的特性,结构不能拥有无参构造方法,也不能为成员变量定义初始值。结构常用于存储数据的集合,如果涉及复杂操作则应该设计成类而不是结构。

Q: 类型的初始化器何时被调用

类型的初始化器是指具有和类型相同名字、无参数无返回并且以static定义的方法。在类型的任何成员被使用之前调用类型初始化器。

Q: C#中方法的参数可以有哪几种传递方法

ref、out和params。ref和out都实现了参数的引用传递,区别在于ref要求参数在传入前被初始化,out要求参数在方法返回前被初始化。params实现了参数数目可变的方法。

Q: .NET支持哪几种可访问性级别,C#实现了其中哪几种

.NET中定义了6种可访问级别,分别为Private、Family、Assembly、Family&Assembly、Family or Assembly和Public。C#实现了除Family&Assembly之外的其他5种可访问级别,并且分别对应的关键字是private、protected、internal、protected internal和public。

Q: 简述属性的特点及属性和方法的异同

C#中属性是指有返回值而无参数的一种特殊的方法,允许程序员方便地为成员变量提供一对get/set(或者其他任意一个)方法,属性的使用和公共成员变量完全一致,却拥有更好的可扩展性。属性的本质和传统的GetXXX/SetXXX函数一样,但语法更优美,代码更加简洁易读。

Q: 简述C#中的浅复制和深复制

浅复制是指复制类型中的所有值类型成员,而只复制引用类型成员的引用,并且使目标对象共享原对象的引用类型成员对象。深复制是指同时复制值类型成员和引用类型成员的对象。

Q: C#中的using语句有什么作用

using语句为实现了IDisposable的类型对象调用Dispose方法,using语句能够保证使用的对象的Dispose方法在using语句块结束时被调用。C#编译器在编译时自动为using语句加上try/finally块。所有using使用的对象都应该在using语句开始后再初始化,以保证所有的对象能够被Dispose。

内存管理和垃圾回收

Q: 简述.NET中堆栈和堆的特点和差异

.NET程序在进程内存中分配出堆栈、托管堆和非托管堆。所有值类型对象和引用类型对象的引用都分配在堆栈上,堆栈根据对象的生存周期来依次分配和释放,堆栈根据一个指向栈尾的指针来分配内存,效率较高。

.NET所有引用类型对象分配在托管堆上,托管堆连续分配内存,受.NET的垃圾回收机制管理,效率相对堆栈来说要低。非托管堆不受.NET垃圾回收机制管理,内存块由程序员手动申请和释放。

Q: .NET中GC的运行机制

垃圾回收是指收集释放托管堆上不再被使用的对象内存。其基本过程包括:通过算法找到不再被使用的对象、移动对象使所有仍被使用的对象紧靠托管堆的一边和调整各个状态变量。垃圾回收的运行成本较高,对性能影响较大。

Q: Dispose方法和Finalize方法在何时被调用

Dispose方法被使用者主动调用,Finalize方法在对象被垃圾回收的第一轮回收后,由一个专用的.NET线程进行调用。Dispose方法不能保证被执行,而.NET的垃圾回收机制保证了拥有Finalize方法并且需要被调用的类型对象的Finalize方法被执行。调用Finalize方法涉及一系列复杂操作,性能代价高,程序员可以通过GC.SupressFinalize方法通知.NET该对象的Finalize方法不需要被调用。

下面是一个正确使用Dispose和Finalize的代码模板:

public class FinalizeDisposeBase : IDisposable
    {
        private bool _disposed = false;

        ~FinalizeDisposeBase()
        {
            Dispose(false);
        }

        //这里实现了IDispose中的Dispose方法
        public void Dispose()
        {
            Dispose(true);
            //告诉GC此对象的Finalize方法不再需要调用
            GC.SuppressFinalize(true);
        }

        //在这里做实际的析构工作
        //申明为虚方法以供子类在有必要时重写
        protected virtual void Dispose(bool isDisposing)
        {
            if (_disposed)
            {
                return;
            }

            if (isDisposing)
            {
                //在这里释放托管资源
                //只在用户调用Dispose方法时执行
            }
            //在这里释放非托管资源
            //标记对象已被释放
            _disposed = true;
        }
    }
    public sealed class FinalizeDispose : FinalizeDisposeBase
    {
        private bool _mydisposed = false;

        protected override void Dispose(bool isDisposing)
        {
            if (_mydisposed)
            {
                return;
            }
            if (isDisposing)
            {
                //在这里释放托管的并且在这个类型中申明的资源
            }
            //在这里释放非托管的并且在这个类型中申明的资源
            //调用父类的Dispose方法来释放父类中的资源
            base.Dispose(isDisposing);
            //设置子类的标记
            _mydisposed = true;
        }
    }

Q: GC中的代是什么,一共分为几代

3代:0、1、2代。越小的代拥有越多的被释放的机会,而每一次GC中仍存活的对象实例将被移到下一代中。

Q: GC机制中如何判断一个对象是否仍在被使用

GC通过在使用的根引用遍历所有引用的对象实例,当一个对象不能被遍历时,将视为不再被使用。

Q: .NET的托管堆中是否可能出现内存泄露现象

内存泄露是指内存空间上产生了不再被实际使用却又不能被分配的内存。内存泄露将导致主机的内存随程序的运行而逐渐减少。

.NET的托管堆内可能出现严重内存泄露现象,主要产生原因有:大对象的频繁分配和释放、不恰当的保留根引用和错误的Finalize方法。

面向对象的实现

Q: 简述C#中重写、重载和隐藏的概念

重写是指用override关键字重新实现基类中的虚方法,在运行过程中,无论通过哪个类型的引用,真正对象类型的方法将被调用。隐藏是指用new关键字重新实现基类中的方法。重载是指多个方法共享同一个方法名但参数不同(注意,重载与方法的返回类型无关,即返回类型不能区别函数是否重载)。

Q: 为什么在构造方法中调用虚方法会导致问题

构造方法中调用虚方法将导致运行时错误。这是因为当基类的构造方法被调用时,子类的构造方法还未被调用,但是根据实际对象的类型,基类调用的虚方法是定义在子类中的方法,这就意味着调用了一个未完成构造的类型对象的方法,不可预计的错误将可能发生。

异常的处理

Q: 如何针对不同的异常进行捕捉

C#中一个try块可以有多个catch块,每个catch可以针对特别的异常进行特别的处理。为了安全起见,最后应该添加对Exception类型的异常进行捕获的catch块,以保证没有异常被毫无处理地抛出。

Q: 如何使用Conditional特性

Conditional特性用于编写在某个特定编译版本中运行的方法,通常它编写一些在Debug版本中支持测试的方法。当版本不匹配时,编译器会把Conditional特性的方法内容置空。

Q: 如何避免类型转换时的异常

用is和as语句代替直接使用强制转换,可以有效避免InvalidCastException异常,执行效率相对较高。

时间: 2024-11-04 00:14:00

摘录-IT企业必读的200个.NET面试题-03 .NET类型语法基础的相关文章

摘录-IT企业必读的200个.NET面试题-04 字符串、集合和流的使用

字符串处理 Q: System.String是值类型还是引用类型 System.String是引用类型,它的对象在初始化之后就不能再做修改,任何试图修改字符串对象的动作将导致一个新的字符串对象生成. Q: 如何在string和Byte[]对象之间进行转换 字符串和字节数组的转换依赖于编码方式的使用,不同的编码标准将使用不同的算法进行.System.Text.Encoding类型提供了大部分常见编码算法支持,用以进行字符串和字节数组之间的转换.下面是代码例子: class Program { st

摘录-IT企业必读的200个.NET面试题-11 Web Service的开发与应用

SOAP和Web Service的基础概念 Q: 请简述SOAP协议 SOAP协议全称是简单对象访问协议(Simple Object Access Protocol),SOAP致力于以XML形式提供一个简单.轻量的用于分散或分布环境中交换结构化和类型信息的机制.SOAP规范由四部分组成:SOAP信封.SOAP编码规则.SOAP RPC表示.SOAP绑定. Q: 什么是WSDL,它有何作用 WSDL是Web服务描述语言,是一种符合XML语法规范的语言,用以描述服务器端提供的Web Service方

摘录-IT企业必读的200个.NET面试题-10 XML的应用和处理

XML的基本特性 Q: 什么是XML XML就是可扩展标记语言,XML是一种简单的数据存储语言. Q: 简述XML的常用领域及其优势 XML具有内容和结构分离.互操作性强.规范统一.支持多种编码格式等特点,正是因为这些优点,XML已经被应用在数据交换.Web Service.电子商务.配置文件等多种领域. Q: XML中的命名空间如何使用 命名空间被用来模块化XML文档中的元素,当解析器试图读取特定命名空间下的节点时,需要指定命名空间的名称. 使用.NET组件读写XML Q: .NET中操作XM

摘录-IT企业必读的200个.NET面试题-07 .NET多线程编程

多线程的基本概念 Q: 请解释操作系统层面上的线程和进程 进程代表了一个正在运行的应用程序的实体,而一个进程中可包含1个或多个线程. Q: 多线程程序在操作系统里是并行执行的吗 在单CPU的计算机架构上,任何时候只可能存在一个运行的线程,操作系统通过快速的调度轮换使使用者感觉到多线程在同时执行.而在多CPU的架构上,则可能存在完全并行的线程. Q: 什么是纤程 纤程是微软公司提出的轻量级线程的概念,一个纤程拥有自己的栈和寄存器状态.一个线程可以包含多个纤程,和线程由操作系统调度有所不同的是,线程

摘录-IT企业必读的200个.NET面试题-09 .NET中的数据库开发

ADO.NET和数据库的连接 Q: 请简要叙述数据库连接池的机制 数据库连接池就是一个存储数据库连接的缓冲池.ADO.NET对上层用户提供了数据库连接池的服务,使用完的数据库连接将被有选择地保持在数据库连接池中,以供下次使用.当用户以某个连接字符串申请数据库连接时,数据库连接池将尝试在池中寻找具有相同连接字符串的连接,并直接提供给用户. Q: 如何提高连接池内连接的重用率 为了提高数据库连接池的重用率,唯一的方法就是尽量保证系统访问数据库所使用的连接字符串不变.例如统一使用超级用户账户可以进一步

摘录-IT企业必读的200个.NET面试题-05 常用类和接口

类型的基类System.Object Q: 是否存在不继承自System.Object的类 通过运用ILasm.exe的noautoinherit开关,可以生成不从System.Object继承的类型,这种类型不是安全的类型,不建议使用.但是,因为有这种机制的存在,所以程序员在编写代码时不能随意地把任何对象默认看成System.Object的子类型. Q: 在System.Object中定义的三个比较方法有何异同 静态方法ReferenceEquals实现了引用比较.静态Equals方法实现了比

摘录-IT企业必读的200个.NET面试题-02 .NET框架基础

.NET基础概念 什么是CTS.CLS和CLR CTS是通用类型系统:CLS是公共语言规范:CLR是公共语言运行时. CLR技术和COM技术的比较 CLR和COM都定义了组件间交互的规范.COM并没有定义如何描述组件间的依赖性,并且由于其严格的物理约定,造成了很多组件版本升级和控制的问题.CLR运用元数据和逻辑类型定义等机制,有效地解决了COM遗留的一些问题.并且,相较于COM模型,笔者认为CLR更容易理解和学习. 什么是程序集和应用程序域 程序集是一个由类型定义.数据文件和资源文件组成的逻辑集

摘录-IT企业必读的200个.NET面试题-06 .NET中的高级特性

委托 Q: 请解释委托的基本原理 委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,委托实现了回调方法的机制. Q: 委托回调静态方法和实例方法的区别 当委托绑定静态方法时,内部的对象成员变量_target将会被设置为null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法. Q: 什么是链式委托 链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所

阿里云企业邮箱免费版200账号限时开通,速来围观!

这个八月,阿里云又一次引爆市场,企业邮箱免费版再爆惊喜. 即日起至2015年8月31日,成功开通的企业邮箱免费版,账号数将自动翻倍,由原来的100个升级为200个. 如此惊喜,仅限8月! 活动时间: 2015年8月5日 10:00   -   2015年8月31日  18:00 活动对象: 名下未开通企业邮箱免费版的所有阿里云会员. 活动流程: 1)登录您的阿里云会员账号: 2)进入活动页面:http://wanwang.aliyun.com/mail/freemail/, 了解[活动细则]: