我正在尝试将一些 VB.net 代码转换为 C#,但在尝试转换这一行时遇到了问题。

网络

Dim myreg As Microsoft.Win32.Registry

我知道它是静态的,所以我无法创建实例,但是当我尝试将 VB.NET 转换器转换为 C# 时,网站给了我这个:
Microsoft.Win32.Registry myreg = null;

并给我一条错误消息:“Microsoft.Win32.Registry”是一种“类型”,但用作“变量”

在VB.NET中Function的最后一部分,使用了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

最佳答案

在 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

关于c# - 'Microsoft.Win32.Registry' 是 'type',但像 'variable' 一样使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11106181/

10-12 12:44