在VB.NET中使用模块被认为是不好的做法吗?

时间:2011-06-07 12:27:12

标签: .net vb.net module

在设计新应用程序的过程中,我想知道使用具有属性的模块是否被认为是一种不好的做法。

一些示例代码:

Module modSettings

   public property Setting1 as string

   public property DatabaseObject as IDatabaseObject

End Module

上面的代码只是一个强调我的问题的例子。过去,这种结构在VB6中使用了很多。在过去,我在.NET项目中也使用它。

但是现在有了依赖注入,可测试性和关注点分离等流行语,上面的结构闻起来很糟糕。我无法真实地描述为什么,但它只是感觉不对。我必须承认我对上面的关键词不是很熟悉。

所以我想知道上面的代码是否真的 是一种不好的做法。如果是这样,您会使用Module来获取什么?

4 个答案:

答案 0 :(得分:9)

Centro是正确的,模块(或具有共享成员的NotInheritable类)是 最接近等效于C#静态类。从技术上讲,它没有任何问题,因为它只是VB创建这种类的方法之一。例如,您不能在VB中说Public Shared Class Settings,因为您无法在类上放置Shared关键字。

如果特定情况需要一个模块,我自己不会称之为不好的做法,但是否则模块(或其他静态类等价物)可能不是您想要的松散耦合,可测试代码的设计选择。此外,虽然具有共享成员的NotInheritable类比描述模块更具描述性,但至少有一种情况必须使用模块。

您何时需要在VB.Net中使用模块?如果你想利用extension methods,那么这是你唯一的选择,因为如上所述,你不能在VB.Net中创建一个共享(静态)类,你也不能在NotInheritable Classes上使用扩展。您必须按如下方式使用模块:

Imports System.Runtime.CompilerServices

Public Module StringExtensions
    <Extension()> _
    Public Function Remove( _
                        ByVal input As String, _
                        ByVal subStrings As String()) As String
        Return String.Join("", input.Split(subStrings, StringSplitOptions.None)).Trim()
    End Function
End Module

在C#中,您不能使用模块,必须使用如下静态类:

public static class StringExtensions
{
    public string Remove(this string input, string[] subStrings)
    {
        return string.Join("", input.Split(subStrings, StringSplitOptions.None)).Trim();
    }
}   

答案 1 :(得分:3)

VB.NET中的关键字 Module 来自VB 6.实际上它被编译为 NotInheritable Class ,使所有成员都是静态的,在C#中它是密封类与静态成员。

我认为这是一个不好的做法,因为它不太清楚它实际上是一个有静态成员的类。

答案 2 :(得分:1)

属性没有问题。实际上,要实现绑定,您需要属性并实现INotifyPropertyChanged接口。我想我更喜欢课程而不是模块,但我主要是C#。

答案 3 :(得分:1)

虽然有可能这样做但我必须承认我从未在实践中看到它。在我看来,它更容易在类中读取,因为这个声明是显式的,并且使用类允许您在以后需要时转换为类。所以我想不出你为什么要在一个有共享成员的班级上做这个的原因