c#中结构体和类的区别

貌似除了一些语法上有区别意外么有别的多大区别啊,实际用的时候有什么必要的情况会选择使用结构体或者类呢?有人说一个是值类一个是引用类型两者都可以使值类型和引用类型吧就像类加... 貌似除了一些语法上有区别意外么有别的多大区别啊,实际用的时候有什么必要的情况会选择使用结构体或者类呢?
有人说一个是值类一个是引用类型
两者都可以使值类型和引用类型吧
就像类加上static和不加就是传址和传值啊
我初学 见笑,请解答 谢谢!
晕 下面的兄弟,不好意思哈我看错了 不是这个提问 这是我之前不小心发出来的提问,以为在另一个提问中呢,你回答得很好 不过我用汇编是出于做单片机需要 呵呵 你想多了
展开
 我来答
百度网友66a8d48e5
2012-04-27 · TA获得超过7687个赞
知道大有可为答主
回答量:3002
采纳率:12%
帮助的人:3899万
展开全部
看到你问的问题就知道你是初学者。
首选结构体是一个值类型,而类是一个引用类型。
从你的后几句的补充上来说,你还没有型清楚什么是引用类型,什么是值类型。字与传值引用,传址引用是两码事,不要弄一块了!

所以的值类型与引用类型上,我这样给你说一下,看你是否能明白。
值类型的内存单元里是值,而引用类型单元里边是地址,地址指向了值。

比如int是值类型,int s =5;
s这个内存单元中就是5,不是地址指针。
而类则是一种引用类型!类中的并不是实际的值,而是一些指针指向了真正的值。
所以值类型就是反映的直接的数据。如:
struct M(int,int)
这个结构就是直接的值类型,它在内存中的表现是,除了结果体说明,就占两个int空间,用第一个空间里的数做第一个数值,第二个空间的数就是第一个数值。这就是结构体,也就是值类型。

值类型与引用类型说是类型。

传值引用,与址引用说的是引用方式。我给你的参数是一个值,你就按这个类计算去。如果我给的是地址,你计算时直接用的是地址。

在C#中没有传址,而是直接使用的ref参数与out参数将对象直接传入的。

传址引用与传值引用是两种不同的引用方式,与类型没有半毛钱的关系。

static是静态,实际上是开辟数据公用区,也就是说,如果你见到static,那么所有的都会引用同一地址的数据。而这个数据就是所谓的数据公共区。它和引用方式也没有半毛钱的关系。

几个概念混着来,新手新的太实在了!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
首先一点,我不知道你从何处得来的信息,一个类加上static就是传址,不加就是传值,在C#中没有这样概念。
其次一点,我认为我所说的例子只是能让你暂时理解,但例子并不是真正的贴切。
第三,如果你真能理解,那么你以上的全部问题不是问题!说我没有回答问题,这话说得。。。。
第四,正如五楼所说,值类型是在栈中,而引用类型是堆中,但类的值是在堆栈中,也就是类的值未必全部都是堆中。
如果真的再去给你解释堆栈你未必会懂,你还以为是汇编中的栈啊?问题是汇编中有堆这个概念吗?而且对于堆和栈只是一种结构,是.net运行的基础,并不属于C#。我可以告诉你,两者概念是相同的,但使用方式与所存的内容全部两码事。
第五,如果你真的认为我没有回答问题,你可以只当我发广告,但以后绝不会借你的地儿发广告。

最后,其实个人认为你完全没有必要了解他们在内存中是如何存储的。只有在使用或是做一些IL时才会对这些东西弄的很清楚。而IL却是一种中间语言,学其中一门的C#完全没有必要懂的。不是懂汇编么——那么就是牛人了,IL也算是一种汇编,自己去看看吧!
追问
晕,对不起 是我的错,这是我之前的问题,你回答时我已经查清楚了,只是不知道这问题 不小心被我放出来了,一看答案没看题目还以为在我另一个提问中,所以感觉你回答的不对口。。我看错了额。还以为你是回答的我另一个问题。你回答的不错不好意思哈 是我看错了
草薙在
2012-04-27 · TA获得超过4795个赞
知道大有可为答主
回答量:6187
采纳率:50%
帮助的人:6315万
展开全部
你C++看多了,看得出你是C#初学者,两者里面的概念完全不一样的,你不要拿之前学的东西来套
结构就是值类型的,除非装箱,否则无法变成引用对象,类只能是引用类型的
static不static并不影响引用还是值类型传值,那个是由ref和out控制的(VB.NET里是ByRef或ByVal控制)
static只是标注方法是静态的而已(具体一点就是他变成函数了,没有第一个参数this)

值类型和引用类型的区分由CLR在执行过程中不同的行为而定的,值类型会在方法执行堆栈上存储(如果是类成员,当然也会在堆里面),而引用类型是一种自维护的高级指针,对象的数据实际上是存在于堆中的,和C++中的指针概念类似但又不同。

这个要说起来就真的写不完了,你最好找本专业的书看看,里面有详细讲解区别。

简单给你说一下使用规范,如果一个类型1.你认为他是不变的(就是new出来以后属性值不会随意修改)2.占用空间不是很大,四个字段左右 3.不需要面向对象的多态和继承 4.表示简单的组合值
符合上面几点你都可以把它作为结构声明,结构在传值和初始化有性能优势,但是其他情况下请用类。如果你不知道自己该用结构还是类,请用类。

具体的设计规范你可以参考.net本身的设计,比如DateTime,TimeSpan,Point,Size都是结构,符合我上面所说的几个特性。结构的实现需要注意很多地方,一句两句说不完的。
更多追问追答
追问
vfgf
追答
1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xiangjuan314
推荐于2017-10-10 · TA获得超过3.3万个赞
知道大有可为答主
回答量:2.9万
采纳率:0%
帮助的人:2904万
展开全部

一.类与结构的示例比较: 
结构示例: 

public struct Person
{
string Name;
int height;
int weight
public bool overWeight()
{
//implement something
}
}
类示例:
public class TestTime
{
int hours;
int minutes;
int seconds;
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 结构,通过使用结构可以创建更多的值类型 
类是引用类型:引用类型在堆上分配地址 
堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 
注: 
1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 
2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用 
2.继承性 
结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed . 
类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承 
注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样 
例如:结构实现接口 

nterface IImage
{
void Paint();
}
struct Picture : IImage
{
public void Paint()
{
// painting code goes here
}
private int x, y, z; // other struct members
}

3.内部结构: 
结构: 
没有默认的构造函数,但是可以添加构造函数 
没有析构函数 
没有 abstract 和 sealed(因为不能继承) 
不能有protected 修饰符 
可以不使用new 初始化 
在结构中初始化实例字段是错误的 
类: 
有默认的构造函数 
有析构函数 
可以使用 abstract 和 sealed 
有protected 修饰符 
必须使用new 初始化
三.如何选择结构还是类 
讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类: 
1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些 
2. 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。 
3. 在表现抽象和多级别的对象层次时,类是最好的选择
4. 大多数情况下该类型只是一些数据时,结构时最佳的选择

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bambuz
2012-04-27 · TA获得超过168个赞
知道小有建树答主
回答量:329
采纳率:0%
帮助的人:316万
展开全部
结构体:值类型, 不能定义无参数的构造函数, 可不需要 new 初始化;
类:引用类型.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
不想起名字了2333
2012-04-27 · TA获得超过2447个赞
知道大有可为答主
回答量:1931
采纳率:50%
帮助的人:1858万
展开全部
强烈建议LZ看看《你必须知道的.NET(第二版)》 第8章,对你一个初学者来说,最合适不过~~
而且 ,这些也不是几句话就能说清楚的,需要举例子,你认真看这本书就行了~~~
这本书是讲解.NET基础的,最详细也最底层的书籍
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式