如何从 C# 中的方法 return 等效于 VB6 变体类型
How to return the equivalent of a VB6 Variant type from a method in C#
我有一个较旧的 VB6 应用程序,它具有 RunReturningVAR 函数,它是一个数据库调用,可以 return 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
VB6 Variant
(Can't believe I've found that link!) translates 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
是一种特定于
late-binding,它可以容纳引用类型和值类型——不像 c# object
只能通过装箱容纳值类型。
请注意,使用 dynamic
意味着您绕过了所有编译时类型检查,这可能会导致 运行 时间错误,您通常不会从 c# 程序中预料到。
也许您可以使用泛型做得更好,但这需要您从调用方法中指定 return 类型:
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
}
此外,对于 public class 中的 public 方法,我 强烈建议不要在 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);
}
等等。
我有一个较旧的 VB6 应用程序,它具有 RunReturningVAR 函数,它是一个数据库调用,可以 return 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
VB6 Variant
(Can't believe I've found that link!) translates 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
是一种特定于
late-binding,它可以容纳引用类型和值类型——不像 c# object
只能通过装箱容纳值类型。
请注意,使用 dynamic
意味着您绕过了所有编译时类型检查,这可能会导致 运行 时间错误,您通常不会从 c# 程序中预料到。
也许您可以使用泛型做得更好,但这需要您从调用方法中指定 return 类型:
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
}
此外,对于 public class 中的 public 方法,我 强烈建议不要在 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);
}
等等。