【问题标题】:C# Equivalent for VB 'module'C# 等效于 VB '模块'
【发布时间】:2015-06-16 14:26:16
【问题描述】:

在 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.NET 的功能等效的代码类型是什么 module ?

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

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

【问题讨论】:

  • 您可以使用static class
  • 我在使用静态类时遇到的问题是可访问性级别。
  • 我现在很困惑。 “可预定义”是什么意思?另外,为什么要让变量保持不变!?
  • @SanuelJackson 你可以初始化它,看我的回答。

标签: c# vb.net module equivalent


【解决方案1】:

您可以使用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");

【讨论】:

  • 请注意,我尊重这个答案,我觉得结合这里的所有信息,我离至少一个解决方法越来越近了。例如,在内部范围内使用上述方法会起作用,但是仍然存在丢失其他功能的问题,例如 async 方法,因为如果在静态范围内它们必须是静态的,但它们不能是因为 C# 没有支持static async,甚至倒转async static,作为一个有问题的案例。
  • 是什么让你认为静态方法不能异步?我添加了一个示例。
  • 这真的很奇怪 XD .... 今天尝试在静态类中执行异步时,它实际上正在工作。它确实保持黑色,并且标准类或方法async 不存在,想要创建它大声笑....然后在表单上删除异步动词后它就消失了(测试类在同一个文件中) .必须看看,因为我知道这在过去给我带来了编译问题,但如果它确实有效,我不会抱怨。过去尝试这样做时编译失败是我相信这一点的原因。
【解决方案2】:

这样的静态类相当于您的 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 - 使用异步静态方法更新

【讨论】:

  • 如何将范围缩小到只有一组特定的调用类和 UserControls 可以访问?例如,我不希望从 Form1 访问它,但我希望从 UserControl 中访问它
  • 请注意,Static等同于 VB 中的模块。然而,有最接近他们的东西。
  • @SanuelJackson:您希望它是全球性的,但现在您希望它受到限制?您可以通过仔细定位静态类相对于打算访问它的类来限制它。例如,如果它是 internal 与您的 UserControls 的程序集,那么它将无法在外部访问。
  • 尽管如此,我并没有说这是一件好事 :-)
  • @SanuelJackson:不知道你从哪里得到这个想法。请参阅此更新的fiddle。我添加了一个async static 方法,它编译得很好。尽管如果您需要这么多静态类和静态方法,我再次建议您重新考虑您的设计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2021-09-15
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多