2013-04-10 9 views

Odpowiedz

2

Jest to słowo kluczowe w języku C#, COM ma je również w składni IDL. Odpowiednikiem w MSVC++ jest atrybut [out].

Ale nie, kompilator odrzuci to przy pomocy C3115, jeśli spróbujesz go użyć. Pamiętaj, że do pisania kodu używanego przez inne języki używasz rozszerzenia języka C++/CX. Co ogólnie bardzo źle wpływa na pojęcie [na zewnątrz]. Ani języki C++, Javascript ani .NET, takie jak vb.net, nie obsługują tego. Możesz to również zobaczyć w plikach .h w C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Include \ WinRT, wygenerowany z plików .idl w tym samym katalogu, który ma atrybut [out]. Został usunięty z pliku .h przez midl.

Nie ma to znaczenia, ponieważ twój kod zostanie użyty w procesie, więc nie ma żadnych korzyści z [out] możliwości optymalizacji marszczenia wartości argumentu. Wystarczy prosty wskaźnik, aby wykonać zadanie. Konieczność zainicjowania wartości argumentu w kodzie C# jest jednak nieunikniona.

1

Można użyć:

  1. _Out_opt_
  2. _Out_

Ale te są dostępne tylko dla prywatnych, wewnętrznego i członków chronionych AFAIK.

+1

Są to adnotacje SAL i wpływają tylko na analizę statycznego kodu. W normalnej kompilacji oceniają na nic. –

9

Dowolny parametr, który jest typu T* (gdzie T jest typem ABI-legal) będzie traktowany przez kompilator jako parametr wyjściowy i będzie dekorowany w metadanych jako takich. Poniższy kod:

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

Tworzy funkcję w metadanych, które wygląda następująco (wyjście ildasm):

.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 

Zauważ, że WinRT robi nie poparcie "In/Out" parametrów, tak wartości out1 i out2 są ważne tylko do powrócenia z funkcji, a nie można zaufać jako danych wejściowych do foo .

+1

Przydatna odpowiedź. Czy masz odniesienia do tego w oficjalnych dokumentach? – bleater