【问题标题】:C# - Why do I need to initialize an [Out] parameterC# - 为什么我需要初始化一个 [Out] 参数
【发布时间】:2014-12-26 12:13:03
【问题描述】:

我有几个从本地 .dll 导入的方法,使用以下语法:

internal static class DllClass {
    [DllImport("Example.dll", EntryPoint = "ExampleFunction")]
    public static extern int ExampleFunction([Out] ExampleStruct param);
}

现在,因为我将 param 指定为 [Out],所以我预计以下 sn-ps 中至少有一个是有效的:

ExampleStruct s;
DllCass.ExampleFunction(s);

ExampleStruct s;
DllCass.ExampleFunction([Out] s);

ExampleStruct s;
DllCass.ExampleFunction(out s);

但是,它们都不起作用。我发现让它工作的唯一方法是初始化 s。

ExampleStruct s = new ExampleStruct();
DllCass.ExampleFunction(s);

我已经设法通过将第一个 sn-p 重写为以下代码来解决这个问题,但这感觉有点多余。

internal static class DllClass {
    [DllImport("Example.dll", EntryPoint = "ExampleFunction")]
    public static extern int ExampleFunction([Out] out ExampleClass param);
}

我读过What's the difference between [Out] and out in C#? 并且因为接受的答案指出[Out]out 在上下文中是等效的,这让我想知道为什么它对我不起作用以及我的“解决方案”是否合适.

我应该同时使用吗?我应该只使用out 吗?我应该只使用[Out]吗?

【问题讨论】:

    标签: c# pinvoke marshalling out


    【解决方案1】:

    OutAttribute 确定参数的运行时行为,但在编译时没有影响。如果要使用编译时语义,则需要 out 关键字。

    仅使用 out 关键字将更改运行时封送处理,因此 OutAttribute 是可选的。请参阅this answer 了解更多信息。

    【讨论】:

    • 好的,那么,假设我不想要编译时语义,那么带有初始化的代码真的可以工作吗? (也就是说,我会在param 中获得正确的值吗?)而且,假设我这样做了,如果我同时保留out[Out],它会起作用吗?
    • 我相信两者的答案都是肯定的,只要外部函数被正确编写以期望 out 参数。
    【解决方案2】:

    您是否将其初始化为函数内部的值?这就是要求出现的地方:out 参数必须在声明参数的函数中至少分配一次。

    【讨论】:

    • 由于这是一个外部 dll,我怀疑编译器是否知道函数内部的内容。
    • 即使我不是,这不应该在函数定义上而不是在调用上给我一个错误吗?
    • 这如何回答这个问题?在我看来,这应该作为评论发布,因为它只是要求澄清
    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多