2012-06-19 75 views
3

我試圖將一些VB.net代碼轉換成C#,並試圖將這一行轉換出現問題。'Microsoft.Win32.Registry'是一個'類型',但像'變量'一樣使用

VB.NET

Dim myreg As Microsoft.Win32.Registry 

我知道這是一個靜態的,所以我不能創建一個實例,但是當我嘗試了VB.NET轉換爲C#的網站給了我這樣的:

Microsoft.Win32.Registry myreg = null; 

並給了我一個錯誤消息:'Microsoft.Win32.Registry'是'類型',但像'變量'一樣使用

在VB.NET函數的最後一部分,使用了myreg:

Finally 
    myreg = Nothing 
End Try 

這裏的整體功能:

Imports System.Data.OleDb 
Imports System.Data 
Imports Microsoft.Win32.RegistryKey 
Imports MyLogger 'custom reference, not worried about this. 

Private Function getRegistryString(ByVal sVal As String, Optional ByVal sKey As String = "") As String 
    Dim myreg As Microsoft.Win32.Registry 
    Dim s As String 
    Try 
     s = myreg.LocalMachine.OpenSubKey(sKey).GetValue(sVal) 
    Catch ex As Exception 
     l.EventLog(ex.Message, EventLogEntryType.Error) 
     Throw ex 
    Finally 
     myreg = Nothing 
    End Try 
    Return s 
    s = Nothing 
End Function 
+0

是那些只引用?你能提供更多關於你如何使用代碼的信息嗎?這裏是.NET註冊表類的頁面:http://msdn.microsoft.com/en-us/library/microsoft.win32.registry%28v=vs.71%29 – Wug

+1

你從哪裏得到VB代碼?這很奇怪,至少說*非常*。 –

+0

是的,它是一個前同事代碼,大聲笑 – nhat

回答

4

在VB.NET中,沒有辦法定義共享的(靜態)類。但是,在C#中,您可以指定一個類是靜態的。當一個類是靜態的時候,它強制所有的成員都是靜態的。如果你試圖聲明一個靜態類型的變量,編譯器會給你一個錯誤。

然而,在VB中,由於沒有共享類這樣的東西,它總是允許你聲明任何類型的變量,即使它完全沒有意義,因爲該實例沒有成員。

而不是聲明變量作爲類型Registry,您需要更改代碼以簡單地使用Registry類名稱本身。將該變量設置爲Nothing是沒有意義的,因爲該變量從不存儲對對象的引用。它始終是Nothing

你的函數應該這樣寫:

Private Function getRegistryString(ByVal sVal As String, Optional ByVal sKey As String = "") As String 
    Dim s As String 
    Try 
     s = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey).GetValue(sVal) 
    Catch ex As Exception 
     l.EventLog(ex.Message, EventLogEntryType.Error) 
     Throw ex 
    End Try 
    Return s 
End Function 
4

Microsoft.Win32.Registry是一個靜態類,所以你不能實例化。

http://msdn.microsoft.com/library/microsoft.win32.registry.aspx

編輯:應該是一個評論,而不是答案。我對這個網站還是很抱歉。

+0

所以在VB.NET中它可以實例化,但在C#中它不能?如果是這樣的話,有沒有辦法將「最後myreg = Nothing End Try」轉換爲C#? – nhat

+0

@nhat'static'(對於VB.NET中的方法來說是'Shared')或多或少地暗示編譯器可以防止這種類型的錯誤。你的VB.NET代碼並不真正有效,因爲沒有必要只用靜態方法創建一個類的實例(然後不需要「清除」該變量)。 'static'在VB.NET中被簡單地翻譯爲'NotInheritable',所以即使你可以創建一個這種類型的實例(因爲編譯器沒有發出私有構造函數),這是非常沒用的。 –

相關問題