[英]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.