从vb.net到c#的事件转换

本文关键字:事件 转换 vb net | 更新日期: 2023-09-27 18:23:50

如有任何指导,我们将不胜感激:我正在将我完成的vb.net项目转换为C#。我不知道如何处理C#中的事件处理。我在UserAccount类中设置了一个安全警报事件:

Public Class UserAccount
Private m_UserAccountID As Guid
Private m_Username As String
Private m_Password As String
Private m_Email As String
Public Event SecurityAlert(ByVal username As String, ByVal password As String)

然后我提出了一种身份验证方法:

Public Function Authenticate(ByVal U As String, ByVal P As String) As Boolean
    RaiseEvent SecurityAlert(U, P)
    If m_Username = U And m_Password = P Then
        Return True
    End If
    Return False
End Function

然后我在我的登录表单中处理:

Private Sub objUserAccount_SecurityAlert(ByVal username As String, ByVal password As String)     Handles objUserAccount.SecurityAlert
    If username = "sam" And password = "333" Then
        MessageBox.Show("This is a security breach! This employee has been fired!")
        End
    End If
End Sub

我在C#项目中有相同的类和形式,但我不知道在哪里以及如何设置延迟门,以及处理这些参数,而不是对象和EventArgs。正如我所说,任何指导都将不胜感激。这是一个夏天的课堂项目,我正在自己转换,因为我想提高我的知识。

好吧,就像我说的,到目前为止已经做到了:

namespace BusinessObjects
{
public delegate void SecurityAlert(string username, string password);
public class UserAccount
{
    private Guid m_UserAccountID;
    private String m_Username; 
    private String m_Password;
    private String m_Email;
    public event SecurityAlert Alert;

然后在我的类身份验证方法中,我试图提出它:

Alert += new SecurityAlert(U,P);

我从Jeffery的帖子中看到这是不正确的,并将其更改为:

Alert += new SecurityAlert(Alert); 

这是有道理的,因为看起来我现在引用的是处理我在登录表单中设置的事件的Alert方法:

private void Alert(String username, String password){
        if(username == "sam" && password == "333"){
            MessageBox.Show("This is a security breach! This employee has been fired!");
        }
    }

但是我的UserAccount和LoginForm是两个不同的类,它们如何相互引用呢?我得到一个错误:

Alert += new SecurityAlert(Alert); Delegate to an instance method cannot have null 'this'.

从vb.net到c#的事件转换

Visual Basic和C#处理事件的方式有一些不同。首先,Visual Basic允许您在声明事件的同一行指定事件处理程序的签名;C#使您将其拆分为两行(定义委托类型,然后声明事件)。其次,C#没有与Visual Basic的Handles子句等效的子句。相反,您必须手动注册和取消注册事件,这与使用Visual Basic的AddHandlerRemoveHandler非常类似。

下面是一个类的例子,它定义了一个事件,并在方法中引发它:

class UserAccount
{
    public delegate void SecurityAlertHandler(String username, String password);
    public event SecurityAlertHandler SecurityAlert;
    public void RaiseSecurityAlert(String u, String p)
    {
        SecurityAlert(u, p);
    }
}

下面是一个注册事件处理程序并处理事件的类的示例:

class AlertHandler
{
    public void RegisterHandler(UserAccount toMonitor)
    {
        toMonitor.SecurityAlert += HandleSecurityAlert;
    }
    private void HandleSecurityAlert(String username, String password)
    {
        Console.WriteLine("Got event: " + username + " => " + password);
    }
}

这里有一些代码,你可以在调试器中逐步查看它的工作:

    static void Main(string[] args)
    {
        UserAccount ua = new UserAccount();
        AlertHandler ah = new AlertHandler();
        ah.RegisterHandler(ua);
        ua.RaiseSecurityAlert("User", "pwd");
    }

由于Visual Basic的Handles子句会自动注册事件处理程序,您可能想知道将事件注册(在我们的示例中为toMonitor.SecurityAlert += HandleSecurityAlert)放在哪里。在您的情况下,这可能在您的登录表单的OnLoad方法中。您还需要使用-=取消注册该事件。您可以将其放在Visual Basic代码中将objUserAccount设置为Nothing的相同位置。

您可以在这里找到一些非常有用的信息

您的委托看起来是这样的:

public delegate void SecurityAlert(string username, string password);

这就是你将它包含在课堂中使用的方式:

public class UserAccount
{
    public event SecurityAlert OnSecurityAlert;
}

以下是有关举办自定义活动的信息。

以下是关于c#中事件的一些附加信息

注册事件:

UserAccount userAccount = new UserAccount();
userAccount.OnSecurityAlert += new SecurityAlert(OnSecurityAlert);

事件处理程序方法:

private void OnSecurityAlert(string username, string password)
{
}