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.
| Tulajdonság | Érték |
|---|---|
| Szabályazonosító | CA1822 |
| Cím | Tagok megjelölése statikusként |
| Kategória | Teljesítmény |
| A javítás romboló vagy nem romboló | Nem törés – Ha az elem nem látható az összeállításon kívül, függetlenül a végrehajtott módosítástól. Nem törik a kompatibilitás – Ha csak a this kulcsszóval rendelkező tagot módosítja példánytaggá.Kompatibilitástörő – Ha a tagot egy példánytagról statikus tagra módosítja, és az a szerelvényen kívül látható. |
| Alapértelmezés szerint engedélyezve a .NET 10-ben | Javaslatként |
| Alkalmazandó nyelvek | C# és Visual Basic |
Ok
A példányadatokhoz nem hozzáférő tag nincs statikusként megjelölve (a Visual Basicben megosztva).
Szabály leírása
Azok a tagok, amelyek nem férnek hozzá a példányadatokhoz, vagy nem hívnak példány-metódusokat, statikusként (a Visual Basic-ben *Shared*) jelölhetők meg. Miután statikusként jelöli meg a metódusokat, a fordító nem virtuális hívási helyeket állít elő ezekhez a tagokhoz. A nem virtuális hívási helyek kibocsátásának elkerülése megakadályozza, hogy minden hívás esetén futásidőben ellenőrzés történjen annak biztosítására, hogy az aktuális objektummutató ne legyen null értékű. Ez mérhető teljesítménynövekedést érhet el a teljesítményérzékeny kód esetében. Bizonyos esetekben az aktuális objektumpéldány elérésének sikertelensége helyességi problémát jelent.
Szabálysértések kijavítása
Jelölje meg a tagot statikusként (vagy "Shared"-ként a Visual Basicben), vagy ha szükséges, használja az 'this'/'Me' kifejezést a metódus törzsében.
Example
public class Printer
{
private readonly List<char> _items = [
'H', 'e', 'l', 'l', 'o',
];
public void PrintHello()
{
BadPrintHelloInternal();
GoodPrintHelloInternal();
GoodPrintHelloStaticInternal();
}
// This method violates the rule.
private void BadPrintHelloInternal()
{
Console.WriteLine("Hello");
}
// This methods satisfies the rule.
private void GoodPrintHelloInternal()
{
Console.WriteLine(string.Join(string.Empty, this._items));
}
private static void GoodPrintHelloStaticInternal()
{
Console.WriteLine("Hello");
}
}
Mikor kell letiltani a figyelmeztetéseket?
A következő esetekben biztonságosan elnyomhatja a szabály figyelmeztetését:
- A korábban kiszállított kódok esetében, amelyek esetében a javítás kompatibilitástörő változást jelentene.
- Azoknak az osztályoknak a metódusai esetében, amelyek örökölnek a MarshalByRefObject osztályból. Az ezekben az osztályokban lévő metódusokat nem szabad statikusként megjelölni, mert a .NET-remoting infrastruktúra példányküldéssel továbbítja a hívásokat az AppDomain-határokon. Az ilyen módszerek statikussá tétele megszakíthatja a távoli elérést az AppDomain-határokon.
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA1822
// The code that's violating the rule is on this line.
#pragma warning restore CA1822
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA1822.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.
Kód konfigurálása elemzéshez
A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.
Ezt a beállítást konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában (Teljesítmény) érvényes összes szabályra. További információ: Kódminőségi szabály konfigurációs beállításai.
Adott API-felületek belefoglalása
A api_surface beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa a szabályt az akadálymentességük alapján. Ha például meg szeretné adni, hogy a szabály csak a nem nyilvános API-felületen fusson, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Jegyzet
Cserélje le a XXXXCAXXXX részét a vonatkozó szabály azonosítójára.