【问题标题】:Using Classes in a Dictionary in Classic ASP在经典 ASP 中使用字典中的类
【发布时间】:2009-11-13 19:12:44
【问题描述】:

我通常使用 C#,但继承了一个经典的 ASP 项目。

我已经定义了一个类:

    Class clsPayment    
        Public Name
    End Class

Set objPayment = New clsPayment
objPayment.Name = "StackOverflow payment"    

还有一本字典:

Set colPayments = CreateObject("Scripting.Dictionary")
colPayments.Add 1, objPayment 

稍后读取对象时,我无法调用公共字段:

For i = 0 to colPayments.Count - 1
    objPayment = colPayments.Item(i)
    Response.Write(objPayment.Name)
Next    

这会在 Response.Write 行引发错误:

Microsoft VBScript 运行时错误 '800a01a8'

需要对象:''

我做错了什么?

【问题讨论】:

    标签: asp-classic vbscript dictionary


    【解决方案1】:

    将你的 for 循环更改为:-

    For Each key in colPayments
        Set objPayment = colPayments(key)
        Response.Write objPayment.Name
    Next
    

    有几点需要指出。

    使用 Set 分配对象。在 VBScript 中,当将对象分配给变量时,必须使用上述 Set 关键字。

    字典不是真正的集合 您似乎试图将字典用作序数集合,但事实并非如此。 Scripting 字典严格来说是一个关联数组,没有可靠的顺序。与对象上的 .NET Dictionary For Each 不同,它返回仅使用的键的枚举,而不是 KeyValue 对..

    在使用过程语句时避免使用括号请注意,对 Response.Write 的调用缺少括号。虽然当只有一个参数(将其解释为表达式)时您经常会看到这些成功使用,但当需要 2 个或更多参数时会出现语法错误。

    【讨论】:

    • 或者你可以有一个很好的按值传递副作用,当调用一个带有 call MySyb(p1,p2) 的过程时,我多么怀念 VBScript 的乐趣......
    • 带有 JScript 的 ASP 让这件事变得更容易,如果你来自 C#,它应该是一个更好的交换:)
    • 谢谢。我假设第一行必须是 'For Each key in colPayments.Keys' ?而且我没有使用序数,只是字典需要一个键。
    • “使用过程语句时避免使用括号”也很好
    • 如果您需要 List 实现,您可以在经典 ASP 中使用 .net 框架中的“system.collection.arraylist”对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多