2012-06-19 45 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',所以即使你可以创建一个这种类型的实例(因为编译器没有发出私有构造函数),这是非常没用的。 –

相关问题