C# 委托引用为NULL

C# 委托引用为NULL,c#,windows,forms,C#,Windows,Forms,我对引用null的代理有问题,我有以下问题: 首先,我定义要执行操作的代理: public delegate void MandarComponente(int Componente); public event MandarComponente MandarComp; 由于我希望这是一个拖放操作,我将把一些重要的东西的代码拖放 private void Capacitor_MouseDown(object sender, System.Windows.Form

我对引用
null
的代理有问题,我有以下问题:

首先,我定义要执行操作的代理:

    public delegate void MandarComponente(int Componente);
    public event MandarComponente MandarComp;
由于我希望这是一个拖放操作,我将把一些重要的东西的代码拖放

        private void Capacitor_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) //This is a PictureBox Event
    {
        componente = 1;
        Capacitor.DoDragDrop(Capacitor.Image, DragDropEffects.Copy | DragDropEffects.Move);
    }
一旦我有了它,我就会在比赛中使用它

public void tableLayoutPanel2_DragDrop(object sender, DragEventArgs e)
    {
        Point pl = new Point(this.Location.X + tableLayoutPanel2.Location.X + 10, this.Location.Y + tableLayoutPanel2.Location.Y + 32);
        int R = (int)((e.Y - pl.Y) / pictureBox1.Height);
        int C = (int)((e.X - pl.X) / pictureBox1.Width);
        Console.WriteLine("X=" + e.X + "Y=" + e.Y + " [" + C + ", " + R + "]");

        if (R == tableLayoutPanel2.RowCount) R--;
        if (C == tableLayoutPanel2.ColumnCount) C--;

        PictureBox pictureBox = (PictureBox)tableLayoutPanel2.GetControlFromPosition(C, R);

        if (R == 0 && C == 0 || R == 2 && C == 0 || R == 2 && C == 2 || R == 0 && C == 2)
        {
            MessageBox.Show("¡No puedes poner un componente ahí!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            pictureBox = null;
        }


        if (componente == 1 && pictureBox != null)
        {
                pictureBox.Image = Capacitor.Image;
                MandarComp(componente);
                MandarComp = new MandarComponente(CambiarTexto);

                if (R == 1 && C == 2 || R == 1 && C == 0)
                {
                    pictureBox.Image.RotateFlip(RotateFlipType.Rotate90FlipNone);
                }
        }
即引用此方法:

    void CambiarTexto(int Componente)
    {
        if(Componente==1)
        {
            label5.Text = "Componente Seleccionado: CAPACITOR";
        }

    }
但是
MandarCom(component)
的部分总是有一个异常
NullReferenceException


编辑:基本上我想做的是委托
mandarcomponent(int component)
保存
component
,然后将其发送到
CambiarTexto
方法,以便它在
label5.Text
中执行操作

对于使用事件,在调用它之前,首先必须给它一个值,这意味着赋值和调用的索引是错误的。 这应该是:

MandarComp += CambiarTexto;//For event, += is used more offen than directly assignment.
MandarComp(Componente);
这应该行得通

此外,如果您使用的是最新版本的C#,它允许您这样编写
MandarComp?.Invoke()
,以避免出现NullReferenceException

此外,我还建议您从委托和事件的一些基本用法开始。
如果您的委托只是在owner类中使用,那是一种浪费。直接调用该方法也会做同样的事情。

对于使用事件,在调用它之前,首先必须给它一个值,这意味着赋值和调用的索引是错误的。 这应该是:

MandarComp += CambiarTexto;//For event, += is used more offen than directly assignment.
MandarComp(Componente);
这应该行得通

此外,如果您使用的是最新版本的C#,它允许您这样编写
MandarComp?.Invoke()
,以避免出现NullReferenceException

此外,我还建议您从委托和事件的一些基本用法开始。
如果您的委托只是在owner类中使用,那是一种浪费。直接调用该方法也会做同样的事情。

欢迎使用堆栈溢出。“但是MandarCom(component)的部分始终显示NullReferenceException的异常”-然后
MandarCom
为空。您还没有解释为什么希望它不为空。(也不清楚你为什么在调用它之后将其设置在行中-这对于事件来说非常不寻常。)@JonSkeet我是事件处理程序和委托的新手,所以我尝试创建一个委托,它可以将
组件
发送到事件
CambiarTexto
,因此标签中的文本是changedOkay,我认为最好是阅读一篇关于事件和代表的教程。通常情况下,您希望订阅事件(并且您不会在自己的类中设置它)
MandarComp(component)
将调用所有现有的事件订阅者,但您没有任何订阅者。我建议您从@JonSkeet开始,谢谢,事实上我刚刚看到代理用于链接程序外部的代码;所以基本上我用错了;但是我没有找到更好的方法,这是我想到的第一件事。但真的很感谢,我要看一些关于事件和如何处理它们的教程!如果您只想调用
CambiarTexto
,只需这样做:
CambiarTexto(component)。这就是进行方法调用所需的全部内容。不需要委托或事件。欢迎使用堆栈溢出。“但是MandarCom(component)的部分始终显示NullReferenceException的异常”-然后
MandarCom
为空。您还没有解释为什么希望它不为空。(也不清楚你为什么在调用它之后将其设置在行中-这对于事件来说非常不寻常。)@JonSkeet我是事件处理程序和委托的新手,所以我尝试创建一个委托,它可以将
组件
发送到事件
CambiarTexto
,因此标签中的文本是changedOkay,我认为最好是阅读一篇关于事件和代表的教程。通常情况下,您希望订阅事件(并且您不会在自己的类中设置它)
MandarComp(component)
将调用所有现有的事件订阅者,但您没有任何订阅者。我建议您从@JonSkeet开始,谢谢,事实上我刚刚看到代理用于链接程序外部的代码;所以基本上我用错了;但是我没有找到更好的方法,这是我想到的第一件事。但真的很感谢,我要看一些关于事件和如何处理它们的教程!如果您只想调用
CambiarTexto
,只需这样做:
CambiarTexto(component)。这就是进行方法调用所需的全部内容。不需要代表或事件。我认为值得注意的是,这是事件的一个非常奇怪的用法。如果OP只想在同一个类中调用一个方法,那么使用事件是没有意义的。事件的目的是让外部代码订阅它,目前还没有迹象表明这正在发生。是的,这个答案会使错误消失——但在理解事件方面没有任何改进。@JonSkeet是的。我将编辑答案。下次我会在发布答案之前重新考虑。我认为值得注意的是,这是一个非常奇怪的事件用法。如果OP只想在同一个类中调用一个方法,那么使用事件是没有意义的。事件的目的是让外部代码订阅它,目前还没有迹象表明这正在发生。是的,这个答案会使错误消失——但在理解事件方面没有任何改进。@JonSkeet是的。我将编辑答案。下一次我会在发布答案之前重新考虑。