English 中文(简体)
。 NET:每当活动引起好的做法时,是否创造新的活动动力?
原标题:.NET: Is creating new EventArgs every time the event fires a good practice?

例如,我有一个基本活动出版方法:

    protected virtual OnSomeEvent(EventArgs e)
    {
        var handler = SomeEvent;
        if (handler != null)
        {
            handler(this, e);
            // handler(this, new EventArgs());// EDIT: Yes it should be
                                           // handler(this, e),
                                           // ignore this one :D
        }
    }

对于高于<代码>OnSomeEvent的衍生产品,在火灾时会增加一个活动:

    protected override OnSomeEvent(EventArgs e)
    {
        base.OnSomeEvent(e);

        if (ExtendedEvent != null)
        {
            OnExtendedEvent(e);
        }
    }

    protected void OnExtendedEvent(EventArgs e)
    {
       // some stuff done
       // new information the ExtendedEventArgs object needs 
       //  is not available until this point

       ExtendedEvent(this, new ExtendedEventArgs(someStuff, someOtherStuff));
    }

如果衍生物继续如此,它将为每一代衍生产品创造新的衍生工具,而这种活动需要。 然而,在<代码>EventArgs上似乎有各种不同的衍生物。 NET框架并非意在变幻莫测(没有设定者),因此阻止某一物体保持单一事件分析,并随着时间的推移加以修改。

因此,每次像这种火焰这样的事件,它都会重新向所有有关方传承<条码>。 在有图形的密集应用中,如果某项活动可以每秒引发数十次(例如<条码>关于控制的活动>),这是否真正是一种良好做法?

我是否应对<代码>()作一些改动,并作如下改动:Ex 预期EventArg:

    protected ExtendedEventArgs extendedArgs = ExtendedEventArgs.Empty;
    protected void OnExtendedEvent(EventArgs e)
    {
       // some stuff done
       // new information the ExtendedEventArgs object needs 
       //  is not available until this point

       extendedArgs.someProperty1 = someStuff;
       extendedArgs.someProperty2 = someOtherStuff;

       ExtendedEvent(this, extendedArgs);
    }

EDIT:现在应当更加明确地确定实例代码。

最佳回答

每次发射时,我都会制造新的不可改变的物体,因为如有争论,就会出现价值。

主要原因是,如果在处理现有事件时再次发生新事件,会发生什么情况?

如以下例子所示,这有可能在多读应用中发生,但甚至可能在一只透镜上发生:

第一场活动有以下价值:

extendedArgs.someProperty1 = "Fire 1";
extendedArgs.someProperty2 = "Fire 1 Other Stuff";

接着,第一事件的手却以下列理由再次引发事件:

extendedArgs.someProperty1 = "Fire 2";
extendedArgs.someProperty2 = "Fire 2 Other Stuff";

所有活动处理人都参加了第二次活动,现在我们回头处理第一场活动的其他活动。

现在,由于同一物体被使用,第一次活动的所有活动处理者现在将拥有“Fire 2”作为其某些财产1,因为第二次活动超过了价值。

@nobugz提到,不要害怕制造短寿命的垃圾。

问题回答

首先,如果你只是无视发射方法,为什么会把事件Arg诉说给你的发射方法? 这是实际的废物,但资源消耗问题比你的方法告诉其打电话者的谎言小。 仅仅通过这一论点,你的发射方法可能不具备制造事件的相关信息:

protected virtual OnSomeEvent(EventArgs e)
{
    var handler = SomeEvent;
    if (handler != null)
    {
        handler(this, e);
    }
}

因此,现在,如果你的活动协会的目标没有有意义的信息来告诉你们的客户,我们就有了这种直截了当,只是利用活动。 就业就是这种情况。 您的习俗活动会遵循同样的模式,但坦率地说,你不担心。 创建活动协会的目标永远不会成为你申请的瓶颈,如果是,你有设计问题。

页: 1 一些Event ?

当客户增加一名活动手时,他们期望他们在处理活动时能够搬走活动手。

someObject.SomeEvent += OnSomeEvent;
// ...
private void OnSomeEvent(object sender, EventArgs e)
{
    someObject.SomeEvent -= OnSomeEvent;
}

如果你不遵循标准发送做法,则该守则将给使用你的代码的人感到意外。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签