我正在尝试将一些VB.net代码转换为C#,并且在尝试转换这一行时遇到问题。
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 :(得分:4)
Microsoft.Win32.Registry
是一个静态类,因此您无法实例化它。
http://msdn.microsoft.com/library/microsoft.win32.registry.aspx
编辑:应该是评论而不是答案。我还是这个网站的新手抱歉。
答案 1 :(得分: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