c#中结构体和类的区别

2024-11-08 06:02:00
推荐回答(5个)
回答1:

看到你问的问题就知道你是初学者。
首选结构体是一个值类型,而类是一个引用类型。
从你的后几句的补充上来说,你还没有型清楚什么是引用类型,什么是值类型。字与传值引用,传址引用是两码事,不要弄一块了!

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

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

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

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

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

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

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

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

最后,其实个人认为你完全没有必要了解他们在内存中是如何存储的。只有在使用或是做一些IL时才会对这些东西弄的很清楚。而IL却是一种中间语言,学其中一门的C#完全没有必要懂的。不是懂汇编么——那么就是牛人了,IL也算是一种汇编,自己去看看吧!

回答2:

你C++看多了,看得出你是C#初学者,两者里面的概念完全不一样的,你不要拿之前学的东西来套
结构就是值类型的,除非装箱,否则无法变成引用对象,类只能是引用类型的
static不static并不影响引用还是值类型传值,那个是由ref和out控制的(VB.NET里是ByRef或ByVal控制)
static只是标注方法是静态的而已(具体一点就是他变成函数了,没有第一个参数this)

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

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

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

具体的设计规范你可以参考.net本身的设计,比如DateTime,TimeSpan,Point,Size都是结构,符合我上面所说的几个特性。结构的实现需要注意很多地方,一句两句说不完的。

回答3:

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

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. 大多数情况下该类型只是一些数据时,结构时最佳的选择

回答4:

结构体:值类型, 不能定义无参数的构造函数, 可不需要 new 初始化;
类:引用类型.

回答5:

强烈建议LZ看看《你必须知道的.NET(第二版)》 第8章,对你一个初学者来说,最合适不过~~
而且 ,这些也不是几句话就能说清楚的,需要举例子,你认真看这本书就行了~~~
这本书是讲解.NET基础的,最详细也最底层的书籍