Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A referenciaváltozók használatakor a következő hibák hozhatók létre:
-
CS0192: A
readonlymező nem használható értékkéntrefvagyoutértékként (a konstruktor kivételével) -
CS0199: Egy
static readonlymező nem használható értékként vagyrefértékkéntout(statikus konstruktor kivételével) -
CS0206: Nem ref-returning tulajdonság vagy indexelő nem használható értékként vagy
outértékkéntref -
CS0631:
refésoutnem érvényes ebben a környezetben -
CS0767: A megadott típusparaméterekkel nem örökölhető a felület, mert a metódus túlterheléseket okoz, amelyek csak a
refout -
CS1510: A
refvagyoutértéknek hozzárendelhető változónak kell lennie -
CS1605: A változó nem használható értékként vagy
refértékkéntout, mert írásvédett -
CS1623: Az iterátorok nem rendelkezhetők
refparaméterekkelinvagyoutparaméterekkel -
CS1649: Egy
readonlymező tagjai nem használhatók értékkéntrefvagyoutértékként (a konstruktor kivételével) -
CS1651: Statikus írásvédett mező mezői nem használhatók értékként vagy
refértékkéntout(a statikus konstruktor kivételével) -
CS1655: A típusmezők nem használhatók értékként vagy
refértékkéntout -
CS1657: A változó nem használható értékként vagy
refértékkéntout -
CS1741: Egy
refvagyouttöbb paraméter nem rendelkezhet alapértelmezett értékkel -
CS1939: A tartományváltozó nem adható át paraméterként vagy
outparaméterkéntref -
CS1988: Az aszinkron metódusok nem rendelkeznek
refparaméterekkelinvagyoutparaméterekkel -
CS7084: Előfordulhat, hogy egy Windows-futtatókörnyezet esemény nem adható át paraméterként vagy
outparaméterkéntref. - CS8196: Az implicit módon beírt kimenő változóra való hivatkozás nem engedélyezett ugyanabban az argumentumlistában.
-
CS8325: "
await" nem használható feltételes operátortreftartalmazó kifejezésben - CS8326: Mindkét feltételes operátor értékének ref értéknek kell lennie, vagy egyik sem lehet hiv-érték
- CS8327: A kifejezésnek megfelelő típusúnak kell lennie, hogy megfeleljen az alternatív hiv-értéknek
-
CS8329: A változó nem használható értékként vagy
refértékkéntout, mert írásvédett változó -
CS8330: A változó tagjai nem használhatók értékként vagy
refértékkéntout, mert az egy olvasható változó -
CS8331: Nem rendelhető hozzá a változóhoz, és nem használható a hozzárendelés jobb oldalán
ref, mert az egy könnyen olvasható változó -
CS8332: Nem rendelhető hozzá egy változó taghoz, és nem használható a hozzárendelés jobb oldalán
ref, mert az egy olvasható változó -
CS8337: A "
ref" bővítménymetódus első paraméterének egy értéktípusnak vagy általános típusnak kell lennie, amely a strukturáláshoz van korlátozva. -
CS8338: A bővítménymetódus első "
in" vagy ""ref readonlyparaméterének konkrét (nem általános) értéktípusnak kell lennie. -
CS8373: A hozzárendelés bal oldalán
refref változónak kell lennie. -
CS8388: Egy
outváltozó nem deklarálható hiv helyiként -
CS8977: Nem használható "
ref", ""invagy ""outa "UnmanagedCallersOnly" attribútumú metódus aláírásában. - CS8986: A paraméter "hatókörön belüli" módosítója nem egyezik a célval.
- CS8987: A paraméter "hatókörön belüli" módosítója nem egyezik a felülírt vagy a implementált tagval.
- CS9061: A "scoped" módosító nem használható elvetéssel.
- CS9062: A típusok és aliasok nem nevezhetők "hatókörnek".
- CS9063: A UnscopedRefAttribute nem alkalmazható erre a paraméterre, mert alapértelmezés szerint nincs megadva.
- CS9065: Ne használja a "System.Runtime.CompilerServices.ScopedRefAttribute" parancsot. Használja inkább a "hatókörön" kulcsszót.
- CS9066: A UnscopedRefAttribute nem alkalmazható a "hatókörrel rendelkező" módosítókkal rendelkező paraméterekre.
- CS9072: A dekonstruálási változó nem deklarálható ref helyiként
- CS9101: A UnscopedRefAttribute csak a szerkezet- vagy virtuálisfelület-példányok metódusaira és tulajdonságaira alkalmazható, és konstruktorokra vagy csak init-only tagokra nem alkalmazható.
- CS9102: A UnscopedRefAttribute nem alkalmazható felületi implementációra, mert a implementált tag nem rendelkezik ezzel az attribútummal.
-
CS9104: Nem
usinghasználható aszinkron metódusokban vagy aszinkron lambdakifejezésekben egy típusú utasításerőforrás. -
CS9190:
readonlya módosító megadása utánrefkell megadni. -
CS9199: Egy
ref readonlyparaméter nem rendelkezhet Out attribútummal.
A referenciaváltozók helytelen használata esetén a következő figyelmeztetések jönnek létre:
- CS9073: A paraméter "hatókörön belüli" módosítója nem egyezik a célval.
- CS9074: A paraméter "hatókörön belüli" módosítója nem egyezik a felülírt vagy a implementált tagval.
-
CS9191: A
refparaméternek megfelelőinargumentum módosító értéke megegyezik ain. Fontolja meg a használatátin. -
CS9192: Az argumentumot meg kell adni a kulcsszóval vagy
refa kulcsszóvalinegyütt. -
CS9193: Az argumentumnak változónak kell lennie, mert egy paraméternek
ref readonlytovábbítja -
CS9195: Az argumentumot a
inkulcsszóval együtt kell átadni - CS9196: A paraméter referenciatípus-módosítója nem egyezik meg a felülírt vagy a implementált tag megfelelő paraméterével.
- CS9197: A paraméter referenciatípus-módosítója nem egyezik a rejtett tag megfelelő paraméterével.
- CS9198: A paraméter referenciatípus-módosítója nem felel meg a célnak megfelelő paraméternek.
-
CS9200: A paraméterhez
ref readonlyalapértelmezett érték van megadva, deref readonlycsak hivatkozásokhoz használható. Fontolja meg a paraméterindeklarálását . - CS9201: A ref mezőt használat előtt újra kell rendelni.
- CS9265: A mező soha nem lesz újra hozzárendelve, és mindig az alapértelmezett értékével (nullhivatkozás) fog rendelkezni.
Ezek a hibák és figyelmeztetések a következő témákat követik:
- Helytelen szintaxis: A deklaráció vagy a használat szintaxisa érvénytelen.
-
Olyan nyelvi szerkezetek, amelyekben
refa változók érvénytelenek: Egyes C#-kifejezések nem engedélyezik a változókat. Ennek általában az az oka, hogy a ref biztonsági elemzése nem végezhető el megbízhatóan. - Olyan értékkifejezés, amelynél referenciaváltozóra van szükség: A referenciaváltozóként használt kifejezésnek változónak, nem értékkifejezésnek kell lennie.
- Írható referenciaváltozók írásvédett változókra hivatkozva: Írható hivatkozással nem adható át írásvédett változóra mutató hivatkozás.
Ez a cikk a kifejezés referenciaváltozóját használja általános kifejezésként egy , , in, ref readonlyvagy ref módosítóval deklarált outparaméterhez, vagy egy ref helyi változóhoz, egy ref mezőhöz ref structegy , vagy egy ref visszatéréshez. A referenciaváltozó egy másik változóra, az úgynevezett hivatkozási változóra hivatkozik.
Helytelen szintaxis
Ezek a hibák azt jelzik, hogy helytelen szintaxist használ a referenciaváltozókkal kapcsolatban:
-
CS8373: A hozzárendelés bal oldalán
refref változónak kell lennie. -
CS8388: Egy
outváltozó nem deklarálható hiv helyiként. -
CS9190:
readonlya módosító megadása utánrefkell megadni.
A hibák kijavítása:
- Győződjön meg arról, hogy a
= refoperátor bal oldali operandusa referenciaváltozó legyen, ne pedig értékkifejezés vagy nem referencia alapú helyi változó. A ref-hozzárendeléshez mindkét oldalnak referenciaváltozóknak kell lenniük, amelyek létrehozhatnak egy aliast ugyanarra a tárolóhelyre (CS8373). - Amikor referenciaparamétereket deklarál, a módosítót így írja:
ref readonlyahelyett, hogyreadonly ref. A C#-nyelv specifikációja megköveteli, hogy arefkulcsszó megelőzze areadonlymódosító paraméterdeklarációkban, hogy konzisztens szintaxist tartson fenn az összes referenciaparaméter-típusban (CS9190). - Használja a kulcsszót
refaouthelyi referenciaváltozók deklarálása helyett.outkizárólag olyan paramétermódosító, amely azt jelzi, hogy a metódusnak a visszatérés előtt hozzá kell rendelnie egy értéket, mígrefa helyi változók más tárolási helyeken (CS8388) való létrehozásához megfelelő kulcsszó. A referenciaváltozókkal és azok szintaxisi követelményeivel kapcsolatos további információkért tekintse meg a referenciaváltozókat és a C# nyelvi specifikációját.
Referenciaváltozó-korlátozások
Az alábbi hibák azt jelzik, hogy egy referenciaváltozó nem használható ott, ahol van:
-
CS0631:
refésoutnem érvényes ebben a környezetben -
CS0767: A megadott típusparaméterekkel nem örökölhető a felület, mert a metódus túlterheléseket okoz, amelyek csak a
refout -
CS1623: Az iterátorok nem rendelkezhetők
refparaméterekkelinvagyoutparaméterekkel -
CS1741: Egy
refvagyouttöbb paraméter nem rendelkezhet alapértelmezett értékkel -
CS1939: A tartományváltozó nem adható át paraméterként vagy
outparaméterkéntref -
CS1988: Az aszinkron metódusok nem rendelkeznek
refparaméterekkelinvagyoutparaméterekkel -
CS7084: Előfordulhat, hogy egy Windows-futtatókörnyezet esemény nem adható át paraméterként vagy
outparaméterkéntref. -
CS8196: Az implicit típusú
outváltozóra való hivatkozás nem engedélyezett ugyanabban az argumentumlistában. -
CS8325: A "await" nem használható feltételes operátort
reftartalmazó kifejezésben - CS8326: Mindkét feltételes operátor értékének ref értéknek kell lennie, vagy egyik sem lehet hiv-érték
- CS8327: A kifejezésnek megfelelő típusúnak kell lennie, hogy megfeleljen az alternatív hiv-értéknek
-
CS8337: A "
ref" bővítménymetódus első paraméterének egy értéktípusnak vagy általános típusnak kell lennie, amely a strukturáláshoz van korlátozva. -
CS8338: A bővítménymetódus első "
in" vagy ""ref readonlyparaméterének konkrét (nem általános) értéktípusnak kell lennie. -
CS8977: Nem használható "
ref", ""invagy ""outa "UnmanagedCallersOnly" attribútumú metódus aláírásában. - CS9072: A dekonstruálási változó nem deklarálható ref helyiként
-
CS9104: Nem
usinghasználható aszinkron metódusokban vagy aszinkron lambdakifejezésekben egy típusú utasításerőforrás. -
CS9199: Egy
ref readonlyparaméter nem rendelkezhet Out attribútummal.
Az alábbi figyelmeztetések azt jelzik, hogy nem szabad referenciaváltozót használni, és lehet, hogy nem biztonságos:
- CS9196: A paraméter referenciatípus-módosítója nem egyezik meg a felülírt vagy a implementált tag megfelelő paraméterével.
- CS9197: A paraméter referenciatípus-módosítója nem egyezik a rejtett tag megfelelő paraméterével.
- CS9198: A paraméter referenciatípus-módosítója nem felel meg a célnak megfelelő paraméternek.
-
CS9200: A paraméterhez
ref readonlyalapértelmezett érték van megadva, deref readonlycsak hivatkozásokhoz használható. Fontolja meg a paraméterindeklarálását . - CS9201: A ref mezőt használat előtt újra kell rendelni.
- CS9265: A mező soha nem lesz újra hozzárendelve, és mindig az alapértelmezett értékével (nullhivatkozás) fog rendelkezni.
A hibák kijavítása:
- Referenciaparaméterek eltávolítása az indexelőkből. Az indexelők tömbszerű hozzáférési szintaxist biztosítanak, és a fordító nem garantálja az indexelő tartozékain (CS0631, CS1623) keresztül továbbított hivatkozások biztonságos élettartam-nyomon követését.
- Távolítsa el a referenciaparamétereket az iterátor metódusaiból. Az iterátorok lazán hajtják végre a kódot több híváson az állapotgépek használatával, és a fordító nem tudja biztosítani, hogy a hivatkozott változók érvényesek maradjanak a hozamvisszatérítési határok között, ahol a végrehajtás fel van függesztve és folytatva (CS1623).
- Távolítsa el a referenciaparamétereket az aszinkron metódusokból. Az aszinkron metódusok felfüggeszthetik a végrehajtást a várakozási pontokon, és folytathatják a különböző szálakon, így lehetetlenné válik annak garantálása, hogy a hivatkozott változók érvényesek és elérhetők maradjanak a metódus végrehajtása során (CS1988).
- Ne használjon várakozási kifejezéseketa ref feltételes kifejezésekben. A várakozási művelet felfüggesztheti a végrehajtást, és érvénytelenítheti a feltételes operátor által kiválasztott hivatkozásokat, ami érvénytelenített hivatkozásokat eredményezhet a végrehajtás folytatásakor (CS8325).
- Győződjön meg arról, hogy a ref feltételes operátor mindkét ága hivatkozásokat ad vissza, vagy egyik sem ad vissza hivatkozást, és ha mindkettő hivatkozás, akkor azoknak azonos típusúnak kell lenniük. A feltételes operátornak konzisztens eredménytípust kell létrehoznia, amelyet a hívó kód biztonságosan használhat, függetlenül attól, hogy melyik ág van kiválasztva (CS8326, CS8327).
- Távolítsa el az alapértelmezett értékeket a
refés aoutparaméterekről. A referenciaparamétereket mindig meg kell adni a hívási helyen a paraméter és egy meglévő változó közötti szükséges alias-kapcsolat létrehozásához, így az alapértelmezett értékek szemantikailag értelmetlenek (CS1741). - Ne deklaráljon implicit módon beírt változót
outegy olyan argumentumlistában, amely szintén ugyanarra a változóra hivatkozik. A fordítónak ki kell következtetnie a változó típusát a metódus-aláírásból, miközben egyidejűleg érvényesíti a változó használatát ugyanabban a kifejezésben, és körkörös függőséget (CS8196) hoz létre. - Ne adja át a LINQ lekérdezéstartomány változóit referenciaparaméterként. A tartományváltozók olyan fordító által létrehozott iterációs változók, amelyek élettartamát a lekérdezés-végrehajtási modell felügyeli, és nem rendelkeznek stabil memóriahelyekkel, amelyek biztonságosan hivatkozhatók (CS1939).
- Használjon normál értékváltozókat ahelyett, hogy ref helyi változókat használna az objektumok dekonstruálásakor. A dekonstruálás új változókat hoz létre a dekonstruált értékek fogadásához, és a referenciaváltozók megpróbálják aliasként használni ezeket az ideiglenes értékeket ahelyett, hogy egymástól függetlenül tárolnák őket (CS9072).
- Kerülje több olyan felület implementálását, ahol a metódusok csak a paraméterek módosítóitól
refouteltérőek. A C#-nyelv specifikációja ezeket különálló aláírásként kezeli, de nem teszi lehetővé annak egyértelműsítését, hogy melyik implementációt hívja meg mindkettőref, ésoutugyanazt a hívásszintaxist használja a megvalósítási határokon (CS0767). - Távolítsa el a referenciaparamétereket az System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute-vel dekorált metódusokból. Ezek a metódusok nem felügyelt kódból hívhatók, amelyek nem ismerik a C#referenciabiztonsági szabályait, és nem garantálják a hivatkozott változók megfelelő élettartam-kezelését a felügyelt/nem felügyelt határokon (CS8977).
- A
refmódosítót csak értéktípusokhoz vagy olyan általános típusokhoz használja, amelyek értéktípusokra vannak korlátozva, a bővítmény metódus első paraméterénél. A referenciatípusok a CLR szintjén már referenciaként vannak átadva, és arefhozzáadása referenciára hivatkozást hozna létre, míg arefengedélyezésével rendelkező értéktípus-bővítmények lehetővé teszik a kiterjesztett példány módosítását (CS8337, CS8338). - Ne adjon át windowsos futtatókörnyezeti eseményeket referenciaparaméterként. Ezek az események a Windows futtatókörnyezet típusú rendszert követik, amely a .NET-hivatkozásoktól eltérő élettartamú és szálbefűző szemantikával rendelkezik, és nem támogatja a C# referenciaparaméterek (CS7084) által megkövetelt aliasálási viselkedést.
- Távolítsa el a System.Runtime.InteropServices.OutAttribute-t a
ref readonlyparaméterekből. Ez az attribútum a szemantikák platformhívási forgatókönyvekben való tárolására szolgál, ahol a paraméter iránya csak kimenő, ami ütközik azzal a garanciávalref readonly, hogy a paraméter a meglévő adatokra hivatkozik, amelyek nem lesznek újra hozzárendelve (CS9199). - Konstruktor befejezése előtt győződjön meg arról, hogy egy típus összes
refmezője vagy mező-inicializálókban, vagy a konstruktor minden kódútvonalán hozzá van rendelve. A nem inicializált ref mezők érvénytelen hivatkozásokat tartalmazhatnak, amelyek hozzáférés esetén memóriasérüléshez vezethetnek (CS9201, CS9265). - A referenciatípus-módosítók (
ref,in,out,ref readonly) egyezzenek meg egy metódus és annak felülírt alapmetódusa vagy az implementált interfészmetódus között. A referencia-módosító annak a metódus-aláírási szerződésnek a része, amely szerint a származtatott típusoknak tiszteletben kell tartaniuk a helyettesíthetőséget és a hívókkal kapcsolatos elvárásokat (CS9196, CS9197, CS9198). - Deklarálja a paramétereket
inaz alapértelmezett értékek megadása helyettref readonly.ref readonlyolyan helyzetekhez készült, ahol a hívó egy meglévő változóra mutató hivatkozást ad át, mígina paraméterek a hivatkozásokat és az értékek ideiglenes másolatait is elfogadhatják, így az alapértelmezett értékek értelmezhetők (CS9200).
A referenciaváltozók megengedett helyzetéről további információt a metódusparaméterek, az iterátorok, az aszinkron programozási minták és a C# nyelvi specifikációja című témakörben talál.
unscoped ref Korlátozások
A unscoped paraméterek minősítője ref egyes helyeken nem engedélyezett:
- CS9101: A UnscopedRefAttribute csak strukturált példányra vagy virtuális felületi metódusokra és tulajdonságokra alkalmazható, és nem alkalmazható konstruktorokra vagy csak init-only tagokra.
- CS9102: A UnscopedRefAttribute nem alkalmazható felületi implementációra, mert a implementált tag nem rendelkezik ezzel az attribútummal.
A hibák kijavítása:
- Távolítsa el a
unscopedmódosítót vagy az attribútumot a System.Diagnostics.CodeAnalysis.UnscopedRefAttribute szerkezetkonstruktorokból és a csak init-only tagokból. Ezek a tagok speciális inicializálási szemantikával rendelkeznek, ahol a fordítónak gondoskodnia kell arról, hogy a hivatkozások ne lépik túl az inicializálási fázist, és a nem célzott hivatkozások engedélyezése megsértené azt a garanciát, hogy az inicializálás befejeződik, mielőtt a szerkezet teljesen elérhetővé válik (CS9101). - Távolítsa el a módosítót az
unscopedillesztő implementálási módszereiből, ha a megfelelő illesztőmetódus nem rendelkezik vele. A nem meghatározott jellemző hatással van a metódus szerződésére a referencia-élettartam garanciái tekintetében, és a implementációknak ugyanazt a szerződést kell fenntartaniuk, mint az általuk implementált felületnek, hogy a hívók konzisztens élettartam-viselkedésre támaszkodhassanak, függetlenül attól, hogy melyik implementációt hívják meg (CS9102).
A hatókörrel és a hatókör nélküli hivatkozásokkal kapcsolatos további információkért tekintse meg a metódusparamétereket és az alacsony szintű strukturálási fejlesztések funkcióspecifikációját.
A referenciaváltozókhoz hivatkozni kell
Egy változót argumentumként kell megadnia egy referenciaparaméterhez, hivatkozási visszatéréshez vagy helyi hozzárendelés újbóli hozzárendeléséhez:
-
CS0206: Nem ref-returning tulajdonság vagy indexelő nem használható értékként vagy
outértékkéntref -
CS1510: A
refvagyoutértéknek hozzárendelhető változónak kell lennie
Figyelmeztetések:
-
CS9191: A
refparaméternek megfelelőinargumentum módosító értéke megegyezik ain. Fontolja meg a használatátin. -
CS9192: Az argumentumot meg kell adni a kulcsszóval vagy
refa kulcsszóvalinegyütt. -
CS9193: Az argumentumnak változónak kell lennie, mert egy paraméternek
ref readonlytovábbítja -
CS9195: Az argumentumot a
inkulcsszóval együtt kell átadni
A hibák kijavítása:
- Egy tulajdonság vagy indexelő hozzáférés eredményét egy helyi változóban tárolja, mielőtt referenciaparaméterként ad át. A tulajdonságok és indexelők olyan metódusok , amelyek értékeket adnak vissza ahelyett, hogy közvetlen hozzáférést biztosítanak a tárolóhelyekhez, és a referenciaparaméterekhez egy stabil memóriahelyű, aliasként használható tényleges változóra van szükség (CS0206, CS1510).
- Használja a
inmódosítót arefhelyett, amikor argumentumokat ad át ainparamétereknek. Bárreftechnikailag a visszamenőleges kompatibilitás miatt működik, ainmódosító egyértelműen kifejezi azt a szándékot, hogy az argumentum írásvédett, és másolás nélkül hatékonyabban továbbítható hivatkozásként (CS9191, CS9195). - Adja hozzá a megfelelő hivatkozásmódosítót (
refvagyinref readonly) az argumentumok hivatkozásokat váró paramétereknek való átadásakor. A módosító kihagyása miatt a fordító létrehoz egy ideiglenes másolatot az értékről, ami nem hatékony, és váratlan működéshez vezethet, ha a hívó kód az eredeti változó módosításait (CS9192, CS9193) várja.
A referenciaparaméterekről és a változók referencia alapján történő átadásáról a metódusparaméterekről, a ref kulcsszóról és a C# nyelvi specifikációjáról olvashat bővebben.
A írható referenciaváltozók írható hivatkozási referenciát igényelnek
Egy írható referenciaváltozó megköveteli, hogy a hivatkozó is írható legyen. A következő hibák azt jelzik, hogy a változó nem írható:
-
CS0192: A
readonlymező nem használható értékkéntrefvagyoutértékként (a konstruktor kivételével) -
CS0199: Egy
static readonlymező nem használható értékként vagyrefértékkéntout(statikus konstruktor kivételével) -
CS1605: A változó nem használható értékként vagy
refértékkéntout, mert írásvédett -
CS1649: Egy
readonlymező tagjai nem használhatók értékkéntrefvagyoutértékként (a konstruktor kivételével) -
CS1651: Egy
static readonlymező mezői nem használhatók értékkéntrefvagyoutértékként (statikus konstruktor kivételével) -
CS1655: A típusmezők nem használhatók értékként vagy
refértékkéntout -
CS1657: A változó nem használható értékként vagy
refértékkéntout -
CS8329: A változó nem használható értékként vagy
refértékkéntout, mert írásvédett változó -
CS8330: A változó tagjai nem használhatók értékként vagy
refértékkéntout, mert az egy olvasható változó -
CS8331: Nem rendelhető hozzá a változóhoz, és nem használható a hozzárendelés jobb oldalán
ref, mert az egy könnyen olvasható változó -
CS8332: Nem rendelhető hozzá egy változó taghoz, és nem használható a hozzárendelés jobb oldalán
ref, mert az egy olvasható változó
A hibák kijavítása:
- Másolja az értéket egy írásvédett mezőből egy helyi változóba, és adja át a helyi változót
refvagyoutparaméterként. Az olvasható mezők inicializálás után (a konstruktorok kivételével) nem módosíthatók, és a írható hivatkozások engedélyezése sérti az olvashatóságra vonatkozó garanciát (CS0192, CS0199, CS1649, CS1651). -
ref readonlyvagyinparamétereket használjonrefvagyouthelyett, amikor írásvédett változókat, iterációs változókat vagy más nem írható értékeket kell hivatkozásként átadni. Ezek a módosítók azt jelzik, hogy a metódus csak a hivatkozott értéket olvassa be módosítás nélkül. Ez igazodik az eredeti változó nem módosíthatósági korlátaihoz (CS1605, CS1655, CS1657, CS8329). - Másolja az olvasható változók tagjait a helyi változókba, mielőtt írható hivatkozásként adja át őket. Annak ellenére, hogy maga a tag nem deklarálható írásvédettként, olvasási útvonalon keresztül érhető el (olvasható mezőn,
inparaméteren vagyref readonlyhelyien keresztül), és a fordító kényszeríti az írásvédettség tranzitivitását az olvasási adatok közvetett mutációjának megakadályozása érdekében (CS8330, CS8332). - Kerülje az írható értékek hozzárendelését a csak olvasható változókhoz, foreach iterációs változókhoz, using utasítás erőforrásaihoz, vagy fixed utasítás változóihoz. Ezek a változók speciális, élettartamra vonatkozó szemantikával rendelkeznek, amelyet a fordítóprogram kezel. A változó automatikusan véglegesítve lesz, vagy a hatókör végén lesz megsemmisítve. A külső hivatkozások megszüntetés után lógó hivatkozásokat hoznak létre (CS8331).
Az olvashatatlan szemantikáról és a referencia paraméterekről további információk a readonly kulcsszó, in paraméter módosító, ref readonly és a C# nyelvi specifikáció-ban találhatók.