У меня есть несколько методов, импортируемых из нативного .dll, используя следующий синтаксис:C# - Почему мне нужно инициализировать параметр [Out]
internal static class DllClass {
[DllImport("Example.dll", EntryPoint = "ExampleFunction")]
public static extern int ExampleFunction([Out] ExampleStruct param);
}
Теперь, потому что я указал param
в [Out]
, Я ожидал бы, что хотя бы один из следующих фрагментов будет действителен:
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);
мне удалось исправить, переписав первый фрагмент кода на следующий код, но это чувствует своего рода излишним.
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]
?
Итак, если я не хочу использовать семантику времени компиляции, действительно ли будет работать код с инициализацией? (То есть, я получу правильное значение в 'param'?) И, предположим, я это сделаю, будет ли это работать, если я буду держать' out' и '[Out]'? – rmobis
Я считаю, что ответ да для обоих, если внешняя функция написана правильно, чтобы ожидать параметр 'out'. – user1620220