- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
了解值类型 引用类型,装箱 拆箱,Object类
了解值类型 引用类型,装箱 拆箱,Object类
装箱/拆箱,值类型/引用类型和Object类,这些都是.NET程序员人人皆知且人人都应该掌握的概念。大多数人都对他们非常了解,可是和一些同行们交流时我发现一些细节其实很多人并不了解,尤其是它们结合讨论的情景,本文通过一些代码来阐述一些我知道的概念。
如果下面代码你觉得非常费解的话,那可能你是新手,推荐你先看一些相应的概念或者教程再来这里。
如果你不是新手,对相应知识已经了解,并且通过下面代码学到了一些进阶的东西,那么我很高兴。
当然标题归标题,一门技术是很难真正做到彻底了解,本文也意在抛砖引玉。
代码1:Object.Equals
考虑下面代码的结果:
Console.WriteLine(Object.Equals(1,1));
Console.WriteLine(Object.Equals(1,(byte)1));
答案:True,False
首先Object.Equals参数是两个object,所以1(值类型)会被装箱成引用类型,这会使CLR在托管堆中创建两个全新的Object对象,然后Object.Equals先判断两个object是否有null,没有则调用Object的对象方法Equals,而由于1是值类型,值类型改写Object.Equals并进行比特比较,最终由于object1的比特值完全等于object2的比特值第一句True,第二句很显然Int和Byte内存大小不一样,比特比较不会成功。
代码2:Object.ReferenceEquals
考虑下面代码的结果:
Console.WriteLine(Object.ReferenceEquals(1,1));
答案:False
同样,Object.ReferenceEquals参数是两个object,所以CLR会在托管堆中建立两个object来分别装Int值,但Object.ReferenceEquals的函数就是判断两个引用的是否指向同一个在托管堆的空间对象,这里当然是False了。
代码3:再强化一下理解
下面代码,如果MyType是class或struct时,分别会输出什么?
struct/classMyType
{
publicintData;
}
classProgram
{
staticvoidMain(string args)
{
MyTypes1=newMyType();
MyTypes2=newMyType();
s1.Data=s2.Data=1990;
Console.WriteLine(Object.Equals(s1,s2));
}
}
答案:
struct输出:True class输出:False
这个为了强化下理解,原理和上面的一样,值类型和引用类型针对Object.Equals的执行是不一样的
代码4:问候了Equals,我们再看看==
下面代码输出什么?
structMyType
{
publicintData;
}
classProgram
{
staticvoidMain(string args)
{
MyTypes1=newMyType();
MyTypes2=newMyType();
s1.Data=s2.Data=1990;
Console.WriteLine(s1==s2);
}
}
如果MyType是class,那么结果所有人会知道是False,那如果MyType是struct,结果是?…结果是编译错误,是的,值类型中的用户自定义结构体默认==运算符是不被预先重载的,但是引用类型,枚举,原始值类型的==有。
代码5:神奇的String
下面输出结果?
stringa=aaa;
stringb=aaa;
Console.WriteLine(Object.Equals(a,b));
Console.WriteLine(Object.ReferenceEquals(a,b));
Console.WriteLine(a==b);
Console.WriteLine((object)a==b);
//这句VS会提示警告:
//Possible unintended reference comparison;to get avalue comparison,
//cast the left hand side to typestring
答案:都是True,但True的方式不一样,呵呵,我们一句一句分析
第一句:调用a.Equals(b),String类的执行是字符串比较,true
第二句:注意这里不进行字符串比较,这里是判断两个引用是不是指向同一个对象,因为Object.ReferenceEquals参数是两个object,但是.NET中相同的字符串(编译器可预知判断的)CL
您可能关注的文档
- 《神经系统的组成》教学设计崔保伟.doc
- 《秀场后台》王朔二.doc
- 《管理信息系统》第三次作业.doc
- 《系统程序员成长计划》成长过程.doc
- 《程序员》VS一代算法大师高德纳.doc
- 《纤维纺丝工艺与质量有效监管》.doc
- 《纯净的原色》.doc
- 《组织行为学》专题8压力与冲突选择题.doc
- 《细胞膜系统的边界》课堂教学设计.doc
- 《经济学》基础班讲义(学生版).docx
- 2026年二级建造师之二建矿业工程实务考试题库300道及参考答案【研优卷】.docx
- 2026年保安员考试题库500道标准卷.docx
- 2026年保安员考试题库500道及答案【易错题】.docx
- 2026年中级银行从业资格之中级公司信贷考试题库300道及完整答案【名师系列】.docx
- 2025年一级注册建筑师考试题库500道(a卷).docx
- 2026年一级建造师之一建铁路工程实务考试题库300道(夺冠系列).docx
- 2026年中级银行从业资格之中级银行业法律法规与综合能力考试题库500道及参考答案(实用).docx
- 2026年中级注册安全工程师之安全生产管理考试题库500道(精华版).docx
- 2025年教师转岗考试公共基础知识备考题库200道带答案(考试直接用).docx
- 2026年保安员考试题库500道【考点精练】.docx
最近下载
- 商务与经济统计答案.pdf
- 2025-2026学年河南省南阳三中七年级(上)月考英语试卷(10月份)(含答案).docx VIP
- 新概念三册Lesson59备课笔记.ppt VIP
- 2025年辅警招聘考试简答题题库(含答案+解析).docx VIP
- 2025-2026学年河南省南阳三中八年级(上)10月月考数学试卷(含答案).pdf VIP
- 化学检验员(中级)模拟练习题(含参考答案).docx VIP
- 209074_12J201平屋面建筑构造_部分1.pdf VIP
- 面向政府、集团客户的项目营销.pptx VIP
- 2025版CSCO尿路上皮癌诊疗指南.docx VIP
- 2026中国人民银行直属事业单位招聘60人参考题库及答案解析(夺冠系列).docx VIP
原创力文档


文档评论(0)