C# 委托在C语言中的实现#

C# 委托在C语言中的实现#,c#,delegates,C#,Delegates,我正在努力学习如何在C#中有效地使用委托,我只是想知道是否有人可以指导我通过。。。以下是使用委托的示例实现。。。我所做的只是通过一个委托将一个值从一个类传递到另一个类。。。请告诉我这是否是正确的实施方式。。。还有你的建议 另外,请注意,我已将该代表注销在: void FrmSample_FormClosing(object sender, FormClosingEventArgs e) { sampleObj.AssignValue -= new Sample.AssignValueD

我正在努力学习如何在C#中有效地使用委托,我只是想知道是否有人可以指导我通过。。。以下是使用委托的示例实现。。。我所做的只是通过一个委托将一个值从一个类传递到另一个类。。。请告诉我这是否是正确的实施方式。。。还有你的建议

另外,请注意,我已将该代表注销在:

void FrmSample_FormClosing(object sender, FormClosingEventArgs e)
{
     sampleObj.AssignValue -= new Sample.AssignValueDelegate(AssignValue);
}
是否需要取消注册

下面是我编写的代码

public partial class FrmSample : Form
{
    Sample sampleObj;

    public FrmSample()
    {
        InitializeComponent();

        this.Load += new EventHandler(FrmSample_Load);
        this.FormClosing += new FormClosingEventHandler(FrmSample_FormClosing);

        sampleObj = new Sample();
        sampleObj.AssignValue = new Sample.AssignValueDelegate(AssignValue);            
    }

    void FrmSample_FormClosing(object sender, FormClosingEventArgs e)
    {
        sampleObj.AssignValue -= new Sample.AssignValueDelegate(AssignValue);
    }

    void FrmSample_Load(object sender, EventArgs e)
    {
        sampleObj.LoadValue();
    }

    void AssignValue(string value)
    {
        MessageBox.Show(value);
    }
}

class Sample
{
    public delegate void AssignValueDelegate(string value);
    public AssignValueDelegate AssignValue;

    internal void LoadValue()
    {
        if (AssignValue != null)
        {
            AssignValue("This is a test message");
        }
    }
}
请提供您的反馈,看看这是否正确

谢谢,
Ram

没有必要取消代理注册。您的示例obj存在于表单范围内,并将在表单关闭后销毁

在这种情况下,操作委托可能更合适-它是一种特定的委托形式,接受1-3个参数,没有返回值:


只有当事件引用使包含委托目标的对象保持活动时间过长时,才需要显式取消注册事件处理程序。在您的例子中,sampleObj将有一个对表单对象的引用。C#语法隐藏了这一点,编译器实际上生成了以下代码:

sampleObj.AssignValue=new Sample.AssignValueDelegate(, 转让价值)

此参数初始化Delegate.Target属性,AssignValue参数初始化Delegate.Method属性

这意味着只要sampleObj对象保持被引用,表单对象也保持被引用,并且不会被垃圾收集。但是,在您的示例中,唯一引用sampleObj的对象是form对象本身。垃圾收集器在处理类似这样的循环引用时没有问题,并且会检测到没有其他对象的引用。并将同时收集它们


有一个(不常见的)异常,在表单关闭后,sampleObj类生成事件会给您带来麻烦。如果事件由表单之外的内容触发,例如某些硬件事件,则可能会发生这种情况。该事件仍然可以在form类中运行代码。您通常会很快注意到这一点,在表单中引用控件的任何尝试都会引发ObjectDisposed异常。

Hi George的可能重复,我不认为这是与您链接的问题的重复。。在这里,这个问题的主要目的是了解我们是否必须明确取消该代表的注册…非常感谢。。。只是知道了一种叫做行动代表的东西的存在。。