Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V univerzální platformě Windows (UPW) jsou parametry buď pro vstup, nebo pro výstup, nikdy oba. To znamená, že obsah pole, který je předán metodě a samotné pole, jsou buď pro vstup, nebo pro výstup. Pokud je obsah pole určen pro vstup, metoda čte z pole, ale nezapisuje do něj. Pokud je obsah pole pro výstup, metoda zapíše do pole, ale nečte z něj. To představuje problém s parametry pole, protože pole v .NET jsou odkazové typy a obsah pole jsou proměnlivé, i když je odkaz na pole předán hodnotou (ByVal v jazyce Visual Basic). Nástroj pro export metadat prostředí Windows Runtime (Winmdexp.exe) vyžaduje, abyste zadali zamýšlené použití pole, pokud není jasné z kontextu, použitím atributu ReadOnlyArrayAttribute nebo atributu WriteOnlyArrayAttribute na parametr. Použití pole se určuje takto:
Pro návratovou hodnotu nebo výstupní parametr (parametr ByRef s atributem OutAttribute v jazyce Visual Basic) je pole vždy pouze pro výstup. Nepoužívejte atribut ReadOnlyArrayAttribute. Atribut WriteOnlyArrayAttribute je povolený u výstupních parametrů, ale je redundantní.
Upozornění Kompilátor jazyka Visual Basic nevynucuje pravidla pro výstup. Nikdy byste neměli číst z výstupního parametru; může obsahovat Nothing. Vždy přiřaďte nové pole.
Parametry s modifikátorem ref (ByRef v jazyce Visual Basic) nejsou povoleny. Winmdexp.exe vygeneruje chybu.
U parametru předaného hodnotou je nutné určit, zda je obsah pole pro vstup nebo výstup použitím atributu ReadOnlyArrayAttribute nebo atributu WriteOnlyArrayAttribute. Zadání obou atributů je chyba.
Pokud metoda musí přijmout pole pro vstup, upravit obsah pole a vrátit matici volajícímu, použijte pro vstup parametr jen pro čtení a parametr jen pro zápis (nebo návratovou hodnotu) pro výstup. Následující kód ukazuje jeden ze způsobů implementace tohoto vzoru:
public int[] ChangeArray([ReadOnlyArray()] int[] input)
{
int[] output = input.Clone();
// Manipulate the copy.
// ...
return output;
}
Public Function ChangeArray(<ReadOnlyArray> input() As Integer) As Integer()
Dim output() As Integer = input.Clone()
' Manipulate the copy.
' ...
Return output
End Function
Doporučujeme okamžitě vytvořit kopii vstupního pole a manipulovat s ní. To pomáhá zajistit, aby se metoda chovala stejně bez ohledu na to, jestli je komponenta volána kódem .NET.
Použití komponent ze spravovaného a nespravovaného kódu
Parametry s atributem ReadOnlyArrayAttribute nebo WriteOnlyArrayAttribute se chovají odlišně v závislosti na tom, zda je volající zapsán v nativním kódu nebo spravovaném kódu. Pokud je volající nativní kód (rozšíření komponent Jazyka JavaScript nebo Visual C++), obsah pole se považuje za následující:
- ReadOnlyArrayAttribute: Pole se zkopíruje, když volání překročí hranici binárního rozhraní aplikace (ABI). V případě potřeby se prvky převedou. Proto všechny náhodné změny provedené metodou v poli jen pro vstup nejsou viditelné volajícímu.
- WriteOnlyArrayAttribute: Volaná metoda nemůže provádět žádné předpoklady o obsahu původního pole. Například pole, které metoda přijímá, nemusí být inicializována nebo může obsahovat výchozí hodnoty. Očekává se, že metoda nastaví hodnoty všech prvků v poli.
Pokud je volající spravovaný kód, původní pole je dostupné pro volanou metodu, stejně jako tomu je u každého volání metody v .NET. Obsah pole je v kódu .NET proměnlivý, takže všechny změny, které metoda provede v poli, jsou viditelné volajícímu. Je to důležité si uvědomit, protože ovlivňuje testy jednotek napsané pro komponentu prostředí Windows Runtime. Pokud jsou testy napsané ve spravovaném kódu, obsah pole bude během testování proměnlivý.
Související témata
- ReadOnlyArrayAttribute
- WriteOnlyArrayAttribute
- Komponenty prostředí Windows Runtime s C# a Visual Basic