当前位置:编程学习 > C#/ASP.NET >>

***************请问关于委托的问题******************

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了.纯委托.


 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;  
    } 
--------------------编程问答-------------------- lZ 程序一个字"乱"
改一下就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)
    {
        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;
    } 
--------------------编程问答-------------------- jf   --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- LZ:这和委托无关。

关键是这段代码:它传递的是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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,