C# 是否建议我向自定义EventArgs实例赋值?

C# 是否建议我向自定义EventArgs实例赋值?,c#,asp.net,events,C#,Asp.net,Events,在我目前的情况下,我有一个类同步执行一个操作。在该操作期间,某个事件将被多次抛出,具体取决于引发该事件的情况发生的频率。 我知道事件机制是如何工作的,推荐的使用方法是什么。工作正常。(注意:我的应用程序是单线程的) 我想做的是,在EventArgs中为属性设置一个值。我从来没有必要在那里设置属性 这是我当前情况的简化情况:(注意,我不需要答案告诉我使用regex或stringreplace,因为在这种情况下这不起作用) 我有以下事件: public class TestEventArgs : E

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

我想做的是,在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));
    }
}
公共事件事件处理程序ChangeString;
受保护的虚拟void OnChangeString(String oldString)
{
EventHandler=this.ChangeString;
if(处理程序!=null)
{
处理程序(这个,新的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
    }
公共事件事件处理程序ChangeString;
受保护的虚拟void OnChangeString(TestEventTargets参数)
{
EventHandler=this.ChangeString;
if(处理程序!=null)
{
处理程序(this,args);
}
}
公共图书馆
{
String oldString=“这是旧字符串”;
//this.OnChangeString(oldString)//这是我以前调用的方式
//现在我需要保留对EventArgs的引用
TestEventTargets args=新的TestEventTargets(旧字符串);
这个.OnChangeString(args);
//在这里,我可以完全访问args.NewString
}

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

我认为您的问题归结为:

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

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

但是如果有多个事件侦听器呢。谁可以设置新闻字符串


如果只需要一个委托,则更清楚的是将委托(类型为
Func
)传递给现在引发事件的类

我想你的问题可以归结为:

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

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

但是如果有多个事件侦听器呢。谁可以设置新闻字符串


如果只需要一个委托,则更清楚的是将委托(类型为
Func
)传递给现在引发事件的类

如果我答对了您的问题,您通常不希望保留对
testeentarg
的引用,并在另一个事件中重用此对象

在您的情况下,您的
TestEventArg
有一个公共属性调用
NewString
。如果任何事件处理程序在程序的多个部分开始引用该属性时更新了该属性,则您可能会意外地遇到问题,
NewString
属性不断从问题的另一部分更改

但是,如果您的
TestEventArg
只有可读属性,那么我认为保留引用并重用它没有问题

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
    }
}

一般来说,您希望保持事件arg不可变,这将使您的程序更易于理解和调试。

如果我没有弄错您的问题,您通常不希望保留对
TestEventArg
的引用,并在另一个事件上重用此对象

在您的情况下,您的
TestEventArg
有一个公共属性调用
NewString
。如果任何事件处理程序在程序的多个部分开始引用该属性时更新了该属性,则您可能会意外地遇到问题,
NewString
属性不断从问题的另一部分更改

但是,如果您的
TestEventArg
只有可读属性,那么我认为保留引用并重用它没有问题

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
    }
}

一般来说,您希望保持事件arg不可变,这将使您的程序更易于理解和调试。

我唯一保留
TestEventArg
arg(在本例中)的时间是在调用方法后您是否需要访问变量。例如表单的
OnClosing
事件。它有一个变量,您可以设置它来告诉它取消关闭。在这种情况下,如果客户机注册回调,并且可以在
TestEventArg
类上设置一个属性,那么您需要一个指向它的变量。如果您只想将信息传递给回调,而不需要返回任何信息,那么第一种方法就是我使用的方法

我需要注意的一点是,如果我使用
onchangesetring
方法,那么我编写它是为了封装事件参数的细节

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
    }
}
受保护的虚拟void OnChangeString(string oldString)
{
EventHandler=this.ChangeString;
if(处理程序!=null)
{
var args=新测试目标(旧字符串);
处理程序(this,args);
//用args做点什么
}
}

我保留
testeentarg
arg(在本例中)的唯一时间是在调用方法后需要访问变量。例如表单的
OnClosing
事件。它有一个变量,您可以设置它来告诉它取消关闭。在这种情况下,如果客户机注册回调,并且可以在
TestEventArg
类上设置一个属性,那么您需要一个指向它的变量。如果你想