Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的委托数组#_C#_Arrays_Delegates - Fatal编程技术网

C# C语言中的委托数组#

C# C语言中的委托数组#,c#,arrays,delegates,C#,Arrays,Delegates,我正在尝试从委托数组调用委托函数。我已经能够创建委托数组,但是如何调用委托 public delegate void pd(); public static class MyClass { static void p1() { //... } static void p2 () { //... } //... static pd[] delegates = new pd[] {

我正在尝试从委托数组调用委托函数。我已经能够创建委托数组,但是如何调用委托

public delegate void pd();

public static class MyClass
{

    static void p1()
    {
        //...
    }

    static void p2 ()
    {
        //...
    }

    //...

    static pd[] delegates = new pd[] {

        new pd( MyClass.p1 ),
        new pd( MyClass.p2)
        /* ... */
    };
}

public class MainClass
{
    static void Main()
    {
        // Call pd[0]
        // Call pd[1]
    }
}
static pd delegateInstance = new pd(MyClass.p1) + new pd(MyClass.p2) ...;

...
pd();

EDIT:使用数组的原因是我需要根据需要通过索引调用委托函数。它们不会响应事件而运行。我在代码中看到一个严重的(愚蠢的)错误,因为我试图使用pd[]类型而不是数组(委托)的名称来执行委托函数。

如果它们都是相同的类型,为什么不将它们合并到一个多播委托中呢

public delegate void pd();

public static class MyClass
{

    static void p1()
    {
        //...
    }

    static void p2 ()
    {
        //...
    }

    //...

    static pd[] delegates = new pd[] {

        new pd( MyClass.p1 ),
        new pd( MyClass.p2)
        /* ... */
    };
}

public class MainClass
{
    static void Main()
    {
        // Call pd[0]
        // Call pd[1]
    }
}
static pd delegateInstance = new pd(MyClass.p1) + new pd(MyClass.p2) ...;

...
pd();

在.Net中,任何委托实际上都是“多播”委托(它继承自此内置基类),因此包含一个内部链接列表,其中可以包含任意数量的目标委托

您可以通过调用委托本身的GetInvocationList()方法来访问此列表。此方法返回一个委托数组

唯一的限制是给定代理的链接列表中的所有代理必须具有相同的签名(具有相同的代理类型)。如果需要集合能够包含不同类型的委托,则需要构造自己的列表或集合类

但是如果这是确定的,那么您可以“调用”给定委托的调用列表中的委托,如下所示:

public delegate void MessageArrivedHandler(MessageBase msg);
public class MyClass
{
     public event MessageArrivedHandler MessageArrivedClientHandler;   

     public void CallEachDelegate(MessageBase msg)
     {
          if (MessageArrivedClientHandler == null)
              return;
          Delegate[] clientList = MessageArrivedClientHandler.GetInvocationList();
          foreach (Delegate d in clientList)
          {
              if (d is MessageArrivedHandler)
                  (d as MessageArrivedHandler)(msg);
          }
     }
}

从技术上讲,这应该是MyClass.pd[0]()。pd是一种类型,MyClass.pd是MyClass的静态成员。为什么不将les pd组合在一起呢!不这样做的一个原因是单独处理任何委托引发的异常,而不仅仅是捕获第一个异常。根据我的编辑,委托不会响应事件而执行,而是使用数组中的索引单独调用。@jacob_c-是,如果您真的想:)@pro3carp3-在这种情况下,您只需要按照数组的正常值通过索引访问它。作为这里的代表没什么特别的。谢谢你,乔恩。我犯了一个愚蠢的错误,认为我遗漏了什么。是“代表”而不是“代表”
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        pd[0](1);
        pd[1](2);
    }

    public delegate void delegates(int par);
    static delegates[] pd = new delegates[] 
                                     { 
                                      new delegates(MyClass.p1), 
                                      new delegates(MyClass.p2) 
                                     };
    public static class MyClass
    {

        public static void p1(int par)
        {
            MessageBox.Show(par.ToString());
        }

        public static void p2(int par)
        {
            MessageBox.Show(par.ToString());
        }


    }

}