Смущенный C# делегат проходящего в качестве параметра:.NET делегат передается в качестве вопроса параметра
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;
}
}
делегат ссылочного типа, почему она до сих пор нужно быть принят реф в купели, чтобы правильно работать как в Attach2, то как тип значения?
Из опыта C++ делегат является просто указателем на функцию, Attach1 (держатель действия) является чем-то вроде Attach1 (держатель Action *), исходный держатель передается как «значение», поэтому не назначается, а во втором случае, Attach2 (ref Action holder) является чем-то вроде Attach1 (держатель Action **), указатель фактически передается, поэтому его можно правильно манипулировать. Но почему в .NET нет указаний или подсказок ???
Если вы думаете делегатом как «просто указатель на функцию », что (в вашей ментальной модели) делает' + = 'делать? –