如果VB.NET中没有';不存在

如果VB.NET中没有';不存在,vb.net,events,Vb.net,Events,我正在尝试对ASP.NET网页中的多个控件使用单个事件处理程序。我想在运行时添加事件处理程序,只要它不存在。在C#中,我将按如下所示编写: if(myTextBox.OnTextChanged==null) { myTextBox.OnTextChanged+=DotTextChangingValidation; } 同样,我知道可以按如下方式删除事件处理程序: if(myTextBox.OnTextChanged!=null) { myTextBox.OnTextChanged-=DotTe

我正在尝试对ASP.NET网页中的多个控件使用单个事件处理程序。我想在运行时添加事件处理程序,只要它不存在。在C#中,我将按如下所示编写:

if(myTextBox.OnTextChanged==null)
{
myTextBox.OnTextChanged+=DotTextChangingValidation;
}
同样,我知道可以按如下方式删除事件处理程序:

if(myTextBox.OnTextChanged!=null)
{
myTextBox.OnTextChanged-=DotTextChangingValidation;
}

我知道如何在Visual Basic中添加和删除事件处理程序。。。但是我如何确定如何检查它是否已被分配?

对于此场景,不需要在Visual Basic中执行检查。正常的remove语法非常聪明,如果异常已经消失,就不会向您抛出异常。

无论是在C#还是在Visual Basic中,您都无法从对象外部执行此操作。一个事件基本上是两个访问器:
add
remove
。如果手动编码,则会立即看到:

public event EventHandler Click
{
     add { ... }
     remove { ... }
}
这些方法变成了
add\u Click(EventHandler)
remove\u Click(EventHandler)
方法。即使使用默认事件实现

public event EventHandler Click;
它仍然没有什么不同,除了使用默认实现为您生成访问器,默认实现使用与事件同名的私有多播委托字段来存储这些处理程序

这意味着两件事:

  • 对于类的客户机,他们可以对事件执行的唯一两件事是
    add
    remove
    处理程序,因为只有访问器是公开的。没有可列出当前已注册处理程序的访问器

  • 即使您使用默认的事件实现(它提供了一个字段),该字段仍然是私有的,因此您只能从同一类的方法内部访问它。如果您有代码权限,可以使用反射,但请参见#1了解为什么它不是通用解决方案

  • 这实际上是故意的。原因是:对象可能是共享的,其他代码可能已经为其事件注册了处理程序。如果您能够访问处理程序列表,您就可以自己调用它们,这可能会破坏契约,并以类所有者不希望的方式访问私有方法


    如果你想做这类事情,需要在提供事件的类中完成——要么编写你自己的
    add
    remove
    来检查重复,要么通过属性公开私有字段。

    你编写的代码不会在C#中编译。在类外部,您只能对事件执行两项操作:添加处理程序或删除处理程序。无法获取处理程序列表,因此
    myTextBox.OnTextChanged
    不会是返回委托的表达式。考虑到这一点,不清楚你在C#中实际在做什么,因此也不清楚你在VB中想做什么。好吧,所以我在C#中能做什么和不能做什么上错了。基本上,我试图做的是防止同一个处理程序被多次添加到控件中。我想确保在任何给定的时间内,分配给事件的处理程序不超过1个。如果没有更多的事件被处理,那么.net可能应该引发异常。你觉得怎么样?@Tony-如果你喜欢这种行为,你可以用C。但请注意它给c#程序员带来的问题——他们必须编写的额外代码,所有不正确(错误)的实现,当您尝试删除不存在的处理程序时,etcIt确实会抛出nullreferenceexception。