C# 从vb.net到c的事件转换#
如有任何指导,将不胜感激: 我正在将我完成的vb.net项目转换为C#。我不知道如何处理C#中的事件。我在UserAccount类中设置了安全警报事件: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
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);