Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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#_Events_Event Handling_Event Listener - Fatal编程技术网

C# 如何在c中使用事件?

C# 如何在c中使用事件?,c#,events,event-handling,event-listener,C#,Events,Event Handling,Event Listener,我对c语言中的事件一无所知,这就是我想做的: 我有两种方法: OpenPage1(); OpenPage2(); 当调用这两个方法中的任何一个时,我希望调用名为performsMetask的第三个方法 我相信这可以通过事件处理来实现。有人能告诉我怎么做吗?事件是C语言的重要组成部分 简单来说,首先需要一个描述被调用方法类型的委托。在您的示例中,PerformMetask为void,不接受任何参数。 所以在你们班上申报吧 public delegate void PerformSomeT

我对c语言中的事件一无所知,这就是我想做的:

我有两种方法:

OpenPage1();    
OpenPage2();
当调用这两个方法中的任何一个时,我希望调用名为performsMetask的第三个方法


我相信这可以通过事件处理来实现。有人能告诉我怎么做吗?

事件是C语言的重要组成部分

简单来说,首先需要一个描述被调用方法类型的委托。在您的示例中,PerformMetask为void,不接受任何参数。 所以在你们班上申报吧

public delegate void PerformSomeTask();
然后,您需要声明事件,该事件是将被调用以启动函数的成员

public event PerformSomeTask OnPerformSomeTask;
在OpenPage1和OpenPage2这两种方法中,您需要检查是否有人订阅了您的活动,如果是,请致电

if(OnPerformSomeTask != null)
   OnPerformSomeTask();
这将启动订阅事件的每个方法。订阅者可以是多个

要订阅,只需按以下方式进行:

YourClass.OnPerformSomeTask += MyVoidMethod;
[...]
public void MyVoidMethod() { DoSomething(); [...] }
每次运行OpenPage1和OpenPage2时都会调用void方法

如果您需要一些参数,只需更改您的委托即可继续

public delegate void PerformSomeTask(string myParam);

然后,您的方法将此参数作为标准函数参数调用您的事件,并将其作为参数传递给每个订户函数。

事件是C语言的重要组成部分

简单来说,首先需要一个描述被调用方法类型的委托。在您的示例中,PerformMetask为void,不接受任何参数。 所以在你们班上申报吧

public delegate void PerformSomeTask();
然后,您需要声明事件,该事件是将被调用以启动函数的成员

public event PerformSomeTask OnPerformSomeTask;
在OpenPage1和OpenPage2这两种方法中,您需要检查是否有人订阅了您的活动,如果是,请致电

if(OnPerformSomeTask != null)
   OnPerformSomeTask();
这将启动订阅事件的每个方法。订阅者可以是多个

要订阅,只需按以下方式进行:

YourClass.OnPerformSomeTask += MyVoidMethod;
[...]
public void MyVoidMethod() { DoSomething(); [...] }
每次运行OpenPage1和OpenPage2时都会调用void方法

如果您需要一些参数,只需更改您的委托即可继续

public delegate void PerformSomeTask(string myParam);

然后,您的方法将此参数作为标准函数参数调用您的事件,并使用您的值将其作为参数传递给每个订户函数。

您在类中所要做的就是在示例中添加具有正确eventHandler操作的事件。eventHandler应该对应于将订阅此事件的方法。 然后从openPage方法触发事件。 如果没有人订阅此事件,则必须检查null

public class Foo
{
    public event Action theEvent;

    public void OpenPage1()
    {
        if (theEvent != null)
            theEvent();
    }

    public void OpenPage2()
    {
        if (theEvent != null)
            theEvent();
    }
}

public class Bar
{
    public int Counter { get; set; }

    public void PerformSomeTask()
    {
        Counter++;
    }        
}
这里有一个测试,您可以运行它来查看所有内容:

[TestMethod]
public void TestMethod1()
{
    var foo = new Foo();
    var bar = new Bar();
    foo.theEvent += bar.PerformSomeTask;

    foo.OpenPage1();
    foo.OpenPage2();

    Assert.AreEqual(2, bar.Counter);
}

在类中所要做的就是在示例中添加一个具有正确eventHandler操作的事件。eventHandler应该对应于将订阅此事件的方法。 然后从openPage方法触发事件。 如果没有人订阅此事件,则必须检查null

public class Foo
{
    public event Action theEvent;

    public void OpenPage1()
    {
        if (theEvent != null)
            theEvent();
    }

    public void OpenPage2()
    {
        if (theEvent != null)
            theEvent();
    }
}

public class Bar
{
    public int Counter { get; set; }

    public void PerformSomeTask()
    {
        Counter++;
    }        
}
这里有一个测试,您可以运行它来查看所有内容:

[TestMethod]
public void TestMethod1()
{
    var foo = new Foo();
    var bar = new Bar();
    foo.theEvent += bar.PerformSomeTask;

    foo.OpenPage1();
    foo.OpenPage2();

    Assert.AreEqual(2, bar.Counter);
}

为什么不在两种OpenPagemethods中简单地调用PerformSometTask呢?也就是说,在事件订阅/通知中,为什么不简单地在两种OpenPagemethods中调用PerformSometTask?也就是说,关于活动订阅/通知,感谢您快速准确的回复。帮助我按时完成任务:谢谢你快速准确的回复。帮助我按时完成任务: