2013-04-10 2 views

Antwort

2

Es ist ein C# spezifisches Schlüsselwort, COM hat es auch in der IDL-Syntax. Das Äquivalent in MSVC++ ist das [out] -Attribut.

Aber nein, der Compiler wird das mit C3115 ablehnen, wenn Sie versuchen, es zu verwenden. Beachten Sie, dass Sie die C++/CX-Spracherweiterung verwenden, um Code zu schreiben, der von anderen Sprachen verwendet wird. Was im Allgemeinen die Vorstellung von [out] sehr schlecht unterstützt. Weder C++, Javascript oder .NET-Sprachen wie vb.net unterstützen es. Sie können dies auch in den .h-Dateien in C: \ Programme (x86) \ Windows Kits \ 8.0 \ Include \ WinRT sehen, die aus den .idl-Dateien in demselben Verzeichnis generiert werden, das das [out] -Attribut hat. Es wurde in der .h-Datei bis Mitte entfernt.

Es spielt keine Rolle, da der Code im Prozess verwendet wird, sodass es keinen Vorteil gibt, das Marshalling des Argumentwerts zu optimieren. Nur ein einfacher Zeiger erledigt den Job. Den Argumentwert im C# -Code initialisieren zu müssen, ist jedoch unvermeidliche Verlust.

1

können Sie verwenden:

  1. _Out_opt_
  2. _Out_

sind aber nur für private, interne und AFAIK geschützt Mitglieder.

+1

Dies sind SAL-Anmerkungen und betreffen nur die statische Codeanalyse. Bei der normalen Kompilierung bewerten sie nichts. –

9

Jeder Parameter vom Typ T* (wobei T ein ABI-legal-Typ ist) wird vom Compiler als out-Parameter behandelt und in Metadaten als solche dekoriert. Der folgende Code:

namespace TestMakePublic { 
public ref class Class1 sealed 
{ 
public: 
    void foo(int* out1, Object^* out2){} 
}; 
} 

Erzeugt eine Funktion in Metadaten, die wie diese (ildasm Ausgabe) aussieht:

.method public hidebysig newslot virtual final 
     instance void foo([out] int32& out1, 
          [out] object& out2) runtime managed 
{ 
    .override TestMakePublic.__IClass1PublicNonVirtuals::foo 
} // end of method Class1::foo 

Beachten Sie, dass WinRT tut nicht Unterstützung "in/out" Parameter, so Die Werte out1 und out2 sind nur für die Rückkehr von der Funktion gültig, und kann nicht als als Eingaben für foo vertrauenswürdig sein .

+1

Hilfreiche Antwort. Haben Sie in offiziellen Dokumenten einen Hinweis darauf? – bleater