基础: 引用类型还是值类型?

lbsong 2004-03-17 04:07:45
从object继承的类是引用类型还是值类型?
...全文
51 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
smartcreater 2004-03-22
  • 打赏
  • 举报
回复
类型,对象,继承 干吗要纠缠在一起,

oop中,任何东西都可以看成对象,但谁也没说该对象一定是什么类型, 他们2者本来就没有
什么必然联系。对象是值类型还是reference类型是编译器自己定的。编译器不同,答案就不一定相同了。C#中规定的值类型(对象)就那么几种, 在ANSI c++中string 对象 是值类型,而c#中是reference类型。
lbsong 2004-03-22
  • 打赏
  • 举报
回复
sorry,大师的书听说的很久,但是一直没有买,主要是许多书买了都成了摆设了,而且MSDN看久了发现许多东东MSDN上都讲得很清楚.

现在总结一下上面的观点:
1。 int是object派生来的---MSDN上说了"所有类型(包括值类型)都是从 object 类型派生的"
2。 "其实,int并不是从object派生出来的"--http://www.royaloo.com/articles/articles_2002/csharpfaq.htm

我的观点:
我觉得所有的东西都是从object派生出来的,单纯的object是引用类型,而一些基元则被实现为值类型

看了大家的贴子后,我觉得从System.ValueType继承的都应该是值类型
但下面的东西又有些不明白了:

MSDN:
"类 Enum 是从类 ValueType 派生而来的,即 Enum 本身是引用类型,而不是值类型"

发财蛇 2004-03-18
  • 打赏
  • 举报
回复
我比较赞同walkinhill(reaway)的回答,对于是否引用类型和值类型的分配,是编译器做的事情。当编译器发现类型为ValueType,那么将提供分配栈的操作。
object是引用类型,我认为不太准确。
“引用类型和值类型都是从最终的基类 Object 派生出来的。当值类型需要充当对象时,就在堆上分配一个包装(该包装能使值类型看上去像引用对象一样),并且将该值类型的值复制给它。该包装被加上标记,以便系统知道它包含一个值类型。这个进程称为装箱,其反向进程称为取消装箱。装箱和取消装箱能够使任何类型像对象一样进行处理。
”MSDN的解释
BeginnerBBB 2004-03-18
  • 打赏
  • 举报
回复
路过,学习!
loverP 2004-03-18
  • 打赏
  • 举报
回复
.NET中的值类型都是派生自System.ValueType,而引用类型都是派生自System.Object。而System.ValueType也是派生自System.Object。因此,System.ValueType是引用类型而所有派生自System.ValueType的类型是值类型。用户不能自己从System.ValueType派生值类型,而是应当用struct声明结构。
marvelstack 2004-03-18
  • 打赏
  • 举报
回复
引用类型和值类型都是派生与object类的.
值类型
System.Object
System.ValueType
System.Int32
引用类型
System.Object
System.Console
不明白看大师的书
Microsoft .NET框架程序设计(修订版)
http://www.china-pub.com/computers/common/info.asp?id=13534
Demonia 2004-03-18
  • 打赏
  • 举报
回复
MArk
xj1122 2004-03-18
  • 打赏
  • 举报
回复
同意:

lbsong(欢乐英雄)
qqchen79 2004-03-18
  • 打赏
  • 举报
回复
lbsong(欢乐英雄)的解释应该是最准确的。
changqi 2004-03-17
  • 打赏
  • 举报
回复
学习!基础的东西不简单!
walkinhill 2004-03-17
  • 打赏
  • 举报
回复
最重要的是能够自己正确的区分那些是引用类型,那些是值类型。不能过于绝对化,比如说一般认为 结构是值类型,但是如果结构里面包含了引用类型,那么就是半值类型,半引用类型了。
walkinhill 2004-03-17
  • 打赏
  • 举报
回复
建议你看一下 Applied .NET Framework Programming,里面还是很详细的介绍了这个问题的。

回到你的问题,在 .NET 里面所有的类型最终都继承自 System.Object,但是编译器对一类类型做了特殊处理,那就是继承自 System.ValueType 的类型,所有继承自System.ValueType的类型都不是引用类型,比如说 Int32 等,但是应该注意的是 System.ValueType 是直接继承自 System.Object。
lbsong 2004-03-17
  • 打赏
  • 举报
回复
2.5 也就是说,int是值类型,object是引用类型。那么,int又怎么能从object派生出来呢?
其实,int并不是从object派生出来的。当一个int数被作为int数使用时,它就是一个值类型实例(保存在栈上)。但是,当它被作为object派生对象使用时,它就是一个引用类型实例,指向堆上的一个整数值。换句话说,当你把int值作为对象来对待时,运行时会自动地将int值转换成一个object引用。这个过程就被称为装箱(boxing)。这个转换的过程包括如下步骤:将int值的内容从栈拷贝到堆,然后创建一个object实例来指向它。解箱(unboxing)则是装箱的逆过程:将对象转换回栈上的值。
int x = 3; // new int value 3 on the stack
object objx = x; // new int on heap, set to value 3 - still have x=3 on stack
int y = (int)objx; // new value 3 on stack, still got x=3 on stack and objx=3 on heap

from http://www.royaloo.com/articles/articles_2002/csharpfaq.htm
发财蛇 2004-03-17
  • 打赏
  • 举报
回复
public class MyObject
{

}
编译的时候CLR会将它放在堆中,是引用类型
public struct MyObject
{

}
编译的时候CLR会将它放在堆栈中,是值类型
发财蛇 2004-03-17
  • 打赏
  • 举报
回复
to chili:
那就是说:object继承下来的类不一定是引用类型还是值类型了?

是这样的,object只是.net最基层的类型,你就是不声明继承object它也是object类型,也就是继承了object了,例如我声明了一个结构类型struct,那么它就是值类型
nichang2 2004-03-17
  • 打赏
  • 举报
回复
不错.int等值类型虽然最终也是从object继承的,但它们放在堆战中,所以是值类型。
但你自定义的类一定是引用类型。
lbsong 2004-03-17
  • 打赏
  • 举报
回复
using System;
public class MyObject
{
public string MyName;
public MyObject()
{
}
}

class Test
{
static void Main()
{
MyObject mo = new MyObject();
mo.MyName = "Bill Gates";

MyObject mo2 = mo;

System.Console.WriteLine(mo.MyName);
System.Console.WriteLine(mo2.MyName);

mo.MyName = "Not Bill";

System.Console.WriteLine(mo.MyName);
System.Console.WriteLine(mo2.MyName);

System.Console.ReadLine();
}
}
代码证明,从Object继承来的确实是应用类型,但int也是从object继承来的,但它却是值类型,如果没有更好的解释的话,只能认为是编译器作了手脚,不过总是觉得特别别扭
lbsong 2004-03-17
  • 打赏
  • 举报
回复
to tavor:
假设就是这样的一个类,能不能判断它是引用类型还是值类型?
public class MyObject
{

}
tavor 2004-03-17
  • 打赏
  • 举报
回复
应该还得看继承类的实现方式吧
lbsong 2004-03-17
  • 打赏
  • 举报
回复
to chili:
那就是说:object继承下来的类不一定是引用类型还是值类型了?
加载更多回复(7)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧