我正在将一个 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),所以 out
是 never 正确的选择。也许是标志枚举?
[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/