书上说,装箱是把值类型转换成引用类型,那大家看下面的代码。
int a = 10;
object o = a;
Console.WriteLine (o.ToString());
object o1 = o;
o1 = 15;
Console.WriteLine (o1.ToString());
Console.WriteLine (o.ToString());
其执行结果是:
10
15
10
这说明object也是通过值来进行传递的,如果是引用类型的话o最后的结果也应该和o1的值一样都是15,请问这是怎么回事啊?我试过class就可以都改变掉。但我想不通的是,class也是继承object的,请具体解释一下。谢谢!
int a = 10;
object o = a;
Console.WriteLine (o.ToString());
object o1 = o;
o1 = 15;
Console.WriteLine (o1.ToString());
Console.WriteLine (o.ToString());
其执行结果是:
10
15
10
这说明object也是通过值来进行传递的,如果是引用类型的话o最后的结果也应该和o1的值一样都是15,请问这是怎么回事啊?我试过class就可以都改变掉。但我想不通的是,class也是继承object的,请具体解释一下。谢谢!
解决方案 »
- 我手里有一张图,想点图片调出信息。
- 在aspx页面里,想使用<%Response.Write()%>添加一个按钮,但是看不到
- this.gridView1.PostEditor();
- 打开一个窗体前,如何判断已经打开过一个实例了呢?如果打开就不再打开了?
- 本人研究“填充 Web 服务的报表的下拉列表”,发现msdn也是错误百出???
- 服务器端Socket和Remoting可以同时使用同一端口吗?
- 关于水晶报表的问题
- dataSet.Tables[0].DefaultView.Count 和dataSet.Tables[0].Rows.Count 为什么会不同?
- 怎样动态更改水晶报表中的字段?
- 关于X509Certificate2路径错误
- C#中的下载链接的问题
- VS2005的问题
什麽叫class繼承object不懂你哦。
實話說這段代碼根本就沒演示出來裝箱和拆箱。建議看。net框架一書。
class Myclass
{
}
和
class Myclass :object
{
}
不是一样么?
上面不就是把一个整数包装成object类型么?为什么传的时候还是值传递?我就是看书看不懂才问的呀!晕!
o -> a
第二阶段
o1->o o->a第三阶段
o1->15 o->a
o1=15使o1指向了另一片内存区,但o并没有改变。
object 是所有类型的基类型,其实无论是引用类型或是值类型,都继承于object类型。
如果你把object o = a; 中的object 换为其他自定义类型,一定会出错的
// Creates a new instance of an Object.
public Object()
{
}
所以你创建的object对象每次都是一个新的引用
而
object j=12;
实际上等于
int k=12;
j=12;
还是要发生一次装箱 .locals init ([0] object j)
IL_0000: ldc.i4.s 12
IL_0002: box [mscorlib]System.Int32
IL_0007: stloc.0所以才会有你上面的现象
int char double float struct 为简单类型
第一个和第二个结果应该容易理解
注意,代码中o1 = 15相当于
object o2 = 15; //生成了一个新的对象(有装箱)
o1 = o2; //把新对象的引用赋给o1
所以最后o没有变。
class Entry
{
static void Main(string[] args)
{
Temp a =new Temp();
a.m_a = 100;
Temp b = a;
b.m_a = 1000;
Console.WriteLine(a.m_a.ToString());
}
}
class Temp
{
public int m_a;
}结果是1000,说明a,b指向同一个对象!
object o = a;//装箱
Console.WriteLine (o.ToString());
object o1 = o;//引用传递,其实到这一步都没错。
o1 = 15;//错在这里!这里有装箱!
Console.WriteLine (o1.ToString());
Console.WriteLine (o.ToString()); o1 = 15;实际上和下面的代码是一样的
int b = 15;
o1 = b;明白了吗,o = a = 10,o1 = b = 15。
如果你要测试值类型的装箱,你需要自己写一个可以修改成员变量的值类型出来:
struct StructA
{
public StructA( int i )
{ this.i = i; }
public int i;
}