模块是否仍常用于程序结构?

时间:2010-08-18 14:11:10

标签: vb.net module

我不是一个程序设计师,但我真的想开始更好地掌握如何做到这一点,并更好地理解.NET语言(VB,C#)。我正在阅读Wrox - Professional Visual Basic 2008的一本书。在其中我相信它提到模块正慢慢存在。我可以看到为什么大多数编码会进入一个类对象,但我会假设模块总是必须至少保持代码清洁。

有人可以为我澄清一下吗?此外,我一直在寻找一个很好的软件设计来源,但我似乎无法找到最新出版的书籍。我可能会在错误的地方寻找,但我真的想亲自动手。

谢谢。

4 个答案:

答案 0 :(得分:4)

虽然一般来说它们不太适合OOP,但它们仍在使用,在某些情况下是必需的。

在VB.Net中,如果你想编写扩展方法,你将不得不使用一个模块 - 编译器只允许在一个模块中定义扩展方法。

你当然可以不使用模块 - 一个带有私有构造函数的非可继承类,除了共享方法之外什么都不会像模块那样实现。

就像编程中的所有东西(以及许多其他东西)一样,它们都有它们的用途,只要它们没有被错过使用,它们就没有问题。适合工作的正确工具!

答案 1 :(得分:3)

VB.NET中的Module关键字主要用于与VB6及更早版本的兼容性。那时候,大多数VB代码都是程序化的,具有独立的非类子和函数。该语言在VB4附近获得了Class关键字。在OOP意义上不是真正的类,它不支持继承。基础COM体系结构中缺少的功能。

它与CLR提供的执行模型不太匹配。不支持自由函数,每个方法都必须是类的成员。 VB.NET编译器通过声明一个类来模拟模块,模块程序成为该类的共享方法。你可以用Ildasm.exe看到这个:

.class private auto ansi sealed ConsoleApplication1.Module1
       extends [mscorlib]System.Object
{
  .custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute::.ctor() = ( 01 00 00 00 ) 
} // end of class ConsoleApplication1.Module1

请注意它是如何私有的,因此代码无法获取对它的引用和密封,因此没有代码可以从模块派生类。

C#编译器使用“静态类”执行完全相同的操作,CLR也没有静态类的概念。静态类有很多充分的理由,“模块”的概念并不过时。您可以通过在VB.NET代码中声明一个NotInheritable类来完成相同的操作,只使用Shared方法。但是,VB.NET编译器不像C#编译器那样强制执行共享方法,也不允许您将类声明为private。因此,模块就可以了。

答案 2 :(得分:0)

模块是VB与静态类最接近的东西,即使在面向对象的环境中编程也非常有用。

由于VB没有静态类,因此我知道模块是创建扩展方法的唯一方法。

答案 3 :(得分:0)

您需要模块才能定义自己的Extension methods