***************请问关于委托的问题******************
public class Stu{
public delegate void CreateStuObjectDelegate(Stu st);
public event CreateStuObjectDelegate CreateStuObjectHanlder;
public string Name;
public int StuNo;
public Stu CreateStu()
{
Stu st = null;
CreateStuObjectHanlder(st);
return st;
}
}
我定义了一个这样的类
上面申明了一个委托.我的目的是用委托绑定方法创建一个Stu对象.
因为对象是引用传递的.
protected void Page_Load(object sender, EventArgs e)
{
Stu st = new Stu();
st.CreateStuObjectHanlder += new Stu.CreateStuObjectDelegate(st_CreateStuObjectHanlder);
Stu st1 = st.CreateStu();
Response.Write(st1.Name);
}
void st_CreateStuObjectHanlder(Stu st)
{
st = new Stu();
st.Name = "zrw2001";
st.StuNo = 1001;
}
但是我在这样用的时候.st1是null
我这样改一下就可以得到实例化的对象了
public delegate void CreateStuObjectDelegate(ref Stu st);
难道委托是值传递的?
--------------------编程问答-------------------- 非常正常。
委托的參數並不是按值傳遞的,與普通函數傳參一樣,對象使用引用來傳遞.
public Stu CreateStu()
{
Stu st = null;
CreateStuObjectHanlder(st);
return st;
}
void st_CreateStuObjectHanlder(Stu st)
{
st = new Stu();
st.Name = "zrw2001";
st.StuNo = 1001;
}
上面的代易做图中
1:CreateStu方法中觸發CreateStuObjectHanlder之前,st是null,那么st是沒有分配內存地址的。
2:st_CreateStuObjectHanlder中得到的st是一個沒有分配地址的參數。然後執行了new Stu(),請注意,這時分配了一個內存地址,這個地址與傳參的地址已經不一樣了!!所以到Name和StuNo的賦值並不是傳進來的st的地址,也就是說傳參進來的st變量根本沒有發生任何變化,所有的賦值衹是針對new Stu()所產生的一個新的對象。
3:CreateStu方法中return st,這個st當然是null了。因為在st_CreateStuObjectHanlder中st並未發生任何變化。
--------------------编程问答-------------------- lZ 程序一个字"乱"
改一下就ok了.纯委托.
--------------------编程问答-------------------- lZ 程序一个字"乱"
protected void Page_Load(object sender, EventArgs e)
{
Stu st = new Stu();
Stu.CreateStuObjectDelegate csod = new Stu.CreateStuObjectDelegate(st_CreateStuObjectHanlder);
csod(st);
Response.Write(st.Name);
}
void st_CreateStuObjectHanlder(Stu st)
{
st.Name = "zrw2001";
st.StuNo = 1001;
}
public class Stu
{
public delegate void CreateStuObjectDelegate(Stu st);
public string Name;
public int StuNo;
}
改一下就ok了.纯委托.
--------------------编程问答-------------------- 哈哈,网速慢点了两下. --------------------编程问答-------------------- 我也说两句 , 這是對象參數傳遞的基本問題。
protected void Page_Load(object sender, EventArgs e)
{
Stu st = new Stu();
Stu.CreateStuObjectDelegate csod = new Stu.CreateStuObjectDelegate(st_CreateStuObjectHanlder);
csod(st);
Response.Write(st.Name);
}
void st_CreateStuObjectHanlder(Stu st)
{
st.Name = "zrw2001";
st.StuNo = 1001;
}
public class Stu
{
public delegate void CreateStuObjectDelegate(Stu st);
public string Name;
public int StuNo;
}
給你舉個例子(結構體 是 值傳遞,而 對象 參數傳遞):
//類型
struct StructA{public int a;}
class ClassA {public int a=0;}
//方法
void modifyStructA(StructA s) {s.a = 10; }
void ModifyClassA(ClassA c) {c.a = 10; }
void NewClassA(ClassA c) {c = new ClassA();c.a = 10; }
//執行
StructA s = new StructA();
ClassA c = new ClassA();
Response.Write("<br/>old s.a.value :" + s.a);//輸出 0
Response.Write("<br/>old c.a.value :" + c.a);//輸出 0
Response.Write("<br/>--------樓主的預料中------------");
modifyStructA(s);
ModifyClassA(c);
Response.Write("<br/>new s.a.value :" + s.a);//值傳遞 ,輸出 0
Response.Write("<br/>new c.a.value :" + c.a);//引用傳遞 ,輸出 10
Response.Write("<br/>--------樓主的疑惑------------");
ClassA c2 = null;
NewClassA(c2);
Response.Write("<br/>new c2 is null: " + ((c2 == null) ? true : false));//輸出證明c2 為空
那么原因是:
方法NewClassA 并不會修改參數 c2的引用地址,而是對c2的引用地址 所指向的對象進行修改。
你給 方法 NewClassA傳進的 c2 引用地址是空,因為不修改c2的引用地址,當然最后輸出的值就是空了 。
--------------------编程问答-------------------- "上面申明了一个委托.我的目的是用委托绑定方法创建一个Stu对象.
因为对象是引用传递的."
没看清重来一次.
protected void Page_Load(object sender, EventArgs e)--------------------编程问答-------------------- jf --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- LZ:这和委托无关。
{
Stu st = null;
Stu.CreateStuObjectDelegate csod = new Stu.CreateStuObjectDelegate(st_CreateStuObjectHanlder);
csod(out st);
Response.Write(st.Name);
}
void st_CreateStuObjectHanlder(out Stu st)
{
st = new Stu();
st.Name = "zrw2001";
st.StuNo = 1001;
}
public class Stu
{
public delegate void CreateStuObjectDelegate(out Stu st);
public string Name;
public int StuNo;
}
关键是这段代码:它传递的是st对象引用的一个副本,而不是st对象本身。
void st_CreateStuObjectHanlder(Stu st)
{
st = new Stu();
st.Name = "zrw2001";
st.StuNo = 1001;
}
更详细的信息请参考这个帖子,会有助于你的理解。15L的例子正好对应你的情况。
http://topic.csdn.net/u/20080110/18/64472e10-cd46-4468-b85a-640ed2f9b7f1.html
--------------------编程问答-------------------- 呵呵
补充:.NET技术 , ASP.NET