簡體   English   中英

將 VB.NET 委托轉換為 C#

[英]Convert VB.NET delegate to C#

我想將這行代碼從 VB.NET 轉換為 C#:

Private callback As clsCompareLibs.ResultCallback = AddressOf zipCallback

如何將上述代碼轉換為 C#? 如果我添加以下代碼行,應用程序就可以工作,但沒有進度條,並且調用了 zipCallback 函數,但從不進入 else 部分:

    public delegate void zipCallbackHendler(ref CompareLibs.ZipData _zipData);
    zipCallbackHendler ziphandler; 
    CompareLibs.ResultCallback callback/*=ziphandler*/;

zipCallback 的代碼:

Private Sub zipCallback(ByRef zipData As clsCompareLibs.ZipData)

    Static lastName As String

    If Me.InvokeRequired Then
        Me.Invoke(callback, zipData)
    Else

        With zipData
            If .fileList IsNot Nothing AndAlso .fileList.Count > 0 Then
                ' We've received a list of files. Add them to the listbox.
                Dim names As New List(Of String)
                currentEntries.Clear()

                For Each entry As clsCompareLibs.ShortEntry In .fileList
                    names.Add(entry.name)
                    currentEntries.Add(entry)
                Next

                Me.lbFileList.Items.AddRange(names.ToArray())

                Me.lblFileName.Text = "Complete."

                Try
                    zipLib.Close()
                Catch ex As Exception
                End Try

                me.Cursor = System.Windows.Forms.Cursors.Default
            Else
                ' We're updating the UI with progress data here.

                ' Have we moved on to a new file?
                If lastName <> zipData.currentFileName Then
                    ' If so, set the progress bar to 0.
                    pbCurrentFile.Value = 0 
                    lastName = zipData.currentFileName
                End If

                lblFileName.Text = .operationTitle
                If .currentFileName <> "" Then lblFileName.Text += ": ...\" & Path.GetFileName(.currentFileName)
                If .currentFileBytesCopied > 0 AndAlso .totalBytes > 0 Then
                    pbCurrentFile.Value = CInt((.currentFileBytesCopied / .currentFileLength) * 100)
                    pbTotalBytes.Value = CInt((.totalBytesCopied / .totalBytes) * 100)

                    pbCurrentFile.Refresh()
                    pbTotalBytes.Refresh()
                End If

                If .complete Then
                    zipLib.Close()
                    If .cancel Then 
                        lblFileName.Text = "Canceled."
                        pbCurrentFile.Value     = 0
                        pbTotalBytes.Value      = 0
                    Else
                        endTime = Now
                        If endTime.Subtract(startTime).TotalSeconds > 60 then
                            lblFileName.Text = "Complete. This operation took " & _
                                endTime.Subtract(startTime).Minutes.ToString() & _
                                " minutes, and " & endTime.Subtract(startTime).Seconds.ToString() & " seconds."
                        Else
                            lblFileName.Text = "Complete. This operation took " & _
                                endTime.Subtract(startTime).TotalSeconds.ToString("N1") & _
                                " seconds."
                        End If
                    End If

                    tsbZipFiles.Visible         = True
                    tsbZipFiles.Enabled         = True
                    tsbListZipEntries.Visible   = True
                    tsbCancel.Visible           = False
                    me.Cursor = System.Windows.Forms.Cursors.Default
                End If

                If .errorMessage <> "" Then 
                    MsgBox("" & .errorMessage, MsgBoxStyle.Critical, "Zip Example App")
                    me.Cursor = System.Windows.Forms.Cursors.Default
                End If
            End If
        End With
    End If

End Sub

在主要:

            zipLib = New clsCompareLibs(zipPath, clsCompareLibs.ZipAccessFlags.Create, 1024 * 1024, _
            cbDotNetZip.Checked, CInt(nudCompression.Value), cbZip64.Checked, tbPassword.Text, 100, AddressOf zipCallback)

結果回調:

Public Delegate Sub ResultCallback(ByRef _zipData As ZipData)

zipCallback方法是一個類的成員。 由於該方法可能使用該類類型的其他成員,因此您還需要該類的一個實例與委托一起使用,因此代碼知道如果引用另一個成員時要查看哪個實例。

為了幫助理解,請考慮以下代碼:

Public Class Foo
    Public A As String

    Public Sub Bar(Baz As String)
         A = A & Baz
    End Sub
End Class

Dim x As New Foo With {.A = "x"}
Dim y As New Foo With {.A = "y"}

現在想象一下嘗試使用Foo.Bar()作為您的委托回調。 根據您使用的是x實例還是y實例,您會看到不同的結果。 我們要哪一個? 或者也許我們的意思是完全不同的實例。 關鍵是你需要知道。

取而代之的是:

AddressOf Bar

你需要這個:

AddressOf x.Bar

或者

AddressOf y.Bar

原始項目使用隱含的Me實例引用(在 C# 中為this )來管理它。 它有效是因為zipCallback()和使用它的代碼與AddressOf都在同一個 class 中,所以我們有一個隱含的實例。

目前尚不清楚問題中的代碼是否仍然如此。 如果zipCallback()方法已從項目中的Main類移至不同的類,則您需要知道您正在使用該類的哪個實例作為AddressOf語句的一部分。

為了完整起見,另一個選項是使用Module而不是Class VB代碼。 在這種情況下,等效的 C# 應該有一個static class並且該方法也應該標記為static (在 VB 中為Shared )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM