传递对象字段ByRef会导致它被设置,即使它没有被改变

时间:2014-10-20 18:59:47

标签: vb.net

在.NET中使用第三方API。他们的API没有很好地处理DBNull,所以我创建了一个名为" SetStringValue"的小辅助函数。看起来像这样:

Public Sub SetStringField(ByRef _DestinationField As Object, ByVal _Value As Object)
    If Not TypeOf _Value Is DBNull Then
        _DestinationField = _Value
    End If
End Sub

在我的主要代码中,我有这样的一行:

SetStringField(SomeAPIObject.Fields(SOME_FIELD_ENUM), DataRow.Item("SourceValue"))

如果您在访问DBNull时遵循代码流,它将永远不会运行该行:

_DestinationField = _Value

然而," SomeAPIObject"虽然我从未这样做过,但据报道这个领域已经确定并且很脏。它就像.NET一样用原始值设置传递的参数,因为我将它作为参考传递。

这是预期的吗?有什么办法可以避免吗?

1 个答案:

答案 0 :(得分:2)

可能是apiObject.Fields(...)召唤是什么让你的物体变成脏,脏,脏,脏,肮脏的物体?

重写你的功能:

Public Sub SetStringField(o as Øbject, e as Enüm, v As Øbject)
    If Not TypeOf v Is DBNull Then
        o.Fields(e) = v
    End If
End Sub

然后称之为:

SetStringField(SomeAPIObject, SOME_FIELD_ENUM, DataRow.Item("SourceValue"))

或者一些垃圾。更多变形虫。