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