gpt4 book ai didi

vb.net - 模块真的与 SharedMembers-NotInheritable-PrivateNew 类相同吗?

转载 作者:行者123 更新时间:2023-12-04 14:38:07 29 4
gpt4 key购买 nike

我可以在 Internet 上读到很多关于 VB.Net 模块与 c#.Net 静态类相同的信息。我还可以读到接近 Static Class 的内容是一个看起来像这样的类:

'NotInheritable so that no other class can be derived from it
Public NotInheritable Class MyAlmostStaticClass

'Private Creator so that it cannot be instantiated
Private Sub New()
End Sub

'Shared Members
Public Shared Function MyStaticFunction() as String
Return "Something"
End Function

End Class

我发现这段代码很容易起草和阅读。使用 Module 会更舒服像这样:
Public Module MyEquivalentStaticClass
Public Function MyStaticFunction() as String
Return "Something"
End Function
End Module

但是,使用 Module你失去了一级 Namespace层次结构,以下 3 个语句是相等的:
'Call through the Class Name is compulsory
Dim MyVar as String = Global.MyProject.MyAlmostStaticClass.MyStaticFunction()

'Call through the Module Name is OPTIONAL
Dim MyVar as String = Global.MyProject.MyEquivalentStaticClass.MyStaticFunction()
Dim MyVar as String = Global.MyProject.MyStaticFunction()

我觉得这很不方便,这要么会污染 Intelisense,要么会迫使我创建额外的 Namespace 级别。 ,这意味着更多 Module声明,即更多的 Intelisense 污染。

如果您想避免繁重的 SharedMembers-NotInheritable-PrivateNew Class,是否有解决方法或者这是要付出的代价?宣言?

其他引用资料包括 Cody Gray 的非常好的帖子: https://stackoverflow.com/a/39256196/10794555

最佳答案

不,在 VB.NET 中没有与 C# 静态类完全等价的东西。如果 VB 能够添加 Shared,那就太好了。类声明的修饰符,如下所示:

Public Shared Class Test  ' This won't work, so don't try it
' Compiler only allows shared members in here
End Class

但是,不幸的是,事实并非如此。如果你这样做,编译器会给你以下错误:

Classes cannot be declared 'Shared'



这给我们留下了您列出的两个选项:
  • 要么创建一个仅包含 Shared 的不可实例化类成员(编译器不强制执行该规则的安全性),或
  • 使用 Module , 这使得一切 Shared ,即使您没有通过 Shared 明确表示修饰符

  • 正如您所说,许多人不喜欢丢失所需的类名,作为一种额外的命名空间层,所以他们更喜欢 Class只有 Shared成员(member)超过 Module .但是,这是一个偏好问题。

    值得注意的是,虽然您不必在调用其成员的任何地方指定模块名称,但如果您愿意,您可以随时这样做:
    MyModule.MyMethod()

    虽然“SharedMembers-NotInheritable-PrivateNew 类”,正如您所说的那样,是最接近静态类的,但它只是在功能上等效。如果你使用反射,你会看到类型的属性是不一样的。例如,在 VB 中:
    Module MyModule
    Public Sub Main()
    Dim t As Type = GetType(MyClass)
    End Sub
    End Module

    Public NotInheritable Class MyClass
    Private Sub New()
    End Sub

    Public Shared Sub MyMethod()
    End Sub
    End Class

    如果你看看 t.Attributes , 你会看到它等于 Public Or Sealed .所以 MyClass类型既是密封的( NotInheritable )又是公共(public)的。但是,如果您在 C# 中执行此操作:
    class Program
    {
    static void Main(string[] args)
    {
    Type t = typeof(Test);
    }
    }

    public static class MyClass
    {
    public static void MyMethod()
    { }
    }

    然后您检查 t.Attributes再次,这一次,值为 Public | Abstract | Sealed | BeforeFieldInit .那不一样。由于您不能在 VB 中将一个类声明为 NotInheritableMustInherit同时,你没有机会完全复制那个东西。因此,尽管它们或多或少是等价的,但类型的属性是不同的。现在,只是为了好玩,让我们试试这个:
    Module MyModule
    Public Sub Main()
    Dim t As Type = GetType(MyModule)
    End Sub
    End Module

    现在, t.Attributes模块为 Sealed .就是这样。只需 Sealed .所以这也不一样。在 VB 中获得一个真正的静态类(意味着通过反射检查时该类型具有相同的属性)的唯一方法是将其编写在 C# 类库中,然后在 VB 中引用该库。

    关于vb.net - 模块真的与 SharedMembers-NotInheritable-PrivateNew 类相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54691197/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com