2

我有一个项目为其他项目提供服务,提供该服务的方法的返回值为 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()

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

它们都是常数,它们都不会改变。

4

3 回答 3

2

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

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

考虑到“常量”值不一定与“只读”值相同。像 pi 这样的常数值永远不会改变,因此复制这些值并不会造成太大损失。您将永远不需要返回并更改它们。只读值(例如您的错误消息字符串)可能会更改,因此它们并不是真正的常量。将它们放入 DLL 中可能是有意义的。特别是因为当您尝试做的所有事情都显示错误消息时,性能并不是那么重要。

于 2012-07-24T00:00:38.910 回答
1

不幸的是,VB 没有为您提供将常量嵌入到 DLL 中以供编译时使用的机制。正如你所说,你不想这样做,你将不得不归还房产。

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

于 2012-07-24T08:03:18.473 回答
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

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

于 2017-08-24T11:05:28.527 回答