【问题标题】:How to return the equivalent of a VB6 Variant type from a method in C#如何从 C# 中的方法返回等效的 VB6 Variant 类型
【发布时间】:2018-10-07 06:03:55
【问题描述】:

我有一个较旧的 VB6 应用程序,它有一个函数 RunReturningVAR,它是一个 db 调用,可以返回一个 intstringdouble..... 但不是一个 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

【问题讨论】:

  • 没有附加任何内容,但您可以返回一个object,这是一个变体。
  • 对不起,我的问题是
  • 为什么,哦,为什么,这是标记为 c# 的?
  • @rory.ap 你读过这个问题吗?
  • @rory.ap 是的,他们只说过一次他们正在尝试将 VB 代码写入 C#。为什么他们需要说不止一次?

标签: c# vb6 variant


【解决方案1】:

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,但Variant 是特定于 后期绑定,它可以保存引用类型和值类型 - 不像 c# object 只能通过装箱来保存值类型。

请注意,使用 dynamic 意味着您绕过所有编译时类型检查,这可能会导致您通常不会从 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);
}

等等。

【讨论】:

  • C#处理可选参数的方式很有意思
  • 亲爱的投票者:您能否发表评论,说明我的回答有什么问题?
  • 哇,非常感谢您提供有关可选的信息。我不知道。
  • @LeeHopkins 我认为很多开发人员并不知道这一点。在我使用 c# 的第一年,我对此一无所知,我只是偶然看到它在 stackoverflow 上进行了解释(但不记得那是很久以前的事了)。所以我觉得更多的人应该知道这一点,如果我回答有关具有可选参数的代码的问题,我确实会提到这一点(但大多数时候,更简单)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多