C#中怎么样来理解老庄结构怎么样和类之间的区别

C#中结构与类的区别_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
14页免费4页免费8页免费45页免费2页免费 6页免费1页免费4页免费4页免费117页1下载券
喜欢此文档的还喜欢14页免费4页免费3页免费3页免费5页免费
C#中结构与类的区别|面​试​必​备
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢C#中结构与类的区别(转)
类与结构的实例比较
类与结构的差别
如何选择结构还是类
一、类与结构的示例比较:
结构示例:
public struct Person
int& weight
public bool overWeight()
&&&&&&&&&&&&
//implement something
public class TestTime
public void passtime()
&&&&&&&&&&&&&
//implementation of behavior
调用过程:
public class Test
public static ovid Main
&&&&&&&&&&&&&
Person Myperson=new
Person&&&&&
//声明结构
&&&&&&&&&&&&&
TestTime Mytime=New
TestTime&&&
从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class
的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?
二、类与结构的差别
1、值类型与引用类型
结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型(例如:int 对应System.int32 结构,string
对应 system.string 结构
,通过使用结构可以创建更多的值类型);类是引用类型:引用类型在堆上分配地址,堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑。
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
注:(1)虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object。(2)虽然结构的初始化也使用了New
操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用。
结构不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed;类完全可扩展的,除非显示的声明sealed
否则类可以继承其他类和接口,自身也能被继承。
注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
例如:结构实现接口
interface IImage
void Paint();
struct Picture : IImage
public void Paint()
&&&&&&&&&&
&&&&&&&&&&&&&&
// painting code goes here
&&&&&&&&&&
&&&&&&&&&&
private int x, y,& // other struct members
3、内部结构:
结构没有默认的构造函数,但是可以添加构造函数,没有析构函数,没有 abstract 和
sealed(因为不能继承),不能有protected 修饰符,可以不使用new
初始化,在结构中初始化实例字段是错误的;类有默认的构造函数,有析构函数,可以使用 abstract 和
sealed,有protected 修饰符,必须使用new 初始化。
三、如何选择结构还是类
讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:
1、堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2、 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000
个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
3、在表现抽象和多级别的对象层次时,类是最好的选择
4、大多数情况下该类型只是一些数据时,结构时最佳的选择
本文来自CSDN博客
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。文章分享到:C#中的结构和类的区别
概述:类和结构实际上都是创建对象的模板!内存中存储方式上的区别是类存储在堆(heap)上,而结构存储在堆栈(stack)上!语法上只是关键字struct和class的区别!都是用new关键字声明实例,类比结构常用!
&&&&&&&&成员:数据成员(静态/实例数据,字段、常量、事件),函数成员(方法、属性、构造函数、终结器、运算符重载、索引器),嵌套类。
&&&&&&&&通常,对于OO语言,除用static进行显式声明过的外,类成员总是实例成员。
&&&&&&&&&&&&&&静态构造函数在代码引用类之前执行一次,静态构造函数通常在第一次调用类的成员之前执行。没有访问修饰符,其他C#代码从来不调用它,在加载类时,总由。NET运行库调用,不能带任何参数,一个类只能有一个静态构造函数,职能访问类的静态成员,不能访问实例成员。
&&&&&&&&&&&&&&静态构造函数是在加载类时执行,实例构造函数是在创建类的实例时执行,两者不会冲突。
&&&&&&&&&&&&&&System.Drawing的使用,项目/添加引用,选中System.Drawing,表示编译时引用了System.Drawing.dll程序集,且必须为System.Drawing命名空间添加一个using语句:
using System.Drawing
&&&&&&&&&&&&&&const和readonly:const总是static态的,而readonly必须显式声明为static。
&&&&&&&&&&&&&&每个结构都派生于System.ValueType,System.ValueType派生于System.Object。
&&&&&&&&&&&&&&结构可以调用System.Object中的方法,但不可以被继承。
托管在堆栈(stack)中的结构性能比托管在堆(heap)中的类好。
&&&&&&&&&&&&&&结构定义函数和类中定义函数完全相同。
&&&&&&&&&&&&&&结构隐式给出默认的构造函数把所有字段初始化为0,所以结构不允许声明构造函数,也不能提供字段的默认值(以绕过默认构造函数)
3.结构(struct)和类(class)的区别
&&&&&&&&&&&&&&A.结构是值类型,而类是引用类型。(存储在堆栈中,或存储为内联inline)
&&&&&&&&&&&&&&B.结构不支持继承。
&&&&&&&&&&&&&&C.结构不允许声明构造函数。(编译器总为结构提供无参数的构造函数,且不允许替换)。
&&&&&&&&&&&&&&D.使用结构可以指定字段在内存中如何布局。
&&&&&&&&&&&&&&E.结构总是派生于System.ValueType,类可以派生于用户选择的另一个类,但是
都可以派生于多个接口。
4.性能分析
&&&&&&&&&&&&&&A.为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中;结构出了作用域被删除时,速度也非常快。
&&&&&&&&&&&&&&B.只要把结构作为参数传递或把结构赋值给另一个结构时,结构所有内容被复制;而类只复制引用即可。这样就有性能损失!
&&&&&&&&&&&&&&建议:结构主要用于小的数据结构!当把结构作为参数传递给方法时,应把它作为ref参数传递,以避免性能损失。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1227人阅读
经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点.
1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字struct.在语法上其实类和结构有着很多相似的地方.
& &定义类的语法& &&
1 class Person
private string
private int
public void SayHi()
Console.WriteLine(&Hello,My Name is &+this.name+&,My Age is &+this.age);
& &&定义结构的语法.&
struct Rectangle
private int
private int
public int GetArea()
return this.width *
& & 从语法上来看.它们的语法都大同小异,类里面的成员几乎都可以定义在结构体中,但是析构函数除外.这是为什么呢?后面解答.
2. 虽然我们说它们的语法极其相似,但是它们在语法还是有几点区别的.
& &a.在结构体中可以声明字段,但是声明字段的时候是不能给初始值的.所以当我们试图这样写代码的时候,C#编译器在将源代码编译成程序集的是会提示语法错误.
& &我们知道如果我们在类中声明1个字段的同时给这个字段赋初始值,这样是可以滴,就像下面这样.&
class Person
private string name =&jack&;
& & 但是如果像下面这样确实不行滴.声明完1个字段,再为这个字段赋值,就像下面这样.&
1 class Person
private string
name=&jack&;
& & 所以我们说,在类下面只能直接定义类的成员,只能定义. &比如定义成员字段,属性 方法 构造函数等等.上面那样的代码name=&jack&这样的代码我们称之为“执行代码”,意思就是说这些代码只有在被执行的时候才会有效果.而你试想一下,那么这些代码什么时候被执行呢? 创建类的对象的时候? 那还用得着构造函数吗? 经常看到一些初学者在类的下面直接写这样代码.
& & 但是又有人会说了.诶, 那么为什么在声明类的字段的时候可以赋值呢?赋值表达式也是1个执行代码啊?为什么这样就不报错呢?给你看看下面的代码 你就会知道其中的真相了.
& & &当我们使用C#编译器将这段代码编译为程序集的时候,看看微软为我们生成的代码吧.
& & &展开构造函数,看看这里面有什么蹊跷吧!
& & &是的,C#编译器在编译的时候,如果我们声明字段的时候为字段赋值,那么为字段赋值的代码C#编译器在编译的时候会将赋值的代码放到构造函数中去,其实严格意义上来说,类的字段也是不能有初始值的.只不过微软在背后帮我们做了点事情,我们不知道而已.
& & &所以,不管在类和结构中,执行代码一定要写在方法中.不能直接写在结构或者类的下面.因为当执行代码写在方法中了,那么这些执行代码的执行时机才可以确定,就是这个方法被调用的时候了.
& & 从上面的内容,我们可以看出.其实从本质上来说,类和结构的字段都是不能有初始值的.只不过微软在语法上允许我们在定义类的字段的时候为其赋值.但是背后微软其实是把赋值的执行代码放到构造函数中去执行的. 而结构体微软却不帮我们这样做.至于这其中是什么原因.查了些资料,也看了园子里其他博友的文章,感觉都不能说服我,但是自己也想不出1个确切的理由微软为什么要这样做.那就先放着吧,希望参透其中原理的童鞋能指点.
& & b. 关于构造函数.
& & 首先,关于隐式构造函数.我们知道,在1个类中如果我们没有为类写任意的构造函数,那么C#编译器在编译的时候会自动的为这个类生成1个无参数的构造函数.我们将这个构造函数称之为隐式构造函数 但是一旦我们为这个类写了任意的1个构造函数的时候,这个隐式的构造函数就不会自动生成了.
& & 在结构中,就不是这样了,在结构中隐式的构造函数无论如何都存在.看看代码吧.
& & 在下面的代码中 我们为结构体写了1个带参数的构造函数.如下.
& & 我们使用new关键字来创建结构体对象,我们发现调用构造函数的时候,提示是有两个构造函数的.多了1个无参数的构造函数.
& &那么 我们再想,能不能手动的写1个无参数的构造函数呢?我们怀着无比激动的心情,试一下.
& 结果是华丽丽的报错了.所以我们得出结论. 隐式的无参数的构造函数在结构中无论如何都是存在的,所以程序员不能手动的为结构添加1个无参数的构造函数.
& 关于构造函数当然还不仅仅如此.我们知道在类的构造函数中我们可以写一些任意的代码(前提是符合C#语法啦),在结构体的构造函数中虽然也可以写任意的代码.但是C#语法规定在结构体的构造函数中,必须要为结构体的所有字段赋值.看看下面的代码吧.
& &啊哦.....报错了.....
& &我们也知道,在结构中还可以定义属性,所以有童鞋就这样写啦.看下面代码.
& &这个错误,仍然提示我们在构造函数中没有为所有的字段赋值,这是很多童鞋遇到的问题,诶,不是要在构造函数中为所有的字段赋值么?我现在赋值了啊。为什么还是提示没有赋值呢? 我们在构造函数中为属性赋值 而属性又为字段赋值,为什么这样就不行呢? 原因很简单.因为语法要求我们为所有的字段赋值,虽然这里我们看得出来为属性赋值其实属性再把值赋值给字段, 我们说属性是对字段的操作,但是一定是这样的吗?我们完全可以在属性的set块里面什么都不写,如果什么都不写,那么属性还是在操作字段吗? 所以属性不一定是在操作字段的,在结构体的构造函数中我们为属性赋值,不认为是在对字段赋值,所以我们在构造函数中要直接为字段赋值.
& c.创建结构体对象的方式.
& &创建结构体对象可以不使用new关键字.直接声明1个变量就可以.但是这样的话,结构体对象中的字段是没有初始值的,所以在使用字段之前必须要为这个字段赋值.
& &原因很简单.因为声明的时候就不能给初始值,虽然构造函数中为对象的字段赋值,但是此种方式创建结构体对象,没有调用构造函数,所以必须要程序员在使用之前手动赋值。下面这样就可以了.
& 另外1种创建结构体对象的方式和类一样,使用new关键字来创建,与不使用new关键字创建不同的是,通过使用new关键字创建结构体对象后,这个结构体对象的字段就已经有值了.原因不难理解,new关键字调用了构造函数,而结构体构造函数要求必须要为所有的字段赋值.
& 所以,我们不难猜出.结构体的无参数的构造函数做了什么事情,在无参数的构造函数中为所有的字段赋值,值类型的字段赋值0,给引用类型的字段赋值null.
& d. 结构体不能从另外1个结构或者类继承,但是可以实现接口.特殊的是.虽然结构不能从别的类或者结构继承,但是所有的结构都默认从ValueType类继承,ValueType类再从Object类继承.所以结构体对象仍然拥有超类Object的成员.看看下面的微软生成的代码就知道了.
3. 它们之间最大的区别 是结构体是值类型 类是引用类型.
& &结构体是值类型,当其作为1个局部变量的时候,变量是存储在栈空间中的,其对象的字段直接存储在这个变量中的.就像下面这样.
& &与引用类型的类不一样,引用类型的变量中存储的是对象在堆空间中的地址,所以当我们传递1个引用类型的变量的时候,其实传递的是变量的值(对象的地址) 传递完以后 对变量的修改会影响到另外1个变量指向的对象的值.
4. 最后 谈一下什么时候使用结构,什么使用类.
& &我们知道,结构存储在栈中,而栈有1个特点,就是空间较小,但是访问速度较快,堆空间较大,但是访问速度相对较慢.所以当我们描述1个轻量级对象的时候,可以将其定义为结构来提高效率.比如点,矩形,颜色,这些对象是轻量级的对象,因为描述他们,只需要少量的字段。当描述1个重量级对象的时候,我们知道类的对象是存储在堆空间中的,我们就将重量级对象定义为类. 他们都表示可以包含数据成员和函数成员的数据结构。与类不同的是,结构是值类型并且不需要堆分配。结构类型的变量直接包含结构的数据,而类类型的变量包含对数据的引用(该变量称为对象)。 struct 类型适合表示如点、矩形和颜色这样的轻量对象。尽管可能将一个点表示为类,但结构在某些方案中更有效。在一些情况下,结构的成本较低。例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。所以结构适合表示1个轻量级对象.
& &基于另外1个理由我也会使用结构. 我们在变量传值的时候,我就是希望传递对象的拷贝,而不是对象的引用地址,那么这个时候也可以使用结构了.
& 以上只是个人总结,难免会有些地方有瑕疵,欢迎大家指正,谢谢.!
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2773592次
积分:39124
积分:39124
排名:第35名
原创:390篇
转载:4678篇
译文:22篇
评论:1280条
文章:21篇
阅读:28161
文章:15篇
阅读:20160
文章:22篇
阅读:164297
(16)(47)(1)(1)(8)(170)(814)(1012)(1351)(969)(262)(207)(2)(3)(2)(61)(19)(2)(28)(22)(37)(1)(3)(4)(6)(9)(10)(26)

我要回帖

更多关于 老庄结构怎么样 的文章

 

随机推荐