Назначение этого атрибута двоякое:
- Обработка вызова сайта, для принудительной инициализации переменной или нет
- Ранжирование
Если бы вы вызывали этот метод из C # или подобного языка с похожей семантикой, такой параметр был бы известен компилятору, чтобы не нуждаться в начальном значении.
Другими словами, вы можете сделать это:
int a;
CallSomeMethodWithOutParameter(out a);
и компилятор знает, что нет необходимости гарантировать, что a
уже имеет значение перед выполнением вызова.
С другой стороны, без атрибута потребуется следующее, опять же в C #:
int a = 0; // <-- notice initialization here
CallSomeMethodWithOutParameter(ref a); // <-- and ref here
Другая цель для вызовов методов, которые будут перенаправляться в другой контекст вызова, например, через P / Invoke, в другой домен приложения или в веб-службу, чтобы уведомить процедуры маршалинга о том, что рассматриваемый параметр содержать значение при возврате метода, но нет необходимости передавать какое-либо значение в метод при его вызове.
Это может иметь значение, когда параметры и возвращаемые значения должны быть упакованы и перенесены в удаленное местоположение, где происходит фактический вызов.
Другими словами, если указать, что при вызове метода, используемого через P / Invoke, не будет выполнено маршалинг существующего значения параметра, когда метод называется , но когда метод возвращает его значение возвращается в ваш код вызова.
Обратите внимание, что эта оптимизация зависит от используемой процедуры маршалинга, или нет, это детали реализации. Атрибут просто сообщает подпрограмме, с какими параметрами он может сделать это, это не инструкция, которой всегда будут следовать.