ref
struktúratípusok (C#-referencia)
A módosító egy ref
struktúratípus deklarációjában használható. Egy típuspéldányok ref struct
a veremen vannak lefoglalva, és nem tudnak menekülni a felügyelt halomhoz. Ennek biztosítása érdekében a fordító az alábbiak szerint korlátozza a típusok használatát ref struct
:
- Nem
ref struct
lehet tömb elemtípusa. - A
ref struct
mező nem lehet osztály vagy nemref struct
deklarált típusa. - A
ref struct
felületeket nem lehet implementálni. - A
ref struct
nem lehet bekeretezett System.ValueType vagy System.Object. - Nem
ref struct
lehet típusargumentum. - A
ref struct
változók nem rögzíthetők lambdakifejezésben vagy helyi függvényben. - A C# 13
ref struct
előtt a változók nem használhatók metódusokbanasync
. A C# 13-tól kezdődően egyref struct
változó nem használható ugyanabban a blokkban, mint egyawait
metódus kifejezéseasync
. A változókat azonban szinkron metódusokban is használhatjaref struct
, például olyan metódusokban, amelyek visszaadják Task vagy Task<TResult>. - A C# 13 előtt egy
ref struct
változó nem használható iterátorokban. A C# 13-tólref struct
kezdődően a típusok ésref
a helyiek használhatók az iterátorokban, feltéve, hogy nincsenek kódszegmensekben azyield return
utasítással.
Definiálhat egy eldobható ref struct
. Ehhez győződjön meg arról, hogy az ref struct
eldobható mintához illeszkedik. Ez azt jelent, hogy egy példánymetódussal Dispose
rendelkezik, amely elérhető, paraméter nélküli, és visszatérési típussal void
rendelkezik. A használati utasítást vagy deklarációt használhatja egy eldobható ref struct
példánysal.
Általában akkor határoz meg típust ref struct
, ha olyan típusra van szüksége, amely az adattípusokat ref struct
is tartalmazza:
public ref struct CustomRef
{
public bool IsValid;
public Span<int> Inputs;
public Span<int> Outputs;
}
As readonly
deklarálásához ref struct
egyesítse a readonly
típusdeklarációban a módosítókat és ref
a módosítókat (a readonly
módosítónak a ref
módosító előtt kell lennie):
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; }
}
A .NET-ben példákat ref struct
láthat a következőkre System.Span<T> : és System.ReadOnlySpan<T>.
ref
Mezők
A C# 11-től kezdődően deklarálhat egy ref
mezőt a ref struct
következő példában:
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;
}
}
Egy ref
mezőnek lehet null
értéke. Unsafe.IsNullRef<T>(T) A metódus használatával állapítsa meg, hogy egy ref
mező .null
A módosító a readonly
következő módokon alkalmazható egy ref
mezőre:
readonly ref
: Az ilyen mezőket csak konstruktoron vagyinit
tartozékon belül rendelheti újra az operátorhoz= ref
. A mezőhozzáférési módosító által engedélyezett bármely ponton hozzárendelhet értéket=
az operátorhoz.ref readonly
: Egy ilyen mezőhöz nem rendelhet értéket az=
operátorral. Azonban újra hozzárendelhet egy mezőt az= ref
operátorral.readonly ref readonly
: Ilyen mezőt csak konstruktorban vagyinit
tartozékban rendelhet újra. Bármikor nem rendelhet értéket a mezőhöz.
A fordító biztosítja, hogy egy mezőben tárolt ref
hivatkozás ne lépje túl a hivatkozási értékét.
A ref
mezők funkció lehetővé teszi a következő típusok System.Span<T>biztonságos implementálását:
public readonly ref struct Span<T>
{
internal readonly ref T _reference;
private readonly int _length;
// Omitted for brevity...
}
A Span<T>
típus egy hivatkozást tárol, amelyen keresztül hozzáfér a memória összefüggő elemeihez. A hivatkozás használatával a Span<T>
példányok elkerülhetik a hivatkozott tárterület másolását.
C# nyelvspecifikáció
További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:
A mezőkkel kapcsolatos ref
további információkért tekintse meg az Alacsony szintű szerkezetfejlesztések javaslati megjegyzését.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: