Udostępnij przez


Alokacje logiczne boxed

W tym artykule opisano szczegółowe informacje o wydajności dla alokacji logicznych w polu.

Przyczyna

Wartości logiczne boksu na platformie .NET tworzą alokacje sterty za każdym razem, gdy bool element jest konwertowany na typ interfejsu object lub . Te alokacje, choć małe, mogą szybko gromadzić się w ścieżkach kodu o krytycznym znaczeniu dla wydajności i powodować niepotrzebne wykorzystanie pamięci, zwłaszcza gdy te same wartości logiczne są wielokrotnie w pudełku.

Opis szczegółowych informacji o wydajności

Gdy wartość logiczna jest w polu, środowisko uruchomieniowe przydziela nowy obiekt na stercie, aby opakować typ wartości. Ponieważ istnieją tylko dwie możliwe wartości logiczne (true i false), wielokrotne boxing tych wartości jest marnujące. Zamiast zezwalać na niejawne boksowanie, bardziej wydajne jest buforowanie boxowanych wystąpień i ponowne użycie ich. Możesz utworzyć statyczne pola readonly dla pól i true wartości oraz false zwrócić odpowiednie wystąpienie buforowane w razie potrzeby.

Jak zbadać ostrzeżenie

Kliknij link Zbadaj , aby przejść do widoku Alokacja pokazującego przydzielone obiekty logiczne. Dwukrotne kliknięcie alokacji spowoduje wyświetlenie ścieżek kodu, w których występują alokacje. Rozważ zmniejszenie tych alokacji przez buforowanie wartości logicznych w polu i zwracanie buforowanych wystąpień zamiast zezwalać na powtarzające się operacje boxingu.

Jeśli opcja Copilot jest włączona, zostanie wyświetlony przycisk Ask Copilot Zrzut ekranu przedstawiający przycisk Zapytaj Copilot. Wybierz przycisk, a Copilot udostępnia szczegółową analizę wzorców alokacji i sugeruje poprawki kodu w celu zoptymalizowania użycia pamięci.

Oto przykład alokacji wartości logicznej w polu i jego rozwiązania:

Naruszenie:

class Example
{
    public object GetResult(bool condition)
    {
        return condition; // Implicit boxing occurs here
    }
}

Rozwiązanie:

class Example
{
    private static readonly object BoxedTrue = true;
    private static readonly object BoxedFalse = false;

    public object GetResult(bool condition)
    {
        return condition ? BoxedTrue : BoxedFalse;
    }
}

Dodatkowe zasoby

Aby uzyskać więcej informacji na temat unikania alokacji boksu i innych najlepszych rozwiązań dotyczących wydajności, zobacz następujące zasoby:

Boxing and Unboxing (Przewodnik programowania w języku C#)

CA1841: Preferuj metodę Dictionary.Contains (analiza kodu)

Postępując zgodnie z tymi wytycznymi, możesz upewnić się, że aplikacja jest zoptymalizowana pod kątem wydajności i unika niepotrzebnych obciążeń związanych z boksem.