0

我正在和代表们玩耍,我遇到了我不确定发生了什么的情况。

在我的逻辑中,“问候”委托的调用列表应该返回 2,但它只返回 1。如您所见,我将委托引用传递给我创建的对象。我想确认委托可以从外部引用私有方法,唯一的要求是在将方法分配给委托期间可以访问该方法。

    class Program
    {
        static void Main(string[] args)
        {
            Action greetings = FirstGreeting;

            Test test = new Test();
            test.AddGreeting(greetings);

            Console.WriteLine(greetings.GetInvocationList().Count());

            greetings();

            Console.ReadLine();
        }

        static void FirstGreeting()
        {
            Console.WriteLine("This is the first greeting.");
        }
    }

    class Test
    {
        public void AddGreeting(Action greetings)
        {
            greetings += new Action(SecondGreeting);
        }

        private void SecondGreeting()
        {
            Console.WriteLine("This is the second greeting.");
        }
    }
4

2 回答 2

4

如您所见,我将委托引用传递给我创建的对象。

是的,但是您正在使用:

greetings += new Action(SecondGreeting);

这会创建一个的委托 - 它不会更改现有的委托。委托是不可变的,就像字符串一样。如果您真的希望代码以您期望的方式工作,您必须使用:

public void AddGreeting(ref Action greetings)
{
    greetings += new Action(SecondGreeting);
}

并将其称为

test.AddGreeting(ref greetings);

(或返回对新委托的引用,如彼得的回答所示。)

请参阅我关于代表和事件的文章,以了解有关功能的更多详细信息+=

于 2012-04-07T08:27:06.173 回答
1

我刚刚试过你的代码,可以明白你的意思。如果您在AddGreeting()方法中添加一行打印出调用列表,您将在其中看到两个方法。但正如 Jon Skeet 指出的那样,委托是不可变的,您还没有返回创建的新(多播)委托。

我建议您将方法更改为:

public Action AddGreeting(Action greetings)
{
    return greetings + new Action(SecondGreeting);
}

因为这将为您提供正确的调用集。

于 2012-04-07T08:31:48.957 回答