C# Equivalent for VB 'module'

本文关键字:module VB Equivalent for | 更新日期: 2023-09-27 17:56:37

在Visual Basic中,您可以使用模块作为存储"松散"代码的位置,这些代码可以是可以从应用程序中的其他位置访问的方法和变量,而无需首先初始化某些内容,并且可以设置或更改变量状态,并将继续保持该值。

我发现的最接近的是 C# 中的静态方法作为公共类的一部分,但是这有一个缺点,即变量不可全局访问,或者如果变量是静态的,则内部可设置/获取。

以以下存储在空白模块中的 VB 中的简单代码为例。

Private iCount as Integer = 0
Public Sub Increment()
  iCount = iCount + 1
End Sub
Public CheckModulus() As Boolean
  If iCount % 6 == 0 Then
    Return True
  Else
    Return False
  End If
End Sub

现在,您有一个类,然后您可以从该类中调用CheckModulus()

Public Class Fruits
   Public Static Function ExactBunches() As String
      If CheckModulus() Then
         Return "You have an exact amount of bunches"
      Else
         Return "You need more fruits to make a bunch"
      End If
   End Function
End Class

现在我意识到通过一些黑客和斜杠,您可以将iCount移动到"设置",并在应用程序启动时重置它等,但请记住,这是一个非常简单的示例,以说明能够拥有一组全局代码的便利性。 我发现这在过去最有用的地方是在创建用户控件或自定义类时。 此外,目的不是使所有内容都可以全局访问,而是使某些方法和变量全局可访问,而其他方法和变量只能从模块内访问。 例如,虽然CheckModulus()Increment()(全局方法)都可以修改和获取iCount值,但iCount不能全局访问,就像模块中的私有定义方法一样。

所以大泡菜是这样的:

C#中与VB和VB的功能等效代码类型是什么?网的 module

由于这个简单问题的复杂性,我觉得我应该为"以防万一没有答案"的答案强加一个布尔值,如下所示。

如果,没有什么功能等价物,那么什么样的聪明 黑客或解决方法(除了使用设置或外部存储 如注册表、数据库、文件等),以实现这一目标或 非常非常接近的东西?

C# Equivalent for VB 'module'

您可以使用静态类。还可以使用静态构造函数初始化这些。

public static class MyStuff
{
    //A property
    public static string SomeVariable { get; set; }
    public static List<string> SomeListOfStuff { get; set; }
    //Init your variables in here:
    static MyStuff()
    {
        SomeVariable = "blah";
        SomeListOfStuff = new List<string>();
    }
    public static async Task<string> DoAThing()
    {
        //Do your async stuff in here
    }
}

并像这样访问它:

MyStuff.SomeVariable = "hello";
MyStuff.SomeListOfStuff.Add("another item for the list");

像这样的静态类等效于你的VB代码:

public static class MyModule
{
    private static int iCount = 0;   // this is private, so not accessible outside this class
    public static void Increment()
    {
        iCount++;
    }
    public static bool CheckModulus()
    {
        return iCount % 6 == 0;
    }
    // this part in response to the question about async methods
    // not part of the original module
    public async static Task<int> GetIntAsync()
    {
        using (var ms = new MemoryStream(Encoding.ASCII.GetBytes("foo"))) 
        {
            var buffer = new byte[10];
            var count = await ms.ReadAsync(buffer, 0, 3);
            return count;
        }
    }
}

然后你可以这样称呼它(iCount的值确实会持续存在,因为它是静态的):

    // iCount starts at 0
    Console.WriteLine(MyModule.CheckModulus());   // true because 0 % 6 == 0
    MyModule.Increment();                         // iCount == 1
    Console.WriteLine(MyModule.CheckModulus());   // false
    MyModule.Increment();                         // 2
    MyModule.Increment();                         // 3
    MyModule.Increment();                         // 4
    MyModule.Increment();                         // 5
    MyModule.Increment();                         // 6
    Console.WriteLine(MyModule.CheckModulus());   // true because 6 % 6 == 0
    Console.WriteLine(MyModule.GetIntAsync().Result);   // 3

小提琴 - 使用异步静态方法更新