static void Main(string[] args)
{
object i = 10;
Change(i);
Console.WriteLine(i);
Console.Read();
}
static void Change(object i)
{
i = (object)(100);
}
代码大致就是这样的,为什么输出的i依然是 10 呢?请高人指点一下,谢谢!!
{
object i = 10;
Change(i);
Console.WriteLine(i);
Console.Read();
}
static void Change(object i)
{
i = (object)(100);
}
代码大致就是这样的,为什么输出的i依然是 10 呢?请高人指点一下,谢谢!!
{
i = 100;
}int i = 10;
getxx(ref i);
Console.WriteLine(i);//print>>>100public static void getxx(int i)
{
i = 100;
}int i = 10;
getxx(i);
Console.WriteLine(i);//print>>>10
{
object i = 10;
Change(ref i);
Console.WriteLine(i);
Console.Read();
}
static void Change(ref object i)
{
i = (object)(100);
}
Change(i);
Console.WriteLine(i);
Console.Read(); static void Change(out object i)
{
i = (object)(100);
}
使用地址传递
Console.WriteLine(i.GetType());//确实显示i是System.Int32类型(值类型)
object i = new datatable();
Console.WriteLine(i.GetType());//显示i是System.data.datatable类型(引用类型)
因此可以说,由于值类型和引用类型都继承自object,因此用object实例化对象时,编译器会根据赋值的具体情况来确定究竟是值类型还是引用类型。
所以,值类型和引用类型都继承自object,不能说object是引用类型哦
java传参数,都是值传递,引用类型传递的对堆中值的引用,即地址。
而Object i = 0 ; 没有在堆分配内存,它传递的是值得副本。
{
object i = 10;
Change(i);
Console.WriteLine(i);
Console.Read();
}
static void Change(object i)
{
i = (object)(100); //关键在这一步,这样写就是重写创建一个对象赋值给此方法中的i,这是i就不在只想原来的的i了,相当于从新new 了个对象,所以结果还是10
}
{
object i = 10;
Change(i);
Console.WriteLine(i);
Console.Read();
}
static void Change(object i)
{
Console.Write(i.GetHashCode());
i = (Object)100;
Console.Write(i.GetHashCode());
}
结果 10 100 10
http://blog.csdn.com/csdbfans
static void Main(string[] args)
{
object i = 10; //1.i是引用类型变量,引用(i)和值(10)都在栈上
Change(i); //2.传递i(即10的地址)
Console.WriteLine(i); //5.显示Main中i的值,即10
Console.Read();
}
static void Change(object i) //3.此处i也是引用类型,接收传递过来的数据(即10的地址,此时Change的i与Main的i这两个引用都指向栈上的同一个数据:10)
{
i = (Object)100; // 4.等号右边装箱了一个引用类型,并通过等号赋值给了Change的i,即此时Change的i不再指向10,而是100了。但树上操作不会影响Main的i
}
之所以i是值类型,因为他的引用指向了一个值类型。
Change(i); //由于change参数是object,而i是object的子类,所以是兼容类型传入的,虽然可以执行代码,但是i依然是值类型
}
static void Change(object i)//这里参数i是引用类型
{
i = (object)(100);
}