c# - 在 C# 中模拟可选 "out"参数的模式?

标签 c# optional-parameters out-parameters

我正在将一个 API 从 C 转换为 C#,其中一个函数分配了许多相关对象,其中一些是可选的。 C 版本接受几个指针参数,用于返回对象的整数句柄,调用者可以为某些指针传递 NULL 以避免分配这些对象:

void initialize(int *mainObjPtr, int *subObjPtr, int *anotherSubObjPtr);

initialize(&mainObj, &subObj, NULL);

对于 C# 版本,明显的翻译是使用 out 参数而不是指针:

public static void Initialize(out int mainObj, out int subObj,
    out int anotherSubObj);

...但这没有办法指出哪些对象是不需要的。是否有任何著名的 C# API 示例可以做我可以模仿的类似事情?如果没有,有什么建议吗?

最佳答案

好吧,您无论如何都不应该对对象使用 int - 它们应该是引用,即 out SomeMainType mainObj,out SomSubType subObj。完成后,您就可以使用重载,但这会很笨拙。

更好的方法是使用 3 个对象返回一些东西 - 一个自定义类型,或者在 .NET 4.0 中可能是一个元组。

类似于:

class InitializeResult {
    public SomeMainType MainObject {get;set;}
    public SomeSubType SubObject {get;set;}
    ...
}
public static InitializeResult Initialize() {...}

重新阅读它,看起来调用者也在 in 中传递数据(即使只是 null/not-null),所以 outnever 正确的选择。也许是标志枚举?

[Flags]
public enum InitializeOptions {
    None = 0, Main = 1, Sub = 2, Foo = 4, Bar = 8, ..
}

并调用:

var result = Initialize(InitializeOptions.Main | InitializeOptions.Sub);
var main = result.MainObject;
var sub = result.SubObject;

关于c# - 在 C# 中模拟可选 "out"参数的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3031464/

相关文章:

c# - 为什么 'ref'和 'out'不支持多态?

c# - Azure KeyVault 范围有助于解决访问被拒绝错误

list - 可选参数的默认值必须为常数

c# - 服务引用未加载 : Schema with target namespace could not be found

c# - 是否使用 "Optional, DefaultParameterValue"属性?

visual-studio-2010 - 为什么为泛型方法生成的覆盖代码不正确?

oracle - 使用 JDBC 从存储过程中获取 Oracle 表类型

java - 即使 Java 缺少参数支持,Metro 能否使 Java web 服务与 WCF 互操作?

c# - 在运行时向动态对象添加成员

c# - Azure根据上次修改删除旧的blob