簡體   English   中英

使用ref傳遞委托

[英]Using ref to pass delegate

委托是引用類型,但在嘗試將其傳遞給方法時仍然需要ref關鍵字。

這讓我想起了需要在方法內修改ref的字符串,因為它們是不可變的,委托是不可變的嗎?

這是我的迷你項目:

delegate void MyDel();
static void Main(string[] args)
{
    MyDel _del  = new MyDel(Idle);

    while(true)
    {
        if(_del != null)
            _del();  
            int c = Console.Read();
            AI(c,ref _del);
            Console.Read();
            Console.Read();
        }
    }
}
    static void AI(int c, ref MyDel del) 
    {
        if(c == 'a')
        {
            del = Attack;
        }else if(c == 'i'){
            del = Idle;
        }else if (c == 's'){
            del = SwingSword;
        }
        else if (c == 'w')
        {
            del = Attack;
            del += SwingSword;
        }
        else {
            del = Idle;
        }
    }

如果沒有ref關鍵字,我將回到交換方法的情況,其中事情僅在方法內部發生。

誰能告訴我為什么需要通過引用傳遞代表?

您必須使用ref的原因是因為您正在更改_del引用的委托。

將代碼更改為以下代碼,則不需要ref參數:

static MyDel AI(int c) 
{
    if(c == 'a')
    {
        return Attack;
    }
    if(c == 'i')
    {
        return Idle;
    }
    if (c == 's')
    {
        return SwingSword;
    }
    if (c == 'w')
    {
        return (MyDel)Attack + SwingSword;
    }
    return Idle;
}

除非您指定ref關鍵字,否則C#不會通過引用傳遞。 但是,由於委托類型的變量的值是對方法的引用,因此傳遞的值是引用。 使用ref關鍵字,然后將引用傳遞給變量的存儲區,而不是方法,因此可以更改其值。

如果上一段很清楚,請閱讀https://stackoverflow.com/a/8708674/7122 ,這是按值傳遞與按引用傳遞的很好解釋。

這與不變性無關。 您正在為在外部作用域中聲明的變量分配新值,並且希望外部作用域了解此分配-這就是為什么需要ref的原因。

任何類型都適用。

* 編輯

“外部范圍”實際上並不是最佳術語。 我的意思是“調用方法的范圍”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM