属性与事件的关系 .net

来源:互联网 发布:javascript用处 编辑:程序博客网 时间:2024/05/18 17:03

事件和属性的联系从VB的出现至今已经有N年的光景了,(哈哈,有点魔兽世界的味道)

关键现在我们不是精确计算他的时间,现在我们将关心他在.NET中的来龙去脉。

首先我们建个VB.NETFORM工程。实际上建一个控件工程更能体现,但鉴于懒惰的强烈要求,我选择了

FORM工程。当然,我的懒惰一直非常恳切地请求我放弃写这种无聊透顶的东西,但鉴于对CSDN给于空间的强烈

愧疚感,我还是坐下来活动一下双手。哈哈哈哈

NOW ,WE GO

19:17 2006-11-2

首先我们写代码,(我偏执的喜欢代码的说服力,近乎痛绝那些空泛的理论)-》希望IT不会使所有的人恶心,嘻嘻

首先,向FORM上添加一个BUTTON,当然,BUTTON本身也会有事件触发,但我们现在先把研究的对象确定下来,

鉴于民主,我决定FORM为研究对象,哈哈

现在命名为STUDYOBJECT,下面是在BUTTON1CLICK事件中填写的代码:

Public Class STUDYOBJECT

   Private Sub STUDYOBJECT_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

 Private Sub STUDYOBJECT_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.TextChanged

        MsgBox("晕,怎么会掉我?")

   End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Me.Text = "注意,我可是研究对象呀!"

    End Sub

End Class

现在我们来运行程序,看看运行的情况:

晕,这是什么东西,哦,原来有个选项没有取消,MICROSOFT还真能扯蛋。恩,下面我们运行并单击BUTTON1,结果为:

 

也许你像我一样急需回答这个问题,但究竟使怎么会是呢,现在我们来研究研究

先来看看.NET的文档:

<microsoft>


Events and Overridable Methods

Most events have corresponding virtual methods

public delegate void MouseEventHandler(object sender, MouseEventArgs e);

public class EventSource {

public event MouseEventHandler MouseMove;

...

protected virtual void OnMouseMove(MouseEventArgs e) { ... }

}

Object users must subscribe to events

Derived classes can override virtual methods

Must call base class to fire events to subscribers

protected override void OnMouseMove(MouseEventArgs e) {

base.OnMouseMove(e);

// something interesting here…

}

 

</microsoft>

请多多注意

1.public event MouseEventHandler MouseMove;

2.protected virtual void OnMouseMove(MouseEventArgs e) { ... }

1,表示声明一个委托对象,这个对象被当作事件函数来调用,像VB中用EVENT修饰的函数一样。关于委托不想在这次瞎掰中讨论,感兴趣可以到MICROSOFT    MSDN上仔细看看,我也许会在下一篇中讨论,主要是针对线程的问题,当然也要看各位网友顶的程度而定,(寒一个)。

2.看起来好像MFC中函数,哈哈,想想又不应该,真是瞎掰。

实际上我们研究的事件与他有很大的关系,当然他与属性也有一些暖昧,既然我们要说的两个“猪脚”相继登场,我们就不在客气,来,看看他们的俊像。

由于他们都是保护类型,我们可以在子类中继承他,由于研究的是FORM,我们就来OVERRIDES一下:
    Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)

        MyBase.OnTextChanged(e)

 End Sub

他是怎么联系属性与事件的呢,我们可以在Button1_ClickSTUDYOBJECT_TextChangedOnTextChanged加断点,看看他们的执行顺序,执行顺序为:
Button1_Click----
OnTextChanged----STUDYOBJECT_TextChanged

别被Button1_Click迷惑了,盯紧这个函数中的 STUDYOBJECT.Text = "注意,我可是研究对象呀。"

  OK了。

看看他们执行路径和退出路径,不难推出他们的关系为:

<BASE CLASS>
    Public Property text() As String

        Get

 

        End Get

        Set(ByVal value As String)

       ======================

           OnTextChanged(e)

       ======================

        End Set

    End Property

 

Sub OnTextChanged()

  ===============

   Call TextChanged()//注意他是在BASE类中定义的委托对象,在子类中写代码,看看上面的程、//序就明白了。

================

End sub

</BASE CLASS>

至于上面的执行顺序与函数之间的包含关系,只要你用过C语言,理解没有任何问题。

下面我们来证明我们的猜想是不是正确呢,注意了,也许你能了解上面的工作原理,但MICROSOFT是否这样应用可是两码事:

我们用PEBrowsePro打开 

  Set(ByVal value As String)

 

 

       ======================
           OnTextChanged(e)
       ======================
        End Se
End Property
部分
原创粉丝点击