如何实现C#事件处理?

kef*_*hou 2 c# event-handling

DataGridView.DataSource使用赋值运算符更新时,将DataSourceChanged调用事件处理程序.你不能在C#中重载赋值操作,那么如何在内部调用事件处理程序?

public void foo(){
    this.dataGridView.DataSourceChanged += new EventHandler(bar);
    this.dataGridView.DataSource = dt;
}

//this handler is called after datasource changes
private void bar(object sender, EventArgs e) {}
Run Code Online (Sandbox Code Playgroud)

Oli*_*bes 7

DataSource 作为财产实施.

private object _dataSource;
public object DataSource {
    get
    {
        return _dataSource;
    }
    set
    {
        if (value != _dataSource) {
            _dataSource = value;
            UpdateTheDataGridView();
            RaiseTheDataSourceChangedEvent();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

读/写属性是一组两个方法,当您访问该属性时会自动调用这两个方法; set当您分配值时,get当您阅读该属性时.


Jon*_*eet 6

这取决于事件究竟它做什么,但我认为事件的像特性-除了,而不是一个getter和setter方法,你必须addremove行动,每个采取委托从事件订阅或退订/.

字段样在C#事件实现使用字段为代表固定的添加/删除实现的情况下,以及-有点像自动地实现属性.但你可以在一个addremove处理程序中做任何你喜欢的事情.

有关更多信息,请参阅有关委托和事件的文章.

至于数据源本身 - 它不是指定一个字段 - 它分配给一个属性,所以再次,它可以做任何想做的事情,包括提升DataSourceChanged事件.


Eri*_*ert 6

你要问的并不完全清楚.如果您正在询问属性设置器如何执行某些操作:属性设置器是一种方法.它像任何其他方法一样工作.在这种情况下,当调用属性setter时,它会检查是否需要引发事件,如果是,则会引发事件.

如果你问的是事件本身是如何实现的,Jon的文章当然很棒.如果您正在寻找有关如何在C#中实现事件的其他技术分析,以及实现如何随时间发生变化,请参阅Chris Burrows关于该主题的博客文章:

http://blogs.msdn.com/b/cburrows/archive/tags/events/

从底部开始.

Chris是开发人员,他为编译器的语义分析和代码生成设计并实现了许多变化.