デリゲートのスタックを管理するクラスがあるとします。何らかの理由で、ある時点で私はスタック上のランダムなデリゲートを無効にする必要があるので、デリゲートの変数を参照として渡すので、その変数をnullに設定するとスタックがそのメソッドを呼び出すのを防ぐそれはnullですが、代わりにメソッドへの参照がそこに残っているので、呼び出されます。ここで私が何を意味するか示すために、いくつかの愚かなコード:C#デリゲート参照を無効にする
public delegate void DlgtVoidVoid();
public class TestPile {
Pile pileStack = new Pile();
DlgtVoidVoid _delvar1 = null;
DlgtVoidVoid _delvar2 = null;
public void Main()
{
_delvar1 = voidmethod1;
_delvar2 = voidmethod2;
pileStack.PushItem(ref _delvar1);
pileStack.PushItem(ref _delvar2);
//trying to invalidate the first delegate handler
_delvar1 = null;
pileStack.InvokeAndPop();//invoke 2
pileStack.InvokeAndPop();//shouldn't voidmethod1 call fail?
//but instead also voidmethod1 will be called: why?
}
void voidmethod1()
{
Console.WriteLine("calling void method one");
}
void voidmethod2()
{
Console.WriteLine("calling void method two");
}
}
、これはあくまでも一例のために少しスタックマネージャである:
public class Pile {
DlgtVoidVoid[] thepile = new DlgtVoidVoid[10];
int pileindex = -1;
public void PushItem(ref DlgtVoidVoid item)
{
thepile[++pileindex] = item;
}
public DlgtVoidVoid PeekItem()
{
return thepile[pileindex];
}
public DlgtVoidVoid PopItem()
{
return thepile[pileindex--];
}
public void InvokeAndPop()
{
if(pileindex >= 0) {
if(PeekItem() != null)
PopItem().Invoke();
}
}
}
C#ドンでREFと参照変数を渡すことは明らかです」私が期待しているように、C++やいくつかでは、C#でそれを達成する方法があるのでしょうか、あるいはそのコードロジックを変更する必要がありますか?
'ref'は' PushItem'のローカル変数 'item'にのみ適用され、参照のコピーをスタックに格納しています。 '_delVar1'を' null'に設定すると、コピーされたスタック参照に影響しません。 – Lee
ここで、 'PushItem()' by-refのためのパラメータを作成することは何のヒンジも行いません。あなたはまだ参照の*コピー*を 'thepile'に入れています。ここでいくつかの異なる論理を示唆します。 –
デリゲートをNULLに設定すると何が期待されますか?おそらくエラーではありません... –