代码之家  ›  专栏  ›  技术社区  ›  Lee Hopkins

如何从C中的方法返回VB6变量类型的等效值#

  •  2
  • Lee Hopkins  · 技术社区  · 7 年前

    我有一个旧的VB6应用程序,它有一个函数RunReturningVAR。这是一个db调用,可以返回 int ,则, string ,则, double 。。。。。但不是 RecordSet 。它的构建非常通用,因此可以由多个其他函数调用,因此我们没有多个DB调用位置。 我目前拥有的是附件。

    Public Function RunReturningVar(ByVal vstrSql As String, _
    Optional ByVal connval As Boolean = False, _
    Optional ByVal copyID As Double = 0, _
    Optional ByVal corpVal As Boolean = False, _
    Optional ByVal vintConnectionTimeout As Integer = 30) As Variant
    
    1 回复  |  直到 7 年前
        1
  •  9
  •   Zohar Peled    7 年前

    VB6 Variant (真不敢相信我找到了那个链接!)翻译c# dynamic

    public dynamic RunReturningVar(
        string vstrSql, 
        bool connval = false,
        double copyID = 0,
        bool corpVal = false,
        int vintConnectionTimeout = 30) 
    {
        // do your stuff here 
    }
    

    几乎可以转化为 object 但是 变种 是特定于的数据类型 后期绑定,它可以保存引用类型和值类型-与c不同# 对象 只能通过装箱来保存值类型。

    请注意,使用 动态 意味着您绕过了所有编译时类型检查,这可能会导致c#程序通常不会出现的运行时错误。

    或许可以更好地使用泛型,但这需要您从调用方法中指定返回类型:

    public T RunReturningVar<T>(
        string vstrSql, 
        bool connval = false,
        double copyID = 0,
        bool corpVal = false,
        int vintConnectionTimeout = 30) where T : new()
    {
        // do your stuff here and return T
    }
    

    另外,对于公共类中的公共方法,我会 强烈建议不要使用可选参数 在c#中。
    使用方法重载指定默认值。 原因是可选参数在c#中的工作方式: 当调用带有可选参数的方法时,如果省略了可选参数,则会将其默认值编译到方法调用中。 因此,如果您从另一个程序集调用此方法,则忽略一些可选参数-如下所示:

    yourObjectReference.RunReturningVar(sql, true);
    

    c编译器实际上将其转换为:

    yourObjectReference.RunReturningVar(sql, true, 0, false, 30);
    

    这意味着,如果要更改任何参数的默认值,也应重新编译引用此参数的其他程序集。 因此,更好的选择是使用方法重载:

    public dynamic RunReturningVar(
        string vstrSql, 
        bool connval,
        double copyID,
        bool corpVal,
        int vintConnectionTimeout) 
    {
        // do your stuff here 
    }
    
    public dynamic RunReturningVar(
        string vstrSql, 
        bool connval,
        double copyID,
        bool corpVal
        ) 
    {
        return RunReturningVar(vstrSql, connval, copyID, corpVal, 30);
    }
    
    public dynamic RunReturningVar(
        string vstrSql, 
        bool connval,
        double copyID,
        ) 
    {
        return RunReturningVar(vstrSql, connval, copyID, false);
    }
    

    等等