[英]How to raise a delegate event using a ref parameter in NSubstitute 3.1?
[英]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.