0

委托是引用类型,但在尝试将其传递给方法时仍需要 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 关键字,我将回到 swap 方法的情况,即事情只发生在方法内部。

谁能告诉我为什么代表需要通过引用传递?

4

2 回答 2

4

您必须使用 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,这是对传递值与传递值的很好解释。

于 2013-11-06T13:06:12.380 回答
3

这与不变性无关。您正在为在外部范围中声明的变量分配ref一个新值,并且您希望外部范围知道此分配 - 这就是您需要.

这对于任何类型都是正确的。

*编辑

“外部范围”实际上并不是最好的术语。“调用方法的范围”就是我的意思。

于 2013-11-06T13:10:29.253 回答