c#中结构体和类的区别
有人说一个是值类一个是引用类型
两者都可以使值类型和引用类型吧
就像类加上static和不加就是传址和传值啊
我初学 见笑,请解答 谢谢!
晕 下面的兄弟,不好意思哈我看错了 不是这个提问 这是我之前不小心发出来的提问,以为在另一个提问中呢,你回答得很好 不过我用汇编是出于做单片机需要 呵呵 你想多了 展开
首选结构体是一个值类型,而类是一个引用类型。
从你的后几句的补充上来说,你还没有型清楚什么是引用类型,什么是值类型。字与传值引用,传址引用是两码事,不要弄一块了!
所以的值类型与引用类型上,我这样给你说一下,看你是否能明白。
值类型的内存单元里是值,而引用类型单元里边是地址,地址指向了值。
比如int是值类型,int s =5;
s这个内存单元中就是5,不是地址指针。
而类则是一种引用类型!类中的并不是实际的值,而是一些指针指向了真正的值。
所以值类型就是反映的直接的数据。如:
struct M(int,int)
这个结构就是直接的值类型,它在内存中的表现是,除了结果体说明,就占两个int空间,用第一个空间里的数做第一个数值,第二个空间的数就是第一个数值。这就是结构体,也就是值类型。
值类型与引用类型说是类型。
传值引用,与址引用说的是引用方式。我给你的参数是一个值,你就按这个类计算去。如果我给的是地址,你计算时直接用的是地址。
在C#中没有传址,而是直接使用的ref参数与out参数将对象直接传入的。
传址引用与传值引用是两种不同的引用方式,与类型没有半毛钱的关系。
static是静态,实际上是开辟数据公用区,也就是说,如果你见到static,那么所有的都会引用同一地址的数据。而这个数据就是所谓的数据公共区。它和引用方式也没有半毛钱的关系。
几个概念混着来,新手新的太实在了!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
首先一点,我不知道你从何处得来的信息,一个类加上static就是传址,不加就是传值,在C#中没有这样概念。
其次一点,我认为我所说的例子只是能让你暂时理解,但例子并不是真正的贴切。
第三,如果你真能理解,那么你以上的全部问题不是问题!说我没有回答问题,这话说得。。。。
第四,正如五楼所说,值类型是在栈中,而引用类型是堆中,但类的值是在堆栈中,也就是类的值未必全部都是堆中。
如果真的再去给你解释堆栈你未必会懂,你还以为是汇编中的栈啊?问题是汇编中有堆这个概念吗?而且对于堆和栈只是一种结构,是.net运行的基础,并不属于C#。我可以告诉你,两者概念是相同的,但使用方式与所存的内容全部两码事。
第五,如果你真的认为我没有回答问题,你可以只当我发广告,但以后绝不会借你的地儿发广告。
最后,其实个人认为你完全没有必要了解他们在内存中是如何存储的。只有在使用或是做一些IL时才会对这些东西弄的很清楚。而IL却是一种中间语言,学其中一门的C#完全没有必要懂的。不是懂汇编么——那么就是牛人了,IL也算是一种汇编,自己去看看吧!
晕,对不起 是我的错,这是我之前的问题,你回答时我已经查清楚了,只是不知道这问题 不小心被我放出来了,一看答案没看题目还以为在我另一个提问中,所以感觉你回答的不对口。。我看错了额。还以为你是回答的我另一个问题。你回答的不错不好意思哈 是我看错了
结构就是值类型的,除非装箱,否则无法变成引用对象,类只能是引用类型的
static不static并不影响引用还是值类型传值,那个是由ref和out控制的(VB.NET里是ByRef或ByVal控制)
static只是标注方法是静态的而已(具体一点就是他变成函数了,没有第一个参数this)
值类型和引用类型的区分由CLR在执行过程中不同的行为而定的,值类型会在方法执行堆栈上存储(如果是类成员,当然也会在堆里面),而引用类型是一种自维护的高级指针,对象的数据实际上是存在于堆中的,和C++中的指针概念类似但又不同。
这个要说起来就真的写不完了,你最好找本专业的书看看,里面有详细讲解区别。
简单给你说一下使用规范,如果一个类型1.你认为他是不变的(就是new出来以后属性值不会随意修改)2.占用空间不是很大,四个字段左右 3.不需要面向对象的多态和继承 4.表示简单的组合值
符合上面几点你都可以把它作为结构声明,结构在传值和初始化有性能优势,但是其他情况下请用类。如果你不知道自己该用结构还是类,请用类。
具体的设计规范你可以参考.net本身的设计,比如DateTime,TimeSpan,Point,Size都是结构,符合我上面所说的几个特性。结构的实现需要注意很多地方,一句两句说不完的。
vfgf
1
一.类与结构的示例比较:
结构示例:
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. 大多数情况下该类型只是一些数据时,结构时最佳的选择
类:引用类型.
而且 ,这些也不是几句话就能说清楚的,需要举例子,你认真看这本书就行了~~~
这本书是讲解.NET基础的,最详细也最底层的书籍