《修炼之道:.NET开发要点精讲》读书笔记(二)

1.简述.NET中CTS、CLS以及CLR的含义与作用。

A:CTS指公共类型系统,是.NET平台中各种语言必须遵守的类型规范;CLS指公共语言规范,是.NET平台中各种语言必须遵守的语言规范;CLR指公共语言运行时,它是一个虚拟机,.NET平台中所有的托管代码均需要运行在CLR中,你可以把它看成另外一个操作系统。

 

2.简述.NET程序集(exe文件、dll文件)不能在无CLR环境的操作系统中运行的原因?

A:.NET程序集并不是最终可以运行在操作系统中的机器指令,它只是介于源代码和机器指令之间的一个中间件,没有CLR的存在,就不能将该中间件转换成对应操作系统中的机器指令。换句话说,.NET程序集不是传统意义上的可执行文件。

 

3..NET是否支持跨平台?与Java平台的区别在哪里?

A:支持,理论上讲,.NET的跨平台和Java的跨平台没有差别。

 

4..NET中程序集的“可执行性”与“可读性”分别指什么?

A:.NET中的程序集是一种介于源代码和机器代码之间的中间件,对于开发者来讲,可以从程序集中读取出类似元数据、IL代码或者资源数据等信息,而对于最终用户,程序集是可以在CLR中运行的。

 

 

1.“值类型对象分配在栈中,引用类型对象分配在堆中”这句话是否准确?为什么?

A:严格上讲,不太准确,值类型对象也可以被包含在引用类型对象内部,一起分配在堆中,因此不能一概而论。

 

2.“值类型对象的赋值就等于对象的浅复制”这句话是否正确?为什么?

A:正确。值类型对象赋值的过程就是浅复制的过程,依次将对象成员一一进行拷贝。

 

3.下面代码Code 3-13运行后会输出“true”,因此可以判断String是值类型,因为只有值类型判等时才比较两者所包含的内容是否一一相等,以上陈述是否正确?为什么?

//Code 3-13·66·

 

class Program

{

static void Main()

{

String a = new String(“123”);

String b = new String(“123”);

if(a == b)

{

Console.WriteLine(“true”);

}

else

{

Console.WriteLine(“false”);

}

}

}

A:错。String类型是一个特殊的引用类型,它的判等不同于其它引用类型去比较对象引用是否指向堆中同一实例,而是和值类型判等一致,比较对象内容是否一一相等。除此之外,String类型还是不可改变类型,对String对象的任何操作均不能改变该对象。

 

4.简要描述深复制与浅复制的区别。

A:对象进行浅复制时,只将对象的直接成员一一进行拷贝,当对象包含有引用类型成员时,源对象与副本之间有关联;对象进行深复制时,会将对象的所有成员(包括直接成员于间接成员)依次进行拷贝,不管对象是否包含引用类型成员,源对象与副本都无任何关联。

 

 

1.“当栈中没有引用指向堆中对象实例时,GC会对堆中实例进行内存回收”这句话是否准确?为什么?

A:不准确。因为GC不但会检查栈中的引用,还会检查堆中是否有引用。因此,只有当没有任何引用指向堆中对象实例时,GC才会考虑回收对象实例所占用的内存。

 

2.如果一个类型正确地实现了IDisposable接口,那么调用该类型对象的Dispose()方法后,是否意味着该对象已经死亡?为什么?

A:调用一个对象的Dispose()方法后,并不表明该对象死亡,只有GC将对象实例占用的内存回收后,才可以说对象死亡。但是通常情况下,调用对象的Dispose()方法后,由于释放了该对象的非托管资源,因此该对象几乎就处于“无用”状态,“等待死亡”是它正确的选择。

 

3.如果一个类型使用了非托管资源,那么释放非托管资源的最佳时机是什么时候?

A:当对象使用完毕后,就应该及时释放它的非托管资源,比如调用它的Dispose()方法(如果有),对象的非托管资源释放后,对象基本上就处于“无用”状态,因此一般不能再继续使用该对象。为了防止遗忘手动释放对象的非托管资源,我们应该在对象的析构方法中编写释放非托管资源的代码,这样一来,假如我们没有手动释放对象的非托管资源,GC也会在适当时机调用析构方法,对象的非托管资源总能正确被释放。

 

 

1.简述委托包含哪两个重要部分。

A:委托包含两个重要组成:Method和Target,分别代表委托要调用的方法和该方法所属的对象(如果为静态方法,则Target为null)。

 

2.怎样简单地说明委托的不可改变特性?

A:对委托的所有操作,均需要将操作后的结果在进行赋值,比如使用“+=”、“-=”将操作后的结果赋值给原委托变量。这说明对委托的操作均不能改变委托本身。

 

3.“事件是委托对象”是否准确?

A:准确。.NET中的事件是一种特殊的委托对象,即在定义委托对象时,在声明语句前增加了“event”关键字。事件的出现确保委托的调用只能发生在类型内部。

 

4.为什么说委托是.NET中的“重中之重”?

A:因为程序的运行过程就是方法的不断调用过程,而委托的作用就是“调用方法”,它不仅能够将方法作为参数传递,还能同时(同步或异步)调用多个具有相同签名的方法。

 

5.弱委托的关键是什么?

A:弱委托的关键是弱引用,弱委托是通过弱引用实现的。

转载于:https://www.cnblogs.com/Lvkang/p/9946843.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值