欢迎来到天天文库
浏览记录
ID:42580815
大小:368.83 KB
页数:12页
时间:2019-09-18
《结构与类区别》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、经常听到有朋友在讨论C#中的结构与类有什么区别•正好这几日闲来无事,自己总结一下,希望大家指点.1.首先是语法定义上的区别啦,这个就不用多说了•定义类使用关键字class定义结构使用关键字struct.在语法上其实类和结构有着很多相似的地方.定义类的语法lclassPcrson2{3privatcstringnamc;4privateintage;56publicvoidSayHi()7{SConsole.WriteLine(^Hel1o,MyNameis〃+this.name+zz,MyAgeis〃+this.age);9}10}定义结构的语法.1structRectangle2{3p
2、rivateintwidth;4privateintheight;56publicintGetArea()7{8returnthis.width*height;9}10}从语法上来看.它们的语法都大同小异,类里面的成员几乎都可以定义在结构体中,但是析构函数除外•这是为什么呢?后面解答.1.虽然我们说它们的语法极其相似,但是它们在语法还是有几点区别的.a.在结构体中可以声明字段,但是声明字段的时候是不能给初始值的•所以当我们试图这样写代码的时候,C#编译器在将源代码编译成程序集的是会提示语法错误.1JJConsoleApplication1.Rectangle.widthf/:结构口K能有
3、实僥字段初始值设走项我们知道如果我们在类中声明1个字段的同时给这个字段赋初始值,这样是可以滴,就像下面这样.classPerson!privatestringname二〃jack";}下面这样确实不行滴.声明完1个字段,再为这个字段赋值,就像下面这样.lclassPerson2{3privatestringname;4name=z,jackz,;5)所以我们说,在类下面只能直接定义类的成员,只能定义.比如定义成员字段,属性方法构造函数等等.上面那样的代码nameijack”这样的代码我们称之为“执行代码”,意思就是说这些代码只有在被执行的时候才会有效果•而你试想一下,那么这些代码什么时候
4、被执行呢?创建类的对象的时候?那还用得着构造函数吗?经常看到一些初学者在类的下面直接写这样代码.dassPerson驟勰矚耀你想想
5、voidSayHi(){Console.WriteLine("大家好'我是”+this.name+",我的年龄是"+this.age);}当我们使用C#编译器将这段代码编译为程序集的时候,看看微软为我们生成的代码吧.internalclassPerson//Fieldsprivateintage;privatestringname;//MethodspublicPersonO;publicvoidSayHiO;}ExpandMethods展开构造函数,看看这里面有什么蹊跷吧!publicPersonO(this.name="jack";this.age=12;是的,c#编译器在编译的时候
6、,如果我们声明字段的时候为字段赋值,那么为字段赋值的代码C#编译器在编译的时候会将赋值的代码放到构造函数中去,其实严格意义上来说,类的字段也是不能有初始值的•只不过微软在背后帮我们做了点事情,我们不知道而已.所以,不管在类和结构中,执行代码一定要写在方法中•不能直接写在结构或者类的下面.因为当执行代码写在方法中了,那么这些执行代码的执行时机才可以确定,就是这个方法被调用的时候了.从上面的内容,我们可以看出.其实从本质上来说,类和结构的字段都是不能有初始值的.只不过微软在语法上允许我们在定义类的字段的时候为其赋值•但是背后微软其实是把赋值的执行代码放到构造函数中去执行的.而结构体微软却不帮
7、我们这样做•至于这其中是什么原因.查了些资料,也看了园子里其他博友的文章,感觉都不能说服我,但是自己也想不出1个确切的理由微软为什么要这样做.那就先放着吧,希望参透其中原理的童鞋能指点.b.关于构造函数.首先,关于隐式构造函数.我们知道,在1个类中如果我们没有为类写任意的构造函数,那么C#编译器在编译的时候会自动的为这个类生成1个无参数的构造函数.我们将这个构造函数称之为隐式构造函数但是一旦我们为这个类写了任意的1个构造函数的时候,
此文档下载收益归作者所有