代码之家  ›  专栏  ›  技术社区  ›  citronas

是否建议使用我的方法为自定义事件args的实例赋值?

  •  0
  • citronas  · 技术社区  · 14 年前

    在我目前的情况下,我有一个类同步执行一个操作。在该操作期间,某个事件将被多次抛出,具体取决于引发事件的情况发生的频率。
    我知道事件机制是如何工作的,推荐的使用方法是什么。工作正常。(注意:我的应用程序是单线程的)

    我想做的是,在EventArgs中为属性设置一个值。我从来没有必要在那里置业。

    这是我当前情况的一个简化情况:(注意,我不需要答案告诉我使用regex或stringreplace,因为在这种情况下这不起作用)

    public class TestEventArgs : EventArgs
    {
    
        public String OldString { get; private set; }
        public String NewString { get; set; }
    
        public TestEventArgs(String oldString)
        {
            this.OldString = oldString;
        }
    }
    

    我通常是这样提出事件的:

    public event EventHandler<TestEventArgs> ChangeString;
    
    protected virtual void OnChangeString(String oldString)
    {
        EventHandler<TestEventArgs> handler = this.ChangeString;
        if (handler != null)
        {
            handler(this, new TestEventArgs(oldString));
        }
    }
    

    通过调用OnChangeString方法,因为我在很久以前读到它是以引发事件的方式出现的。

    修改了代码,其中在引发事件args后需要它的值:

    public event EventHandler<TestEventArgs> ChangeString;
    
    protected virtual void OnChangeString(TestEventArgs args)
    {
        EventHandler<TestEventArgs> handler = this.ChangeString;
        if (handler != null)
        {
            handler(this, args);
        }
    }
        public void Foo()
        {
            String oldString = "this is the old string";
            // this.OnChangeString(oldString) // this is the way I called before
            // now I need to keep a reference to the EventArgs
            TestEventArgs args = new TestEventArgs(oldString);
            this.OnChangeString(args);
            // here I do have full access to args.NewString
        }
    

    那么,保留EventArgs的引用并使用接受我的EventArgs作为参数的方法引发事件可以吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   user180326 user180326    14 年前

    可以使用事件的参数将数据传回事件源吗?

    首先也是最重要的:在低水平上,这将起作用。您可以修改事件对象,并且可以在引发事件的代码中看到这些更改。

    如果只需要一个,那么传递一个委托(类型为 Func<String, String> )现在引发事件的类。

        2
  •  1
  •   Patrick D'Souza ob1    12 年前

    如果我答对了你的问题,你一般不想保留你的 TestEventArg

    在你的情况下,你的 测试目标 有公共属性调用 NewString . 如果任何事件处理程序更新了此属性,而它被程序的多个部分引用,则可能会意外地遇到以下问题: 从你的问题的另一个方面来看,财产一直在变化。

    但是,如果 测试目标 只有可读属性,那么我认为保留引用并重用它没有问题。

    public class TestEventArgs : EventArgs
    {    
        public String OldString { get; private set; }
        public String NewString { get; private set; }
    
        public TestEventArgs(String oldString, String newString)
        {
            this.OldString = oldString;
            this.NewString - newString
        }
    }
    

    一般来说,你想保持 事件参数不可变 这将使您的程序更容易理解和调试。

        3
  •  1
  •   Patrick D'Souza ob1    12 年前

    TestEventArg arg(在本例中)是指在调用方法后是否需要访问变量。例如 OnClosing 窗体的事件。它有一个变量,你可以设置它来告诉它取消关闭。在这种情况下,如果客户机注册回调,并且可以在

    对我来说一个警告是如果我使用 OnChangeString 方法,我编写它以便它封装事件参数的详细信息。

    protected virtual void OnChangeString(string oldString)
    {
        EventHandler<TestEventArgs> handler = this.ChangeString;
        if (handler != null)
        {
            var args = new TestEventArgs(oldString);
            handler(this, args);
    
            // Do something with args
        }
    }