【问题标题】:Delegate Conversion C# to VB将 C# 转换为 VB 委托
【发布时间】:2012-11-08 15:54:59
【问题描述】:

我正在尝试将一些 C# 代码转换为 VB .Net,但遇到了一些 delgate 转换的问题。

BackupLibraries.cs

Public Class Backup
{
public event EventHandler<BackupPEventArgs> Backup;

...
if (BackupProgress != null) BackupProgress(this, new BackupProgressEventArgs(percent_complete))
...
}

public class BackupEventArgs : EventArgs
    {
        private float percentage;

        public BackupProgressEventArgs(float percentage)
        {
            this.percentage = percentage;
        }

        public float Percentage
        {
            get { return percentage; }
        }
    }

UnitTest.cs

public void BackupTest()
{
Backup bu = new Backup()
        bu.BackupProgress += delegate(object sender, Backup.BackupEventArgs e)

        {
            Debug.WriteLine("Percentage: " + e.Percentage.ToString());
        };
}

它正在转换 sb.Backup += delegate(object sender, SQLBackup.BackupProgressEventArgs e) 并将其连接到我遇到问题的其他课程中的事件。

在 VB 中:

Backuplibraries.vb

Public Class Backup

Public Event Backup As EventHandler(Of BackupEventArgs)

...
RaiseEvent Backup(Me, New BackupEventArgs(percent_complete))
...
End Class

Public Class BackupEventArgs
            Inherits EventArgs

UnitTest.vb

Public Class BackupTest

Dim bu As New Backup()

bu.BackupProgress = Sub(sender As Object, e As BackupEventArgs)
                         Debug.WriteLine(e.Percentage.ToString())
                         End Sub

End Class

当然

bu.BackupProgress = Sub(sender As Object, e As BackupEventArgs)
                             Debug.WriteLine(e.Percentage.ToString())
                             End Sub

是我从 C# 转换为 .Net 时遇到的问题。

【问题讨论】:

标签: c# vb.net


【解决方案1】:

你可以在这里试试 AddHandler

罢工>

AddHandler bu.BackupProgress, AddressOf Sub(sender As Object, e As BackupEventArgs)
                         Debug.WriteLine(e.Percentage.ToString())
                         End Sub

要让参数进入,这将无法在 VB.Net 中以这种方式保持匿名。您需要使用固定地址抽象出您的方法。

Protected Sub BackupProgressDelegate(sender as Object, e as BackupEventArgs)
    Debug.WriteLine(e.Percentage.ToString())
End Sub

...

AddHandler bu.BackupProgress, AddressOf BackupProgressDelegate

【讨论】:

  • 哦,你的速度更快。删除了我的答案,因为它是相同的。
  • @DennisTraub:我猜是以格式化为代价的速度。你的答案更漂亮:)
  • 我很确定AddressOf 不应该在这里。方法组需要它(例如AddressOf MyMethod),而不是 lambdas。
  • @Heinzi:这不是 lambda,而是匿名委托。
  • @Heinzi:其实我的立场是正确的。向匿名委托添加参数会将其创建为 lambda,即使在 4.0 中,编译器也不喜欢编写的匿名委托。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多