委托是引用类型,但在试图将其传递给方法时,仍然需要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关键字,我将回到交换方法的情况,在这种情况下,事情只发生在方法中。
有谁能告诉我代表为什么要通过推荐信?
发布于 2013-11-06 13:06:12
您必须使用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;
}除非您指定了C#关键字,否则ref不会通过引用传递。但是,由于委托类型的变量的值是对方法的引用,所以传递的值是引用。使用ref关键字,就可以传递对变量存储的引用,而不是方法,这样就可以更改其值。
如果前面的段落像泥浆一样清晰,那么读一读https://stackoverflow.com/a/8708674/7122,这是一个非常好的解释,传递的值和传递的参考。
发布于 2013-11-06 13:10:29
这不是不变性的问题。您正在为在外部作用域中声明的变量分配一个新值,并且希望外部作用域了解此赋值--这就是需要ref的原因。
对任何类型的人来说都是如此。
*编辑
“外部范围”实际上不是最好的术语。“调用方法的作用域”是我的意思。
https://stackoverflow.com/questions/19812801
复制相似问题