Vb.net 需要帮助将C#翻译成VB吗

Vb.net 需要帮助将C#翻译成VB吗,vb.net,discord.net,c#-to-vb.net,Vb.net,Discord.net,C# To Vb.net,我需要帮助转换一些代码。主要是: private static void SetProvider(ServiceCollection collection) => _service = collection.BuildServiceProvider(); 和它下面的线。这将用于使用音乐库Victoria的discord.Net的discord bot。有人能告诉我这到底是什么吗?只是个附带问题。它使用静态类,在VB.Net上没有所谓的静态类,那么在这里最好的调用是什么呢?我在这

我需要帮助转换一些代码。主要是:

private static void SetProvider(ServiceCollection collection)
     => _service = collection.BuildServiceProvider();

和它下面的线。这将用于使用音乐库
Victoria
的discord.Net的discord bot。有人能告诉我这到底是什么吗?只是个附带问题。它使用静态类,在VB.Net上没有所谓的静态类,那么在这里最好的调用是什么呢?我在这里看到了一些其他帖子,讨论是使用
非遗传
类还是
模块
。区别是什么?什么时候最好使用其中一种?

等效的
VB.NET
是:

Private Shared Sub SetProvider(collection As ServiceCollection)
    _service = collection.BuildServiceProvider()
End Sub
C#表达式体只是一个表达式体方法,例如,以下是等效的:

void Greet()
{
    Console.WriteLine("Hello World");
}

// Same as above

void Greet() => Console.WriteLine("Hello World");

这取决于你到底想要什么。VB.NET不提供静态类。相反,它提供了模块,但这些模块并不完全等同于静态类

模块版本为:

Public Module ServiceManager
  Private _service As IServiceProvider

  Public Sub SetProvider(collection As ServiceCollection)
    _service = collection.BuildServiceProvider()
  End Sub

  Public Function GetService(Of T As New)() As T
    Return _service.GetRequiredService(Of T)()
  End Function
End Module
Public NotInheritable Class ServiceManager
  Private Sub New()
  End Sub

  Private Shared _service As IServiceProvider

  Public Shared Sub SetProvider(collection As ServiceCollection)
    _service = collection.BuildServiceProvider()
  End Sub

  Public Shared Function GetService(Of T As New)() As T
    Return _service.GetRequiredService(Of T)()
  End Function
End Class
课程版本为:

Public Module ServiceManager
  Private _service As IServiceProvider

  Public Sub SetProvider(collection As ServiceCollection)
    _service = collection.BuildServiceProvider()
  End Sub

  Public Function GetService(Of T As New)() As T
    Return _service.GetRequiredService(Of T)()
  End Function
End Module
Public NotInheritable Class ServiceManager
  Private Sub New()
  End Sub

  Private Shared _service As IServiceProvider

  Public Shared Sub SetProvider(collection As ServiceCollection)
    _service = collection.BuildServiceProvider()
  End Sub

  Public Shared Function GetService(Of T As New)() As T
    Return _service.GetRequiredService(Of T)()
  End Function
End Class
使用类实现时,必须小心将所有成员标记为共享的。此外,您可以考虑以下内容:

  • 将类声明为
    不可继承
    ,因为VB.NET模块和C#静态类都不能从中继承。(顺便说一句,对应的C#关键字是密封的,但它永远不会在这个上下文中使用,因为C#确实支持静态类。)
  • 为类创建一个私有(默认)构造函数。这将确保您无法实例化该类。VB.NET模块和C#静态类也不能实例化
使用VB.NET模块稍微简单一些,但请记住VB.NET模块有一点古怪。访问模块成员时,通常不需要在其前面加模块名。假设您有一个名为
MyService
的服务类,并且您已经将
ServiceManager
实现为一个模块。那么您不需要像这样称呼它:

Dim svc As MyService = ServiceManager.GetService(Of MyService)()
Dim svc As MyService = GetService(Of MyService)()`.
相反,你可以这样称呼它:

Dim svc As MyService = ServiceManager.GetService(Of MyService)()
Dim svc As MyService = GetService(Of MyService)()`.
当使用前一种方法时,VisualStudio实际上建议简化名称并将其更改为后一种方法。但是,当您随后添加另一个导入的名称空间时,该名称空间恰好包含具有
GetService(Of T)(
方法)的模块,您将得到一个错误,指示
GetService
不明确,在这种情况下,您将被迫使用模块名称作为前缀(与前一个方法类似)

我个人认为,在Visual Studio中,有关VB.NET模块成员使用情况的这种检查行为非常烦人和令人困惑。我更喜欢用模块名作为调用的前缀(为了编写自文档代码并避免前面提到的歧义),但我不想在VisualStudio中禁用“simplify name”提示/建议。因此,我个人更喜欢在VB.NET中实现类似C#静态类的东西时使用类实现而不是模块实现


或者更好:我会避免静态类设计,并在可能的情况下切换到“常规”类设计。使用类实例有几个优点,比如使用(这也是许多流行的行为设计模式中使用的一项重要技术)、简化模拟/单元测试,以及通常较少的副作用。

共享关键字尽可能接近您所能获得的Static@Hursey . . . 的确如此Shared与C#中的
static
相同。遗憾的是,不可能将
共享
添加到类本身;它只能添加到类成员中。(顺便说一句,VB.NET还提供了一个关键字,但它有完全不同的含义:它可以与类方法内的局部变量一起使用,并且它将在后续方法调用之间保留该变量的值。就我个人而言,我更愿意为此使用私有类变量,因为这样可以提供更多的控制。)非常感谢!对=>的含义有点困惑。在vb中转换时,另一行是什么样子的
publicstatict GetService(),其中T:new()
那会是
publicsubgetservice(Of T)(\u service.GetRequiredService(Of T)End Sub
或者它看起来会不同吗?
公共静态T GetService(),其中T:new()=>\u service.GetRequiredService()
相当于C#
公共静态T GetService(),其中T:new(){returnservice.GetRequiredService(T)}
所以在VB.NET中它相当于
函数GetService(T的新形式)()Return _service.GetRequiredService(T)End函数
这是一个
函数
,因为它需要返回与
子函数不同的内容欢迎使用,如果下一步有新问题,请打开新问题,如果这个答案解决了你原来的问题,那么请接受它,非常感谢!我绞尽脑汁想把它改过来。@kshkarin。回答得好。同样好的是,您添加了一个关于表情体成员的简短解释。我只能建议您在答案中添加翻译后的模板化的
GetService(Of T)(
方法(通过编辑),而不是将该信息放在注释中。这样,所有重要信息都包含在您的答案中。谢谢!
模块
不可继承类
之间有什么真正的区别吗?@SOPMOD。我已经更新了我的答案并添加了更多的信息。哇!谢谢,这很清楚,也很容易理解两者的区别/优点和缺点。@SOPMOD。不客气。:)