C#等效于VB'模块'

时间:2015-06-16 14:26:16

标签: c# vb.net module equivalent

在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移动到'设置',并在应用程序启动时重置它等,但请记住这是一个非常简单的例子来说明能够方便有一组全局代码。我发现这在过去最有用的地方是创建UserControls或自定义类。此外,目的不是使所有内容都可以全局访问,而是让某些方法和变量可以全局访问,而其他方法和变量只能从模块中访问。例如,虽然CheckModulus()Increment()(全局方法)都有权修改并获取iCount值,但iCount无法全局访问,就像使用{模块中私有定义的方法。

所以大腌菜是这样的:

  

C#到VB&的功能等效代码类型是什么? VB.NET的   module

由于这个简单问题的复杂性,我觉得我应该为“以防无答案”答案强加一个布尔值。

  

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

2 个答案:

答案 0 :(得分:8)

您可以使用static class。您也可以使用static constructor初始化这些内容。

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");

答案 1 :(得分:7)

这样的静态类将等同于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

A fiddle - 使用异步静态方法更新