2013-04-10 5 views

risposta

2

È una parola chiave specifica di C#, COM lo ha anche nella sintassi IDL. L'equivalente in MSVC++ è l'attributo [out].

Ma no, il compilatore lo rifiuterà con C3115 se si tenta di usarlo. Tieni presente che utilizzi l'estensione di linguaggio C++/CX per scrivere codice utilizzato da altre lingue. Che in generale supportano la nozione di [out] molto male. Né i linguaggi C++, Javascript o .NET come vb.net lo supportano. Puoi vedere questo anche nei file .h in C: \ Programmi (x86) \ Kit di Windows \ 8.0 \ Include \ WinRT, generati dai file .idl nella stessa directory che ha l'attributo [out]. È stato rimosso nel file .h da midl.

Non importa in ogni caso poiché il codice verrà utilizzato in-process in modo da non avere alcun beneficio da [out] essere in grado di ottimizzare il marshalling del valore dell'argomento. Basta un semplice puntatore per completare il lavoro. Dovendo inizializzare il valore dell'argomento nel codice C# è tuttavia inevitabile una perdita.

1

È possibile utilizzare:

  1. _Out_opt_
  2. _Out_

Ma questi sono disponibili solo per, e membri interni protetti private AFAIK.

+1

Queste sono annotazioni SAL e interessano solo l'analisi del codice statico. Nella compilazione normale valutano a nulla. –

9

Qualsiasi parametro che sia di tipo T* (dove T è un tipo ABI-legale) verrà considerato dal compilatore come un parametro esterno e decorato nei metadati come tali. Il codice seguente:

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

Produce una funzione in metadati che assomiglia a questo (uscita 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 

noti che WinRT fa non supporto "in/out" parametri, così il valore di out1 e è valido solo per il ritorno dalla funzione e non può essere considerato attendibile come input per foo .

+1

Risposta utile. Hai un riferimento a questo nei documenti ufficiali? – bleater

Problemi correlati