对作为参数传递的 C# 委托感到困惑:
class Program
{
static void Main(string[] args)
{
var a = new A();
Action holder = delegate{};
//a.Attach1(holder); //nothing printed
a.Attach2(ref holder);//print as expected
holder();
}
}
public class A
{
private void P1()
{
Console.WriteLine("Inaccessible");
}
public void P2()
{
Console.WriteLine("Accessible");
}
public void Attach1(Action holder)
{
holder += P1;
holder += P2;
}
public void Attach2(ref Action holder)
{
holder += P1;
holder += P2;
}
}
委托是引用类型,为什么它仍然需要与字体中的 ref 一起传递才能像在 Attach2 中一样正常工作,比如值类型?
从 C++ 经验来看,delegate 只是一个函数指针,Attach1(Action holder) 类似于 Attach1(Action* holder),原始持有人作为“值”传递,因此未分配,而在第二种情况下,Attach2(ref Action holder) 类似于 Attach1(Action** holder),指针实际上是通过的,因此可以正确操作。但是为什么在 .NET 中没有任何指示或提示???