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.
ref Modifikátor použijte při deklarování typu struktury. Přidělíte instance ref struct typu v zásobníku a nemůžou utéct do spravované haldy. Chcete-li zajistit tuto vlastnost, kompilátor omezuje použití typů ref struct následujícím způsobem:
- Jako typ prvku pole nelze použít
ref struct. - Nemůžete deklarovat
ref structjako typ pole ve třídě nebo ne.ref struct - Nemůžete ho
ref structza boxovat System.ValueType ani System.Object. - Proměnnou
ref structnemůžete zachytit ve výrazu lambda ani v místní funkci. - Před jazykem C# 13 nemůžete v
asyncmetodě používatref structproměnné. Počínaje jazykem C# 13 nelze proměnnouref structpoužít ve stejném bloku jakoawaitvýraz vasyncmetodě. Proměnné však můžete použítref structv synchronních metodách, například v metodách, které vrací Task nebo Task<TResult>. - Před C# 13 nemůžete v iterátorech použít proměnnou
ref struct. Počínaje jazykem C# 13ref structje možné v iterátorech používat typy arefmístní hodnoty za předpokladu, že nejsou v segmentech kódu s příkazemyield return. - Před C# 13
ref structnemůže implementovat rozhraní. Počínaje jazykem C# 13refmůže struktura implementovat rozhraní, ale musí dodržovat pravidla bezpečnosti ref. Například typ nelze převést na typ rozhraní,ref structprotože to vyžaduje převod boxingu. - Před jazykem
ref structC# 13 nemůže být argument typu. Počínaje jazykem C# 13 může být argument typu,ref structpokud parametr typu určujeallows ref structv klauzuliwhere.
Referenční dokumentace jazyka C# dokumentuje naposledy vydané verze jazyka C#. Obsahuje také počáteční dokumentaci k funkcím ve verzi Public Preview pro nadcházející jazykovou verzi.
Dokumentace identifikuje všechny funkce, které byly poprvé představeny v posledních třech verzích jazyka nebo v aktuálních verzích Public Preview.
Návod
Informace o tom, kdy byla funkce poprvé představena v jazyce C#, najdete v článku o historii verzí jazyka C#.
Typ definujete ref struct obvykle v případě, že potřebujete typ, který zahrnuje i datové členy typů ref struct :
public ref struct CustomRef
{
public bool IsValid;
public Span<int> Inputs;
public Span<int> Outputs;
}
Chcete-li deklarovat ref struct jako readonly, zkombinujte readonly a ref modifikátory v deklaraci typu ( readonly modifikátor musí být před modifikátorem ref ):
public readonly ref struct ConversionRequest
{
public ConversionRequest(double rate, ReadOnlySpan<double> values)
{
Rate = rate;
Values = values;
}
public double Rate { get; }
public ReadOnlySpan<double> Values { get; }
}
V .NET jsou příklady ref struct a System.Span<T>System.ReadOnlySpan<T>.
ref pole
Můžete deklarovat ref pole v následujícím příkladu ref struct:
public ref struct RefFieldExample
{
private ref int number;
public int GetNumber()
{
if (System.Runtime.CompilerServices.Unsafe.IsNullRef(ref number))
{
throw new InvalidOperationException("The number ref field is not initialized.");
}
return number;
}
}
Pole ref může mít null hodnotu.
Unsafe.IsNullRef<T>(T) Pomocí metody určete, zda ref je nullpole .
Modifikátor readonly můžete u pole použít ref následujícími způsoby:
-
readonly ref: Toto pole můžete znovu přiřadit pomocí= refoperátoru pouze uvnitř konstruktoru nebo přístupového objektuinit. Hodnotu s operátorem=můžete přiřadit v libovolném bodě povoleném modifikátorem přístupu k poli. -
ref readonly: V žádném okamžiku nemůžete k tomuto poli přiřadit hodnotu operátorem=. Pole však můžete znovu přiřadit pomocí operátoru= ref. -
readonly ref readonly: Toto pole můžete znovu přiřadit pouze v konstruktoru nebo přístupovém objektuinit. V žádném okamžiku nemůžete k poli přiřadit hodnotu.
Kompilátor zajistí, aby odkaz uložený v ref poli neobsáhl jeho odkaz.
Funkce ref polí umožňuje bezpečnou implementaci typů, jako System.Span<T>jsou:
public readonly ref struct Span<T>
{
internal readonly ref T _reference;
private readonly int _length;
// Omitted for brevity...
}
Typ Span<T> ukládá odkaz, prostřednictvím kterého přistupuje k souvislým prvkům v paměti. Když použijete odkaz, instance se vyhne kopírování úložiště, Span<T> na které odkazuje.
Model na jedno použití
Můžete definovat uvolnitelné ref struct. Abyste to mohli udělat, ujistěte se, že vyhovuje jednorázovému ref structvzoru. To znamená, že má metodu instance Dispose , která je přístupná, bez parametrů a má návratový void typ. Můžete použít příkaz using nebo deklaraci s instancí uvolnitelné ref struct.
Počínaje jazykem C# 13 můžete implementovat také typy IDisposableref struct . Rozlišení přetížení však dává přednost jednorázovému vzoru pro metodu rozhraní. Kompilátor se přeloží na metodu IDisposable.Dispose pouze v případě, že nebyla nalezena vhodná Dispose metoda.
Omezení pro ref struct typy, které implementují rozhraní
Tato omezení zajišťují, že ref struct typ, který implementuje rozhraní, dodržuje potřebná pravidla bezpečnosti ref .
- Nemůžete převést
ref structna instanci rozhraní, které implementuje. Toto omezení zahrnuje implicitní převod při použitíref structtypu jako argumentu a parametr je typ rozhraní. Výsledkem převodu je krabicový převod, který porušuje bezpečnost ref.ref structmůže deklarovat metody jako explicitní deklarace rozhraní. K těmto metodám však můžete přistupovat pouze z obecných metod, kde typy parametrůallows ref structtypu. -
ref struct, která implementuje rozhraní , musí implementovat všechny členy instance rozhraní.ref structmusí implementovat členy instance, i když rozhraní obsahuje výchozí implementaci.
Kompilátor vynucuje tato omezení. Pokud píšete ref struct typy, které implementují rozhraní, může každá nová aktualizace obsahovat nové výchozí členy rozhraní. Dokud nezadáte implementaci pro žádné nové metody instance, vaše aplikace se nekompiluje. Pro metodu rozhraní static nemůžete poskytnout konkrétní implementaci s výchozí implementací.
Důležité
Implementace rozhraní s typem ref struct představuje potenciál pozdějších změn způsobujících chybu zdroje a binárních změn. K přerušení dojde, pokud ref struct implementuje rozhraní definované v jiném sestavení a toto sestavení poskytuje aktualizaci, která přidá do tohoto rozhraní výchozí členy.
K přerušení zdroje dojde při rekompilování ref struct: Musí implementovat nový člen, i když existuje výchozí implementace.
Binární přerušení nastane, pokud upgradujete externí sestavení bez rekompilování ref struct typu a aktualizovaný kód volá výchozí implementaci nové metody. Modul runtime vyvolá výjimku při přístupu výchozího člena.
specifikace jazyka C#
Další informace najdete v následujících částech specifikace jazyka C#:
Další informace o ref polích naleznete v návrhu vylepšení struktury nízké úrovně.