- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[结构与类区别
经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点.1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字struct.在语法上其实类和结构有着很多相似的地方.? ?定义类的语法? ? 1 class Person 2 { 3 private string name; 4 private int age; 5 6 public void SayHi() 7 { 8 Console.WriteLine(Hello,My Name is +this.name+,My Age is +this.age); 9 }10 }??定义结构的语法.? 1 struct Rectangle 2 { 3 private int width; 4 private int height; 5 6 public int GetArea() 7 { 8 return this.width * height; 9 }10 }? ? 从语法上来看.它们的语法都大同小异,类里面的成员几乎都可以定义在结构体中,但是析构函数除外.这是为什么呢?后面解答.2. 虽然我们说它们的语法极其相似,但是它们在语法还是有几点区别的.? ?a.在结构体中可以声明字段,但是声明字段的时候是不能给初始值的.所以当我们试图这样写代码的时候,C#编译器在将源代码编译成程序集的是会提示语法错误.? ? ? ?? ?我们知道如果我们在类中声明1个字段的同时给这个字段赋初始值,这样是可以滴,就像下面这样.?class Person{ private string name =jack;}? ? 但是如果像下面这样确实不行滴.声明完1个字段,再为这个字段赋值,就像下面这样.?1 class Person2 {3 private string name;4 name=jack;5 }?? ? 所以我们说,在类下面只能直接定义类的成员,只能定义. ?比如定义成员字段,属性 方法 构造函数等等.上面那样的代码name=jack这样的代码我们称之为“执行代码”,意思就是说这些代码只有在被执行的时候才会有效果.而你试想一下,那么这些代码什么时候被执行呢? 创建类的对象的时候? 那还用得着构造函数吗? 经常看到一些初学者在类的下面直接写这样代码.?? ? 但是又有人会说了.诶, 那么为什么在声明类的字段的时候可以赋值呢?赋值表达式也是1个执行代码啊?为什么这样就不报错呢?给你看看下面的代码 你就会知道其中的真相了.? ? ?? ? ?当我们使用C#编译器将这段代码编译为程序集的时候,看看微软为我们生成的代码吧.? ? ?? ? ?展开构造函数,看看这里面有什么蹊跷吧!? ? ?? ? ?是的,C#编译器在编译的时候,如果我们声明字段的时候为字段赋值,那么为字段赋值的代码C#编译器在编译的时候会将赋值的代码放到构造函数中去,其实严格意义上来说,类的字段也是不能有初始值的.只不过微软在背后帮我们做了点事情,我们不知道而已.? ? ?所以,不管在类和结构中,执行代码一定要写在方法中.不能直接写在结构或者类的下面.因为当执行代码写在方法中了,那么这些执行代码的执行时机才可以确定,就是这个方法被调用的时候了.? ? 从上面的内容,我们可以看出.其实从本质上来说,类和结构的字段都是不能有初始值的.只不过微软在语法上允许我们在定义类的字段的时候为其赋值.但是背后微软其实是把赋值的执行代码放到构造函数中去执行的. 而结构体微软却不帮我们这样做.至于这其中是什么原因.查了些资料,也看了园子里其他博友的文章,感觉都不能说服我,但是自己也想不出1个确切的理由微软为什么要这样做.那就先放着吧,希望参透其中原理的童鞋能指点.?? ??b. 关于构造函数.? ? 首先,关于隐式构造函数.我们知道,在1个类中如果我们没有为类写任意的构造函数,那么C#编译器在编译的时候会自动的为这个类生成1个无参数的构造函数.我们将这个构造函数称之为隐式构造函数 但是一旦我们为这个类写了任意的1个构造函数的时候,这个隐式的构造函数就不会自动生成了.? ? 在结构中,就不是这样了,在结构中隐式的构造函数无论如何都存在.看看代码吧.? ? 在下面的代码中 我们为结构体写了1个带参数的构造函数.如下.? ?? ? 我们使用new关键字来创建结构体对象,我们发现调用构造函数的时候,提示是有两个构造函数的.多了1个无参数的构造函数.? ? ?? ?那么 我们再想,能不能手动的写1个无参数的构造函数呢?我们怀着无比激动的心情,试一下.? ?? 结果是华丽丽的报错了.所以我们得出结论.?隐式的无参数的构造函数在结构中无论如何都是存在的,所以程序员不能手动的为结构添加
您可能关注的文档
最近下载
- 2024官方兽医考试更新题库及答案.doc
- 八年级数学平方差公式20题(含答案).doc
- 市政工程分部分项划分表(全套)必威体育精装版版.docx
- (中职)Access数据库应用技术教案课题: 任务6 创建操作查询.docx
- 通达信筹码峰左右画线主图通达信指标公式源码.docx
- 《GBT 24421.2-2023服务业组织标准化工作指南 第2部分:标准体系构建》必威体育精装版解读.pptx
- GB 55009-2021 燃气工程项目规范.pdf
- 法医临床学试题.docx VIP
- 河北对口单招第十类职业适应性测试(计算机)-第一章计算机基础知识课件ppt.pptx VIP
- 九年级语文下册 第8课《假如我有九条命》课件 上海五四制版.ppt VIP
文档评论(0)