delegate int Add();
class Program
{
static void Main(string[] args)
{
MyClass myclass=new MyClass ();
Add add = myclass.add1;
int result1 = add();//此处添加用以个result1来接收调用委托的返回值
add += myclass.add2;
add += myclass.add1;
Console.WriteLine("最后value的值:{0}", myclass.value);//为什么加了result1后value的值就会改变呢?而不加result1时Value值就不会改变,我觉得value是值类型加不加都不应该改变啊
Console.WriteLine("第一次返回的值:{0}", result1);
Console.WriteLine("最后的结果:{0}", add());
Console.ReadKey();
}
}
class MyClass
{
public int value = 5;
public int add2()
{
value += 3;
return value;
}
public int add1()
{
value += 2;
return value;
}
}
不明白为什么加了result1后value的值就会改变呢?而不加result1时Value值就不会改变,我觉得value是值类型加不加都不应该改变啊 ,请求高手指点一二
= =才疏学浅,真没看出来哪儿和传参有关系了。MyClass的Add1、2两个方法都直接操作了成员value,这里把委托理解成函数指针类似的东西思考,Add()就是myclass.Add1(),value当然要变了。
虽然是值类型,但是是在类里面,就是放在堆栈里面,是会保存结果的
是啊,是放在栈里面的,为什么会改变原数值呢?不是只有引用的才会改变嘛?
@ajie1166: 是堆栈区,是不是你说的那个栈里面。堆栈里面存的是对象的地方
int result1 = add();
关键在这个add(),这个是委托的调用,在这里这行代码就相当于:
int result = myclass.add1();
执行了add1方法,value的值就会相应的改变了
你把这行代码 Console.WriteLine("最后value的值:{0}", myclass.value); 加到console.readkey() 的上一句看就知道了
确实是改变了,可是为什么会改变我的原数值呢?
@ajie1166: 举个例子吧
int value = 1;
static void main()
{
int value = 1;
int result = Add(value); // 此时value:1,result:2,在进入Add方法是值类型变量会有一个拷贝,方法中所进行的所有操作都是对这个拷贝值进行操作的所以值类型不会改变;而引用类型时通过指针来进行操作数据的
}
static int Add(int value)
{
value++;
return value;
}
这个是你理解的值类型的值不会改变,你看能和你举的例子对应吗?
明显不能!
你上面调用的add1()、add2()都是在操作MyClass实例中value字段的值,你要显示的数据也是myclass种value字段的值
@fchzzwcsr201: 谢谢,我现在明白了,我把值类型和值传递混了
现在一看原来这个问题,真不知道自己在胡说什么呢,唉...