Pola (Przewodnik programowania w języku C#)
Pole jest zmienną dowolnego typu, który jest zadeklarowany bezpośrednio w klasie lub struktury. Pola są członkami 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 wystąpienia typu. Jeśli masz klasę T
, z polem F
wystąpienia , możesz utworzyć dwa obiekty typu T
i zmodyfikować wartość F
w każdym obiekcie bez wpływu na wartość w innym 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
ułatwienia dostępu dla pól. Dane udostępniane przez typ kodu 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 zapasowym lub polem zapasowym. Możesz zadeklarować public
pola, ale nie można uniemożliwić kodowi, który używa typu, ustawiając to pole na nieprawidłową wartość lub zmieniając w inny sposób 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. Na 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
. Na 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ć Day
pole do "Monday"
elementu , należy na przykład zadeklarować Day
je tak, jak w poniższym przykładzie:
public class CalendarDateWithInitialization
{
public string Day = "Monday";
//...
}
Pola są inicjowane bezpośrednio przed wywołaniem konstruktora dla wystąpienia obiektu. Jeśli konstruktor przypisuje wartość pola, zastępuje dowolną wartość podaną podczas deklaracji pola. Aby uzyskać więcej informacji, zobacz Using Constructors (Używanie konstruktorów).
Uwaga
Inicjator pola nie może odwoływać się do innych pól wystąpienia.
Pola można oznaczyć jako public
, , private
protected
, 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ć static
pole . 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ć readonly
pole . Pole tylko do odczytu można przypisać tylko podczas inicjowania 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ć required
pole . Wymagane pole musi zostać zainicjowane przez konstruktora lub przez inicjatory obiektów podczas tworzenia obiektu. Atrybut należy dodać do dowolnej deklaracji konstruktora System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute , która inicjuje wszystkie wymagane elementy członkowskie.
Modyfikator required
nie może być połączony z modyfikatorem readonly
w tym samym polu. Jednak właściwość może być required
i init
tylko.
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#.