3

我正在尝试将一些 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
4

2 回答 2

4

Microsoft.Win32.Registry是一个静态类,所以你不能实例化它。

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

编辑:应该是评论而不是答案。对不起,我还是这个网站的新手。

于 2012-06-19T17:36:20.280 回答
4

在 VB.NET 中,无法定义共享(静态)类。但是,在 C# 中,您可以指定一个类是静态的。当一个类是静态的时,它强制它的所有成员也是静态的。如果你试图声明一个静态类型的变量,编译器会给你一个错误。

然而,在 VB 中,由于没有共享类之类的东西,它总是允许您声明任何类型的变量,即使它完全没有意义,因为实例没有成员。

无需将变量声明为 type 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
于 2012-06-19T17:38:23.123 回答