问题描述
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication3{publicclassTest{publicvoidMyTest(objectobj){obj=1;objectobj2=MyTest2(obj);Console.WriteLine(obj.ToString());Console.WriteLine(obj2.ToString());}publicobjectMyTest2(objectobj){obj=2;returnobj;}}classProgram{staticvoidMain(string[]args){Testtest=newTest();objectobj=null;test.MyTest(obj);Console.ReadLine();}}}我原来以为object是引用类型,但结果是12有点不理解,懂的请解释一下.
解决方案
解决方案二:
一点问题都没有,你认为哪里不合理?
解决方案三:
结果就是1,2啊任何类型都可以转换成object类型,包括简单类型
解决方案四:
我曾经也蛋疼过..publicvoidMyTest(objectobj){obj=1;objectobj2=MyTest2(obj);Console.WriteLine(obj.ToString());Console.WriteLine(obj2.ToString());}publicobjectMyTest2(objectobj){obj=2;returnobj;}
obj=2;这步其实是obj=newObject(2);//虽然不能这样写,但意义就是这样..它会在堆上新建1片地方保存2这个值..obj存的是这个实例的引用..你仔细想象也明白啊..publicclasstest{publicstringname{get;set;}}testt1=newtest(){name="123"};testt2=t1;t2.name="456";这时2个的name都一样..而你是obj=2;你自己体会下吧
解决方案五:
的确是引用类型,obj2=MyTest(obj1)这里返回2,所以输出2是没问题的知道你的疑问在于obj1为什么还是1?publicobjectMyTest2(objectobj){obj=2;returnobj;}上面这个方法,改变了局部变量的值,但传进来的参数,实质只是obj1的一个引用复本,obj=2;只是对这个引用复本重新赋值了,而obj1本身变不会有任何变化(无论是引用类型还是值类型)
解决方案六:
引用3楼lyj224170707的回复:
我曾经也蛋疼过..这步其实是obj=newObject(2);//虽然不能这样写,但意义就是这样..它会在堆上新建1片地方保存2这个值..obj存的是这个实例的引用..你仔细想象也明白啊..publicclasstest{publicstringname{get;set;}}testt1=newtest(){name="123"};testt2=t1;t2.name="456";这时2个的name都一样..而你是obj=2;你自己体会下吧
不是在赋值时新建,而是objectobj2=MyTest2(obj)调用的时候,传入的obj就只是obj1的一个引用复本为了描述方便,MyTest1中的obj当作obj1obj和obj1引用的都是1(装箱了),在MyTest2内部,那个局部变量obj就跟obj1没有一点关系了
解决方案七:
当然是信用类型,没啥好说的
解决方案八:
object是引用类型,但是int不是,object接收int发生装箱,反之发生拆箱。引用的是那个箱,倒腾一遍,int还是int。明白了么?
解决方案九:
3楼的说法很到位我只补充一句:string也是引用类型,object跟string的实现是差不多的,明白了么?
解决方案十:
这个跟数组不同如果定义int[]a=newint[4];那么在函数里修改a[0]的时候,改的是被引用的值,而不是a本身的指向而string和object在重新赋值的时候,指向也变了
解决方案十一:
数据类型之引用类型的使用//所谓引用类型=类类型=接口类型=数组类型=委托类型//引用类型的使用classProgram{classC//创建一个类C{publicintValue;//声明一个公共int类型的变量Value}staticvoidMain(string[]args){intv1=0;//声明一个int类型的变量v1,并初始化为0intv2=v1;//声明一个int类型的变量v2,并将v1赋值给v2v2=927;//重新将变量v2赋值为927Cr1=newC();//使用new关键字创建引用对象Cr2=r1;//使r1等于r2r2.Value=112;//设置变量r2的Value值Console.WriteLine("Values:{0},{1}",v1,v2);//输出变量v1和v2Console.WriteLine("Refs:{0},{1}",r1.Value,r2.Value);//输出引用类型对象的Value值Console.ReadLine();}}
解决方案十二:
解决方案十三:
这是一个对象啊