ojbect是引用类型? 结果就是1,2 啊任何类型都可以转换成object类型,包括简单类型 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我曾经也蛋疼过.. public void MyTest( object obj) { obj = 1; object obj2= MyTest2(obj); Console.WriteLine(obj.ToString()); Console.WriteLine(obj2.ToString()); } public object MyTest2(object obj) { obj=2; return obj; }obj=2; 这步其实是obj=new Object(2);//虽然不能这样写,但意义就是这样..它会在堆上新建1片地方保存2这个值..obj存的是这个实例的引用..你仔细想象也明白啊..public class test{public string name{get;set;}}test t1=new test(){name="123"};test t2=t1;t2.name="456";这时2个的name都一样..而你是obj=2;你自己体会下吧 的确是引用类型,obj2=MyTest(obj1) 这里返回2,所以输出2是没问题的知道你的疑问在于obj1为什么还是1?public object MyTest2(object obj) { obj=2; return obj; }上面这个方法,改变了局部变量的值,但传进来的参数,实质只是obj1的一个引用复本,obj=2; 只是对这个引用复本重新赋值了,而obj1本身变不会有任何变化(无论是引用类型还是值类型) 不是在赋值时新建,而是object obj2= MyTest2(obj)调用的时候,传入的obj就只是obj1的一个引用复本为了描述方便,MyTest1中的obj当作obj1obj和obj1引用的都是1(装箱了),在MyTest2内部,那个局部变量obj就跟obj1没有一点关系了 object是引用类型,但是int不是,object接收int发生装箱,反之发生拆箱。引用的是那个箱,倒腾一遍,int还是int。明白了么? 3楼的说法很到位我只补充一句:string也是引用类型,object跟string的实现是差不多的,明白了么? 这个跟数组不同如果定义int[ ] a=new int[4];那么在函数里修改a[0]的时候,改的是被引用的值,而不是a本身的指向而string和object在重新赋值的时候,指向也变了 数据类型之引用类型的使用//所谓引用类型=类类型=接口类型=数组类型=委托类型//引用类型的使用class Program { class C //创建一个类C { public int Value; //声明一个公共int类型的变量Value } static void Main(string[] args) { int v1 = 0; //声明一个int类型的变量v1,并初始化为0 int v2 = v1; //声明一个int类型的变量v2,并将v1赋值给v2 v2 = 927; //重新将变量v2赋值为927 C r1 = new C(); //使用new关键字创建引用对象 C r2 = r1; //使r1等于r2 r2.Value = 112; //设置变量r2的Value值 Console.WriteLine("Values:{0},{1}", v1, v2); //输出变量v1和v2 Console.WriteLine("Refs:{0},{1}", r1.Value, r2.Value); //输出引用类型对象的Value值 Console.ReadLine(); } } 正则表达式 在线等 求助 c#运行cmd,知道的告诉下! treeview 设置节点不可见 关于ProgressBar的问题 条件问题 SendKeys.Send("^c");的一个问题 对象占用内存的问题 无法在发送 HTTP 标头之后进行重定向。 获得存储过程中的Return值 小问题,请高手不吝赐教! 怎么在父类中调用已经被子类重载的原先的方法,内详 出于安全原因,此 XML 文档中禁止了 DTD???
{
obj = 1;
object obj2= MyTest2(obj);
Console.WriteLine(obj.ToString());
Console.WriteLine(obj2.ToString()); }
public object MyTest2(object obj)
{
obj=2;
return obj;
}obj=2; 这步其实是obj=new Object(2);//虽然不能这样写,但意义就是这样..它会在堆上新建1片地方保存2这个值..obj存的是这个实例的引用..你仔细想象也明白啊..public class test{
public string name{get;set;}
}test t1=new test(){name="123"};
test t2=t1;
t2.name="456";这时2个的name都一样..而你是obj=2;你自己体会下吧
知道你的疑问在于obj1为什么还是1?
public object MyTest2(object obj)
{
obj=2;
return obj;
}上面这个方法,改变了局部变量的值,但传进来的参数,实质只是obj1的一个引用复本,obj=2; 只是对这个引用复本重新赋值了,而obj1本身变不会有任何变化(无论是引用类型还是值类型)
不是在赋值时新建,而是object obj2= MyTest2(obj)调用的时候,传入的obj就只是obj1的一个引用复本
为了描述方便,MyTest1中的obj当作obj1
obj和obj1引用的都是1(装箱了),在MyTest2内部,那个局部变量obj就跟obj1没有一点关系了
我只补充一句:
string也是引用类型,object跟string的实现是差不多的,明白了么?
如果定义
int[ ] a=new int[4];
那么在函数里修改a[0]的时候,改的是被引用的值,而不是a本身的指向而string和object在重新赋值的时候,指向也变了
//所谓引用类型=类类型=接口类型=数组类型=委托类型
//引用类型的使用
class Program
{
class C //创建一个类C
{
public int Value; //声明一个公共int类型的变量Value
}
static void Main(string[] args)
{
int v1 = 0; //声明一个int类型的变量v1,并初始化为0
int v2 = v1; //声明一个int类型的变量v2,并将v1赋值给v2
v2 = 927; //重新将变量v2赋值为927
C r1 = new C(); //使用new关键字创建引用对象
C r2 = r1; //使r1等于r2
r2.Value = 112; //设置变量r2的Value值
Console.WriteLine("Values:{0},{1}", v1, v2); //输出变量v1和v2
Console.WriteLine("Refs:{0},{1}", r1.Value, r2.Value); //输出引用类型对象的Value值
Console.ReadLine();
}
}