我有以下课程:
Public Class Email
Private Shared ReadOnly EMAIL_REGEX = "\b[a-zA-Z]+[a-zA-Z0-9._+-]+@" + _
"[a-zA-Z0-9.-]+\.[a-zA-Z]{2,3}\b"
Private _email As String
Public Event emailCreated()
' Declare empty constructor private so the only way to create an object
' is using new (email)
Private Sub New()
End Sub
Sub New(ByVal email As String)
If Regex.IsMatch(email, EMAIL_REGEX) Then
_email = email
RaiseEvent emailCreated()
Else
Throw New Exception("Email Not Valid")
End If
End Sub
ReadOnly Property Email() As String
Get
Return _email
End Get
End Property
End Class
并且
Public Class EmailForm
WithEvents myEmail As Email
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
myEmail = New Email(TextBox1.Text)
Catch ex As Exception
MessageBox.Show("Exception: " & ex.Message)
End Try
End Sub
Public Sub emailCreated() Handles myEmail.emailCreated
MessageBox.Show("New Email Created")
End Sub
End Class
如果创建错误的电子邮件让我们说“电子邮件”异常被正确缓存并显示一条消息但是我输入的是有效的电子邮件,则不会引发该事件,正在创建该对象但未显示任何消息且没有错误或者抛出异常我怀疑它与使用“myemail = new Email(email)”有关,但我已经看到了使用new和withevents没有问题的例子。 我会对这个问题提出任何意见
谢谢
答案 0 :(得分:3)
您不应使用正则表达式验证电子邮件地址。
您应该使用MailAddress
类:
Sub New(ByVal email As String)
New MailAddress(email).ToString()
End Sub
MailAddress
类使用BNF解析器验证地址,如果地址无效,则会抛出FormatException
。
您的正则表达式会拒绝admin@mta.info
等有效地址。
要回答您的问题,系统会在WithEvents
字段有值之前引发该事件。
执行代码时会发生以下情况:
New Email(TextBox1.Text)
- 创建Email
对象,构造函数引发事件
此时,事件没有处理程序,因此事件不会执行任何操作。myEmail = ...
新的Email
对象已分配给myEmail
字段,并添加了事件处理程序。 无法解决此问题,因为在构造函数完成之前无法获取对象的引用。
相反,你应该摆脱这个事件并将myEmail
字段变成属性设置器中带有代码的属性
答案 1 :(得分:1)
首先猜测:在事件连接到它之前创建电子邮件。在你甚至没有构造函数之前触发事件,在VB甚至有机会添加事件处理程序之前,所以事件永远不会被看到。
更大的图片视图。您是否有特殊原因需要触发emailCreated事件?看起来这个事件永远不会在你自己的课堂之外处理,即使你最终让它工作,所以使用事件会增加你可能不需要甚至不需要的复杂性。