繁体   English   中英

C# 。 有关从VB转换的代码的说明

[英]C# . Explanation about the code converted from VB

我正在使用转换以下VB代码的转换器

Public Event Progress(ByVal Percent As Integer)

到C#

public delegate void ProgressEventHandler(int Percent);
private ProgressEventHandler ProgressEvent;

public event ProgressEventHandler Progress
{
    add
    {
        ProgressEvent = (ProgressEventHandler) System.Delegate.Combine(ProgressEvent, value);
    }
    remove
    {
        ProgressEvent = (ProgressEventHandler) System.Delegate.Remove(ProgressEvent, value);
    }
}

似乎很多代码。 我只希望这三行。

public delegate void ProgressEventHandler(int Percent);
private ProgressEventHandler ProgressEvent;
public event ProgressEventHandler Progress;

然后我以这种方式调用事件

void OnProgress(int p) {
    ProgressEvent?.Invoke (p);
}

因此,我确切需要知道的是Progress主体(带有添加和删除)的优点是什么。 我应该坚持自己的代码还是由转换器使用代码? 哪一个更好?

这些System.Delegate.CombineSystem.Delegate.Remove调用只是执行以下操作的冗长方式:

// combine
ProgressEvent += value;

// remove
ProgressEvent -= value;

将事件成员变成以下成员:

private ProgressEventHandler ProgressEvent;
public event ProgressEventHandler Progress
{
    add
    {
        ProgressEvent += value;
    }
    remove
    {
        ProgressEvent -= value;
    }
}

那时,它等效于自动实现的事件成员:

public event ProgressEventHandler Progress;

因此,这本质上只是定义事件和事件处理程序的冗长方式,但实际上意味着相同。 我假设您所使用的转换器只是使用冗长的方法,以便能够更轻松地处理非标准解决方案。 也许它是从编译的IL中生成的,这时看起来或多或少都是相同的。

顺便说一句。 由于Progress事件和处理程序ProgressEvent未链接,因此您期望的代码将无法工作(因此,如果要拆分这些成员,则需要显式实现该事件)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM