ref
typy struktur (referenční dokumentace jazyka C#)
Modifikátor můžete použít ref
v deklaraci typu struktury. Instance typu ref struct
se přidělují do zásobníku a nemůžou utéct ke spravované haldě. Aby se zajistilo, kompilátor omezuje použití typů ref struct
následujícím způsobem:
- A
ref struct
nemůže být typem prvku pole. - Nelze
ref struct
deklarovat typ pole třídy nebo jiného typuref struct
. - Rozhraní
ref struct
nelze implementovat. - A
ref struct
nemůže být v rámečku System.ValueType nebo System.Object. - Argument
ref struct
typu nemůže být. - Proměnnou
ref struct
nelze zachytit výrazem lambda ani místní funkcí. - Proměnnou
ref struct
nelze použít vasync
metodě. Proměnné však můžete použítref struct
v synchronních metodách, například v metodách, které vrací Task nebo Task<TResult>. - Proměnnou
ref struct
nelze použít v iterátorech.
Můžete definovat uvolnitelné ref struct
. Abyste to mohli udělat, ujistěte se, že vyhovuje jednorázovému ref struct
vzoru. 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
.
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
Počínaje jazykem C# 11 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 null
pole .
Modifikátor ref
můžete u pole použít readonly
následujícími způsoby:
readonly ref
: Toto pole můžete znovu přiřadit pomocí operátoru= ref
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 libovolném okamžiku nelze k takovému poli přiřadit hodnotu s=
operátorem. Můžete ale znovu přiřadit pole 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. Použití odkazu umožňuje Span<T>
instanci zabránit kopírování úložiště, na které odkazuje.
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ě.
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro