Vb.net 作用域、命名空间和文件体系结构

Vb.net 作用域、命名空间和文件体系结构,vb.net,Vb.net,我正在开发一个VisualStudio项目,该应用程序可以细分为3个部分。 每个部分的行为独立于其他部分。每个部分都将包含自己的.vb文件集,其中包括模块(如静态类)、类和变量(理想情况下为该部分级别的“全局”变量) 组织.vb文件的最佳做法是什么 从架构上讲,Main模块(文件='Main.vb')将通过调用节模块(例如'SectionA.vb'中的节a')按需调用3个节中的一个。然后本节aModule将调用其他.vb文件中包含的其他模块或类,这些模块或类将存储在单独的文件夹中 我们会有类似于

我正在开发一个VisualStudio项目,该应用程序可以细分为3个部分。 每个部分的行为独立于其他部分。每个部分都将包含自己的.vb文件集,其中包括模块(如
静态
类)、类和变量(理想情况下为该部分级别的“全局”变量)

组织.vb文件的最佳做法是什么

从架构上讲,Main
模块
(文件='Main.vb')将通过调用节
模块
(例如'SectionA.vb'中的节a')按需调用3个节中的一个。然后本节a
Module
将调用其他.vb文件中包含的其他模块或类,这些模块或类将存储在单独的文件夹中

我们会有类似于:

  • Main.vb(包含主
    模块
  • SectionA.vb(包含SectionA
    模块
  • SectionB.vb(包含SectionB
    模块
  • SectionC.vb(包含SectionC
    模块
  • 节A/ClassA1.vb(包含ClassA1
    Class
  • 第A节/ModuleA2.vb(包含其他内容)
  • B节/ClassB1.vb(包含内容)
  • 等等
  • 如何确保文件夹“SectionA”中包含的任何内容只能由SectionA
    模块访问?这相当于将“SectionA”文件夹的所有块封装在SectionA
    模块中,并设置为
    Private
    。但是,我确实喜欢跨多个文件(每个文件或多或少有一个类)使用源代码的灵活性

    到目前为止,我使用
    名称空间
    来组织事情,但这并不能解决范围问题:“SectionA”文件夹的任何
    公共子文件夹
    都可以从任何项目文件中访问。我还尝试在名称空间中将模块(模块、类)声明设置为
    Private
    ,但看起来这是禁止的

    见下文:

    文件Main.vb

    Module MainModule
        Sub Main()
            Select Case UserChoice
                Case ChoseA1
                    Call SectionA.DoThings()
                Case ChoseA2
                    Call SectionA.DoOtherThings()
                Case ChoseB
                    Call SectionB
                Case ChoseC
                    Call SectionC
            End Select
        End Sub
    End Module
    
    Namespace SectionA
        Module Main
            Private MySectionPrivateVariable
            Sub DoThings()
                Dim OneClass As New ClassA1
                Call DoMoreThings()
            End Sub
            Sub DoOtherThings()
                '...
            End Sub
        End Module
    End Namespace
    
    Namespace SectionB
        Module Main
            Private MySectionPrivateVariable
            Sub DoManyThings()
                '...
                'Problem: Can access SectionA.ClassA1
                'Problem: Can access SectionA.DoMoreThings()
            End Sub
        End Module
    End Namespace
    
    文件SectionA.vb

    Module MainModule
        Sub Main()
            Select Case UserChoice
                Case ChoseA1
                    Call SectionA.DoThings()
                Case ChoseA2
                    Call SectionA.DoOtherThings()
                Case ChoseB
                    Call SectionB
                Case ChoseC
                    Call SectionC
            End Select
        End Sub
    End Module
    
    Namespace SectionA
        Module Main
            Private MySectionPrivateVariable
            Sub DoThings()
                Dim OneClass As New ClassA1
                Call DoMoreThings()
            End Sub
            Sub DoOtherThings()
                '...
            End Sub
        End Module
    End Namespace
    
    Namespace SectionB
        Module Main
            Private MySectionPrivateVariable
            Sub DoManyThings()
                '...
                'Problem: Can access SectionA.ClassA1
                'Problem: Can access SectionA.DoMoreThings()
            End Sub
        End Module
    End Namespace
    
    SectionA文件夹中的帮助文件

    Namespace SectionA
        Module SectionA1
            Private MyModulePrivateVariable
            Sub DoMoreThings()
                '...
                'Problem: Cannot access SectionA.MySectionPrivateVariable
            End Sub
        End Module
    
        Public Class ClassA1
            '...
        End Class
    End Namespace
    
    文件节b.vb

    Module MainModule
        Sub Main()
            Select Case UserChoice
                Case ChoseA1
                    Call SectionA.DoThings()
                Case ChoseA2
                    Call SectionA.DoOtherThings()
                Case ChoseB
                    Call SectionB
                Case ChoseC
                    Call SectionC
            End Select
        End Sub
    End Module
    
    Namespace SectionA
        Module Main
            Private MySectionPrivateVariable
            Sub DoThings()
                Dim OneClass As New ClassA1
                Call DoMoreThings()
            End Sub
            Sub DoOtherThings()
                '...
            End Sub
        End Module
    End Namespace
    
    Namespace SectionB
        Module Main
            Private MySectionPrivateVariable
            Sub DoManyThings()
                '...
                'Problem: Can access SectionA.ClassA1
                'Problem: Can access SectionA.DoMoreThings()
            End Sub
        End Module
    End Namespace
    

    解决此问题的最简单方法是将应用程序拆分为多个项目(每个“部分”对应一个项目)。使每个项目都成为具有自己名称空间的类库项目(我建议将项目命名为与名称空间相同的名称),然后让主项目通过项目引用引用所有类库项目(与DLL文件引用相反)。一旦他们在自己的项目中,您就可以通过将内容设置为
    Friend
    来控制可访问性

    或者,您可以将所有助手类型嵌套在模块中,然后将可访问性设置为
    Private
    ,但这可能很快就会变得混乱:

    Namespace SectionA
        Module Main
            Sub DoThings()
                Dim OneClass As New ClassA1
                ' ...
            End Sub
    
            Private Class ClassA1
                ' ...
            End Class
        End Module
    End Namespace
    

    不,那是不对的。你当然可以这样做,但你不需要,我也不会建议你这样做。您需要将类库项目添加到与主项目(启动项目)相同的解决方案中。然后,您可以通过引用项目(而不是引用预编译的dll文件)来引用这些库。当您构建解决方案时,VisualStudio将首先自动构建所有依赖项项目,然后将输出dll文件复制到主项目的输出文件夹中。到目前为止听起来不错。只要它引用该项目,并且该项目中的类是公共的,那么它就应该可以工作。剩下的唯一问题是名称空间。如果该类位于不同的名称空间中,则显然需要使用名称空间完全限定类名,或者在文件顶部导入名称空间。正确,它默认名称空间为您调用项目的名称空间。如果您转到
    My Project
    应用程序
    ,则会有一个
    根命名空间
    设置,为项目中的所有代码设置顶级命名空间(除非您手动使用
    全局
    关键字覆盖它,例如
    命名空间全局.myManuallyOverridentoLevel命名空间
    )。抱歉,我不知道有什么好的。我做了一个快速的搜索,也没有发现什么好消息。对于任何阅读的人来说,还有一个信息来源,从2008年开始: