我应该如何在多个项目之间保持可见?

时间:2012-07-23 23:39:14

标签: vb6 const constants global

我有一个项目为其他人提供服务,提供此服务的方法的返回值是String。在该项目中,我使用一些命名常量来表示返回的特殊带外值,以代替预期或可恢复的错误,否则服务返回XML字符串。

如下所示:

' modService.bas
const SERVICE_BADARG as String = "Unsupported argument."
const SERVICE_TOOMANY as String = "Too many Foos."

' cServiceProvider.cls
Private Function GetXMLString() as String
' generate and return XML string holding all sorts of generic stuff
End Function

Public Function PerformService(argument as String) as String
' do some stuff
If (some_condition = true) Then
    PerformService = SERVICE_BADARG
Else If (some_other_condition = true) Then
    PerformService = SERVICE_TOOMANY
Else
    PerformService = GetXMLString()

我希望能够从其他项目中获得这些常量,而无需冗余地定义它们。如果可能的话,我也想避免把它们放在课堂上(不必要地复制它们),并避免为每个人制作一个属性。

它们都是常数,它们都没有变化。

3 个答案:

答案 0 :(得分:2)

为什么不在CONSTANTS.BAS模块中定义常量,然后在每个项目中包含它?这样,对于VB来说,看起来似乎是重复的定义,但从您作为开发人员和维护程序员的角度来看,这些定义都将在一个地方收集?

另一种选择是创建一个定义常量的DLL,但是这会使得在所有代码中使用这些常量的值更加昂贵,因为不是直接编译到目标代码中,而是必须检索它们从调用外部DLL。对于那些真正不变的东西来说,这似乎有些过分。

考虑“常量”值不一定与“只读”值相同。一个常量值,比如pi,永远不会改变,所以复制这些值真的没什么可失去的。你永远不需要重新进入并改变它们。只读值(如错误消息字符串)可能会更改,因此它们不是真正的常量。将它们放入DLL中可能是有意义的。特别是因为当您尝试做的所有事情都显示错误消息时,性能并不是那么重要。

答案 1 :(得分:1)

不幸的是,VB没有提供将常量嵌入到DLL中以便编译时使用的机制。您必须返回属性,正如您所说,您不想这样做。

我肯定会使用BAS路线,除非有理由反对它。另一种方法是创建一个类型库,并在那里定义字符串常量。为此,您必须学习ODL,并使用VB6附带的MkTypeLib.exe程序。或者,如果你以某种方式访问​​Matt Curland的“Advanced Visual Basic 6.0”,那么有一个工具可以让你创建类型库。

答案 2 :(得分:0)

我知道这是旧的,但万一有人还在想...... 尝试这种模式:

Public Function SERVICE_BADARG() As String
    SERVICE_BADARG = "Unsupported argument."
End Function
Public Function SERVICE_TOOMANY() As String
    SERVICE_TOOMANY = "Too many Foos."
End Function

或者更紧凑地使用冒号将东西放在同一条线上:

Public Function SERVICE_BADARG() As String: SERVICE_BADARG = "Unsupported argument.": End Function
Public Function SERVICE_TOOMANY() As String: SERVICE_TOOMANY = "Too many Foos.": End Function

你可以看到一个常量作为一个没有参数的函数。优点是函数可以是公共的,因此您不必创建DLL。它也只能在其他函数之前声明它们。 VB6允许你隐藏括号:

x = "error: " & SERVICE_TOOMANY

Select Case y
    Case SERVICE_BADARG
        z = "error: y is a bad arg"
    Case SERVICE_TOOMANY
        z = "error: y is too many"
End Select

缺点是开销有点小,但这通常可以忽略不计