Вот

System.Runtime.InteropServices Атрибут существует. Но для чего это нужно? Я был бы рад, если бы вы могли использовать следующий пример в качестве основы для ваших ответов.<Out()>Назначение этого атрибута двоякое:

 Shared Sub Add(ByVal x As Integer, ByVal y As Integer, <Out()> ByRef Result As Integer)
  Result = x + y
 End Sub

Ответы на вопрос(4)

переданной по ссылке, не имеет значения, поэтому определенное присваивание не имеет значения

Переменнаябудем к моменту возврата метода было присвоено соответствующее значение, если только нет исключения - поэтому оно определенно назначается в конце оператора.Другие языки могут использовать

 Приписывать это можно по-разному, но такое толкование является наиболее естественным. В основном это говорит о том, что параметр почти как дополнительное возвращаемое значение. (Есть много различий, конечно, различной степени тонкости, но это общее[Out]чувство выходной параметр.)<strike> Разве это не имеет значения для C #, только если он должен был скомпилировать рассматриваемый код? Разве «ref» и «out» не идентичны на сайте вызова? </ Strike> - не берите в голову :)

 supercat30 янв. 2013 г., 00:36
@supercat: Это зависит от уровня, на котором мы рассматриваем вещи. Уровень «проверка правильности исходного кода»
 Jon Skeet30 янв. 2013 г., 07:44
делает Предположим, переменная была написана. Уровень «испускающего ИЛ» - нет, хотя другая реализация ориентирована на другую платформумог бы быть способным к.Он используется в типах ComVisible, чтобы указать, что сгенерированная библиотека типов COM должна украшать параметр атрибутом [out].
 Lasse Vågsæther Karlsen24 янв. 2011 г., 12:36
На самом деле это означает, что если переменная не была записана до вызова рассматриваемой подпрограммы, компилятор вставит код для инициализации места хранения, в котором хранится переменная, а не будет жаловаться (нет гарантии, где такой код будет помещен; при этом нет никакой гарантии, что переменная, которая покидает и повторно входит в область действия, не будет продолжать использовать то же место хранения без повторной инициализации). Компилятор не может предположить, что переменная была записана, поскольку он не может быть уверен, что вызываемая подпрограмма действительно записывает ее.

 outВедет себя так же, как

 но не требует, чтобы вызывающая сторона инициализировала переменную, переданнуюref параметр, потому что функция не будет читать его.outИ это, вероятно, повлияет на маршалинг, если вы используете COM-oder p-invoke.

При применении к параметрам метода и возвращаемым значениям эти атрибуты управляют направлением маршалинга, поэтому оно называется направленными атрибутами.

Решение Вопроса

независимо от того, нужно ли инициализировать переменную или нет

сортировочныйЕсли бы вы вызывали этот метод из C # или подобного языка со схожей семантикой, такой параметр был бы известен компилятору, чтобы не нуждаться в начальном значении.

Другими словами, вы можете сделать это:

и компилятор знает, что нет необходимости гарантировать, что

int a;
CallSomeMethodWithOutParameter(out a);

 уже имеет значение до совершения звонка.aС другой стороны, без атрибута потребуется следующее, опять же в C #:

Другая цель - для вызовов методов, которые будут перенаправляться в другой контекст вызова, например, через P / Invoke, в другой домен приложения или в веб-службу, чтобы уведомить процедуры маршаллинга о том, что рассматриваемый параметр будет содержать значение когда метод возвращается, но нет необходимости передавать какое-либо значение в метод при его вызове.

int a = 0;                               // <-- notice initialization here
CallSomeMethodWithOutParameter(ref a);   // <-- and ref here

Это может иметь значение, когда параметры и возвращаемые значения должны быть упакованы и перенесены в удаленное местоположение, где происходит фактический вызов.

Другими словами, если указать, что при вызове метода, используемого через P / Invoke, не будет выполнено маршалинг существующего значения параметра, когда метод

называется, но когда методвозвращается его значение возвращается в ваш код вызова.Обратите внимание, что эта оптимизация зависит от использования процедуры маршаллинга, или нет, это детали реализации. Атрибут просто сообщает подпрограмме, какие параметры она

Можно делать это с, это не инструкция, которая всегда будет следовать.Это означает, что параметр рассматривается как выходной параметр в C #, с одной стороны. В этом случае компилятор C # будет считать, что:

  чтобы маршал вернулся от вызываемого к вызывающему по возвращении. И вызывающий, и вызываемый могут быть как неуправляемым, так и управляемым кодом. Например, в вызове P / Invoke управляемый код вызывает неуправляемый код. Однако в обратном P / Invoke неуправляемый код может вызывать управляемый код через указатель функции.[OutAttribute]Есть случаи, когда

 будут игнорироваться Например,[OutAttribute] не имеет никакого смысла, поэтому[OutAttribute]int просто игнорируется CLR. То же самое относится и к[OutAttribute] строка, потому что строка неизменна.[OutAttribute]Итак, для вашего примера этот атрибут не имеет смысла. Подробнее об этом атрибуте и корреляции

 приписать ваш можно найти<In()>ВотАтрибут <Out ()>. Какая полезная цель сл.

Ваш ответ на вопрос