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

C# 从vb.net到c的事件转换#,c#,vb.net,events,event-handling,C#,Vb.net,Events,Event Handling,如有任何指导,将不胜感激: 我正在将我完成的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(ByV

如有任何指导,将不胜感激: 我正在将我完成的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#项目中有相同的类和表单,但我不知道在哪里以及如何设置我的delagate并处理这些参数,而不是对象和事件参数。正如我所说的,任何指导都将不胜感激。这是一个暑假的课堂项目,我正在自己转化,因为我想提高我的知识

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

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); 
这很有意义,因为我现在似乎引用了处理我在登录表单中设置的事件的警报方法:

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和Login表单是两个不同的类,它们如何相互引用呢?我得到一个错误:

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

你可以找到一些非常有用的信息

您的委托将如下所示:

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);
class AlertHandler
{
    public void RegisterHandler(UserAccount toMonitor)
    {
        toMonitor.SecurityAlert += HandleSecurityAlert;
    }

    private void HandleSecurityAlert(String username, String password)
    {
        Console.WriteLine("Got event: " + username + " => " + password);
    }
}
事件处理程序方法:

private void OnSecurityAlert(string username, string password)
{

}

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

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

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

    public void RaiseSecurityAlert(String u, String p)
    {
        SecurityAlert(u, p);
    }
}
下面是注册事件处理程序并处理事件的类的示例:

UserAccount userAccount = new UserAccount();
userAccount.OnSecurityAlert += new SecurityAlert(OnSecurityAlert);
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+=handlesecuritylert
)。在您的情况下,这可能在登录表单的OnLoad方法中。您还需要使用
-=
取消注册事件。您可以将其放在Visual Basic代码中将
objUserAccount
设置为Nothing的相同位置。

到目前为止,您在C#中创建、触发和处理事件方面做了哪些尝试?这些尝试有什么问题?关于如何在C#中执行这些操作,您研究了哪些资源?如果您不知道如何定义具有另一个签名的事件,请说出来。如果您有一个当前不工作的程序,请向我们展示您的程序,并解释哪些程序不工作。参考资料以msdn开头,但除了object和Eventargs之外,我没有找到任何特定于参数的文档。我检查了这个网站,但没有发现任何与我的项目相关的东西。我也看了一些youtube。到目前为止,我将委托放在我的类之外但在我的命名空间中:public delegate void SecurityAlert(字符串用户名、字符串密码)。然后在我的UserAccount类中创建了一个字段:public event SecurityAlert;然后在我的身份验证方法中做了:Alert+=newsecurityalert(U,P);出现了一些错误,并且真的不知道如何在我的登录表单中创建处理程序。因此,看起来您基本上已经完成了,或者至少已经完成了。正如我已经告诉过你的,现在,只需在你的问题中包含实际的代码,并描述你得到的确切错误。当你90%都在那里的时候,从一开始就要求别人向你解释,这是浪费每个人的时间。我用代码和错误更新了我的问题。我理解向每个人展示我在工作中遇到的问题。如果可以,请阅读我编辑的代码。我被编译器问的问题难住了。感谢您为我指明了正确的方向。您必须在您创建的UserAccount实例的属性上注册事件。请看我的登记行。它是userAccountInstance.Alert+=新的SecurityAlert(Alert);按照您的方式,您正在事件处理程序方法(而不是事件属性)上注册一个新的secuitylert。我正在我的身份验证方法中注册:UserAccount UserAccount=new UserAccount();userAccount.onsecuritylert+=新安全警报(onsecuritylert);错误突出显示了这一点,并说“委托给实例方法的“this”不能为null。我被难住了。除非您更改事件处理程序方法的名称,否则它应该是userAccount.onsecuritylert+=new SecurityAlert(Alert);