C# 转换接口';从VB.Net到C的s事件#
我正在努力将下面的代码转换为C 下面是visual studio在我要求它为我实现时插入的内容: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
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:如果线程取消订阅该事件,就会发生竞争。如果在空测试和委托调用之间发生这种情况,它将轰炸程序。