首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ref传递委托

使用ref传递委托
EN

Stack Overflow用户
提问于 2013-11-06 13:02:19
回答 2查看 2.4K关注 0票数 0

委托是引用类型,但在试图将其传递给方法时,仍然需要ref关键字。

这让我想起了需要在方法中修改ref的字符串,因为它们是不可变的,委托不可变吗?

这是我的迷你项目:

代码语言:javascript
复制
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关键字,我将回到交换方法的情况,在这种情况下,事情只发生在方法中。

有谁能告诉我代表为什么要通过推荐信?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-06 13:06:12

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

将代码更改为以下内容,您将不需要ref参数:

代码语言:javascript
复制
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;
}

除非您指定了C#关键字,否则ref不会通过引用传递。但是,由于委托类型的变量的值是对方法的引用,所以传递的值是引用。使用ref关键字,就可以传递对变量存储的引用,而不是方法,这样就可以更改其值。

如果前面的段落像泥浆一样清晰,那么读一读https://stackoverflow.com/a/8708674/7122,这是一个非常好的解释,传递的值和传递的参考。

票数 4
EN

Stack Overflow用户

发布于 2013-11-06 13:10:29

这不是不变性的问题。您正在为在外部作用域中声明的变量分配一个新值,并且希望外部作用域了解此赋值--这就是需要ref的原因。

对任何类型的人来说都是如此。

*编辑

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19812801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档