Udostępnij za pomocą


Pola (Przewodnik programowania w języku C#)

Pole jest zmienną dowolnego typu, który jest zadeklarowany bezpośrednio w klasie lub struktury. Pola są składnikami ich typu zawierającego.

Klasa lub struktura może mieć pola wystąpienia, pola statyczne lub oba te pola. Pola wystąpienia są specyficzne dla określonego wystąpienia typu. Jeśli masz klasę T, z polem wystąpienia F, możesz utworzyć dwa obiekty typu T, i zmodyfikować wartość F w każdym obiekcie bez wpływu na wartość w drugim obiekcie. Z kolei pole statyczne należy do samego typu i jest współużytkowane przez wszystkie wystąpienia tego typu. Dostęp do pola statycznego można uzyskać tylko przy użyciu nazwy typu. Jeśli uzyskujesz dostęp do pola statycznego według nazwy wystąpienia, zostanie wyświetlony błąd CS0176 w czasie kompilacji.

Ogólnie rzecz biorąc, należy zadeklarować private lub protected dostępność dla pól. Dane, które twój typ udostępnia kodowi klienta, powinny być udostępniane za pomocą metod, właściwości i indeksatorów. Korzystając z tych konstrukcji na potrzeby pośredniego dostępu do pól wewnętrznych, można chronić przed nieprawidłowymi wartościami wejściowymi. Pole prywatne, które przechowuje dane uwidocznione przez właściwość publiczną, jest nazywane magazynem danych lub polem pomocniczym. Możesz zadeklarować public pola, ale nie jesteś w stanie zapobiec temu, żeby kod używający Twojego typu ustawił to pole na nieprawidłową wartość lub w inny sposób zmienił dane obiektu.

Pola zwykle przechowują dane, które muszą być dostępne dla więcej niż jednej metody typu i muszą być przechowywane przez dłuższy niż okres istnienia dowolnej pojedynczej metody. Na przykład typ reprezentujący datę kalendarza może zawierać trzy pola całkowite: jeden dla miesiąca, jeden dzień i jeden dla roku. Zmienne, które nie są używane poza zakresem pojedynczej metody, powinny być deklarowane jako zmienne lokalne w samej treści metody.

Pola są deklarowane w bloku klasy lub struktury, określając poziom dostępu, a następnie typ, a następnie nazwę pola. Przykład:

public class CalendarEntry
{

    // private field (Located near wrapping "Date" property).
    private DateTime _date;

    // Public property exposes _date field safely.
    public DateTime Date
    {
        get
        {
            return _date;
        }
        set
        {
            // Set some reasonable boundaries for likely birth dates.
            if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
            {
                _date = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("Date");
            }
        }
    }

    // public field (Generally not recommended).
    public string? Day;

    // Public method also exposes _date field safely.
    // Example call: birthday.SetDate("1975, 6, 30");
    public void SetDate(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        // Set some reasonable boundaries for likely birth dates.
        if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
        {
            _date = dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }

    public TimeSpan GetTimeSpan(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt.Ticks < _date.Ticks)
        {
            return _date - dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }
}

Aby uzyskać dostęp do pola w wystąpieniu, dodaj kropkę po nazwie wystąpienia, a następnie nazwę pola, jak w pliku instancename._fieldName. Przykład:

CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";

Pole może mieć wartość początkową przy użyciu operatora przypisania, gdy pole jest zadeklarowane. Aby automatycznie przypisać pole Day do elementu "Monday", na przykład, można zadeklarować Day tak, jak w poniższym przykładzie:

public class CalendarDateWithInitialization
{
    public string Day = "Monday";
    //...
}

Inicjowanie pól następuje bezpośrednio przed wywołaniem konstruktora dla instancji obiektu. Jeśli konstruktor przypisuje wartość pola, nadpisuje dowolną wartość podaną podczas deklaracji pola. Aby uzyskać więcej informacji, zobacz Using Constructors (Używanie konstruktorów).

Uwaga / Notatka

Inicjator pola nie może odwoływać się do innych pól wystąpienia.

Pola można oznaczyć jako public, , privateprotected, internal, protected internal, lub private protected. Te modyfikatory dostępu definiują, jak użytkownicy typu mogą uzyskiwać dostęp do pól. Aby uzyskać więcej informacji, zobacz Modyfikatory dostępu.

Opcjonalnie można zadeklarować staticpole . Pola statyczne są dostępne dla osób wywołujących w dowolnym momencie, nawet jeśli żadne wystąpienie typu nie istnieje. Aby uzyskać więcej informacji, zobacz Klasy statyczne i składowe klas statycznych.

Można zadeklarować readonlypole . Pole tylko do odczytu może mieć przypisaną wartość tylko podczas inicjalizacji lub w konstruktorze. static readonly Pole jest podobne do stałej, z tą różnicą, że kompilator języka C# nie ma dostępu do wartości statycznego pola tylko do odczytu w czasie kompilacji, tylko w czasie wykonywania. Aby uzyskać więcej informacji, zobacz Stałe.

Można zadeklarować requiredpole . Wymagane pole musi zostać zainicjowane przez konstruktora lub przez inicjatory obiektów podczas tworzenia obiektu. Dodajesz atrybut System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute do dowolnej deklaracji konstruktora, która inicjuje wszystkich wymaganych członków.

Modyfikator required nie może być połączony z modyfikatorem readonly w tym samym polu. Jednak tylko właściwość może być required i init.

Począwszy od języka C# 12, podstawowe parametry konstruktora są alternatywą dla deklarowania pól. Jeśli typ ma zależności, które należy podać podczas inicjowania, można utworzyć podstawowy konstruktor, który zapewnia te zależności. Te parametry mogą być przechwytywane i używane zamiast zadeklarowanych pól w typach. W przypadku record typów podstawowe parametry konstruktora są udostępniane jako właściwości publiczne.

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz także