Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换接口';从VB.Net到C的s事件#_C#_Vb.net_Events_Interface - Fatal编程技术网

C# 转换接口';从VB.Net到C的s事件#

C# 转换接口';从VB.Net到C的s事件#,c#,vb.net,events,interface,C#,Vb.net,Events,Interface,我正在努力将下面的代码转换为C 下面是visual studio在我要求它为我实现时插入的内容: event EventHandler<MyEventArgs> IMyInterface.MyEvent { add { throw new NotImplementedException(); } remove { throw new NotImplementedException(); } } 事件事件处理程序IMyInterface

我正在努力将下面的代码转换为C

下面是visual studio在我要求它为我实现时插入的内容:

event EventHandler<MyEventArgs> IMyInterface.MyEvent
    {
        add { throw new NotImplementedException(); }
        remove { throw new NotImplementedException(); }
    }
事件事件处理程序IMyInterface.MyEvent
{
添加{抛出新的NotImplementedException();}
删除{抛出新的NotImplementedException();}
}

通过一点谷歌搜索,我确信我可以找到用什么替换NotImplementedException部分,但VS仍然告诉我该定义没有实现。

Visual Studio为您创建的实现不是一个完整的实现,而是一个您需要完成的实现体。在本例中,“throw new NotImplementedException();”行需要由您的代码替换。

Visual Studio为您创建的实现不是一个完整的实现,而是一个您需要完成的实现体。在这种情况下,“throw new NotImplementedException();”行需要由您的代码替换。

使用:

我得到:

class Class1 : IMyInterface
{

    public event MyEventEventHandler IMyInterface.MyEvent;
    public delegate void MyEventEventHandler(object sender, MyEventArgs e);

    public Class1()
    {
        this.Slider.ValueChanged += OnSliderValueChanged;
    }

    private void OnSliderValueChanged(System.Object sender, System.EventArgs e)
    {
        if (MyEvent != null) {
            MyEvent(this, new MyEventArgs());
        }
    }

}
使用:

我得到:

class Class1 : IMyInterface
{

    public event MyEventEventHandler IMyInterface.MyEvent;
    public delegate void MyEventEventHandler(object sender, MyEventArgs e);

    public Class1()
    {
        this.Slider.ValueChanged += OnSliderValueChanged;
    }

    private void OnSliderValueChanged(System.Object sender, System.EventArgs e)
    {
        if (MyEvent != null) {
            MyEvent(this, new MyEventArgs());
        }
    }

}

奇怪的是,VS生成了添加/删除访问器。您不需要它们,编译器会自动生成它们。应该是这样的:

  public class Class1 : IMyInterface {
    public event EventHandler<MyEventArgs> MyEvent;
    public Class1() {
      this.Slider.ValueChanged += OnSliderValueChanged;
    }
    private void OnSliderValueChanged(object sender, EventArgs e) {
      var handler = MyEvent;
      if (handler != null) {
        handler(this, new MyEventArgs());
      }
    }
  }
公共类1:IMyInterface{
公共事件事件处理程序;
公共类别1(){
this.Slider.ValueChanged+=OnSliderValueChanged;
}
SliderValueChanged上的私有void(对象发送方,事件参数e){
var handler=MyEvent;
if(处理程序!=null){
handler(这个,新的MyEventArgs());
}
}
}
如果线程连接事件,使用“handler”变量可以避免出现空异常


编辑:啊,这是因为你明确地实现了这个事件。没有必要,无论如何,活动应该是公开的。这就是让你陷入麻烦的地方,这里的C#语法与VB.NET不同,这很奇怪,VS生成了添加/删除访问器。您不需要它们,编译器会自动生成它们。应该是这样的:

  public class Class1 : IMyInterface {
    public event EventHandler<MyEventArgs> MyEvent;
    public Class1() {
      this.Slider.ValueChanged += OnSliderValueChanged;
    }
    private void OnSliderValueChanged(object sender, EventArgs e) {
      var handler = MyEvent;
      if (handler != null) {
        handler(this, new MyEventArgs());
      }
    }
  }
公共类1:IMyInterface{
公共事件事件处理程序;
公共类别1(){
this.Slider.ValueChanged+=OnSliderValueChanged;
}
SliderValueChanged上的私有void(对象发送方,事件参数e){
var handler=MyEvent;
if(处理程序!=null){
handler(这个,新的MyEventArgs());
}
}
}
如果线程连接事件,使用“handler”变量可以避免出现空异常


编辑:啊,这是因为你明确地实现了这个事件。没有必要,无论如何,活动应该是公开的。这就是让你陷入困境的原因,这里的C#语法与VB.NET不同,这是我第一次尝试的,但它不能正确地转换它。对于“public event”行,我得到了一个错误:“事件的显式接口实现必须使用事件访问器语法”,这是我首先尝试的,但它没有正确地转换它。对于“公共事件”行,我得到了一个错误:“事件的显式接口实现必须使用事件访问器语法”我知道,这就是为什么我说“用一点谷歌搜索…”。然而,VS发现有一个更广泛的问题。我知道,这就是为什么我说“用一点谷歌搜索…”。然而,VS发现了一个更广泛的问题。你能解释一下你的“处理程序”评论吗?@AMissico:如果一个线程取消订阅该事件,就会发生竞争。如果在空测试和委托调用之间发生这种情况,它将轰炸程序。你能解释一下你的“处理程序”注释吗?@AMissico:如果线程取消订阅该事件,就会发生竞争。如果在空测试和委托调用之间发生这种情况,它将轰炸程序。