Velden (C#-programmeerhandleiding)
Een veld is een variabele van elk type dat rechtstreeks in een klasse of struct wordt gedeclareerd. Velden zijn leden van hun type.
Een klasse of struct kan exemplaarvelden, statische velden of beide bevatten. Exemplaarvelden zijn specifiek voor een exemplaar van een type. Als u een klasse T
hebt, met een exemplaarveld F
, kunt u twee objecten van het type T
maken en de waarde van F
elk object wijzigen zonder dat dit van invloed is op de waarde in het andere object. Een statisch veld behoort daarentegen tot het type zelf en wordt gedeeld tussen alle exemplaren van dat type. U hebt alleen toegang tot het statische veld met behulp van de typenaam. Als u het statische veld opent op basis van de naam van een exemplaar, krijgt u de compilatietijdfout CS0176 .
Over het algemeen moet u velden declareren private
of protected
toegankelijkheid opgeven. Gegevens die uw type beschikbaar maakt voor clientcode, moeten worden opgegeven via methoden, eigenschappen en indexeerfuncties. Door deze constructies te gebruiken voor indirecte toegang tot interne velden, kunt u voorkomen dat er ongeldige invoerwaarden zijn. Een privéveld waarin de gegevens worden opgeslagen die door een openbare eigenschap worden weergegeven, wordt een back-uparchief - of back-upveld genoemd. U kunt velden declareren public
, maar u kunt niet voorkomen dat code die uw type gebruikt, dat veld instelt op een ongeldige waarde of op een andere manier de gegevens van een object wijzigt.
In velden worden doorgaans de gegevens opgeslagen die toegankelijk moeten zijn voor meer dan één typemethode en moeten ze langer dan de levensduur van een enkele methode worden opgeslagen. Een type dat een kalenderdatum vertegenwoordigt, kan bijvoorbeeld drie gehele getallen bevatten: één voor de maand, één voor de dag en één voor het jaar. Variabelen die niet buiten het bereik van één methode worden gebruikt, moeten worden gedeclareerd als lokale variabelen binnen de hoofdtekst van de methode.
Velden worden gedeclareerd in het klasse- of structblok door het toegangsniveau op te geven, gevolgd door het type, gevolgd door de naam van het veld. Voorbeeld:
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");
}
}
}
Als u toegang wilt krijgen tot een veld in een exemplaar, voegt u een punt toe na de naam van het exemplaar, gevolgd door de naam van het veld, zoals in instancename._fieldName
. Voorbeeld:
CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";
Een veld kan een initiële waarde krijgen met behulp van de toewijzingsoperator wanneer het veld wordt gedeclareerd. Als u het Day
veld automatisch wilt toewijzen aan "Monday"
, bijvoorbeeld, zou u declareren Day
zoals in het volgende voorbeeld:
public class CalendarDateWithInitialization
{
public string Day = "Monday";
//...
}
Velden worden direct geïnitialiseerd voordat de constructor voor het objectexemplaren wordt aangeroepen. Als de constructor de waarde van een veld toewijst, overschrijft deze een waarde die is opgegeven tijdens de velddeclaratie. Zie Constructors gebruiken voor meer informatie.
Notitie
Een veld initialisatiefunctie kan niet verwijzen naar andere exemplaarvelden.
Velden kunnen worden gemarkeerd als public
, private
, protected
, internal
, of protected internal
private protected
. Deze toegangsaanpassingen bepalen hoe gebruikers van het type toegang hebben tot de velden. Zie Toegangsmodifiers voor meer informatie.
Een veld kan eventueel worden gedeclareerd static
. Statische velden zijn op elk gewenst moment beschikbaar voor bellers, zelfs als er geen exemplaar van het type bestaat. Zie Statische klassen en statische klasseleden voor meer informatie.
Een veld kan worden gedeclareerd readonly
. Aan een alleen-lezenveld kan alleen een waarde worden toegewezen tijdens de initialisatie of in een constructor. Een static readonly
veld is vergelijkbaar met een constante, behalve dat de C#-compiler geen toegang heeft tot de waarde van een statisch alleen-lezenveld tijdens het compileren, alleen tijdens runtime. Zie Constanten voor meer informatie.
Een veld kan worden gedeclareerd required
. Een vereist veld moet worden geïnitialiseerd door de constructor of door object initialisaties wanneer een object wordt gemaakt. U voegt het System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute kenmerk toe aan een constructordeclaratie waarmee alle vereiste leden worden geïnitialiseerd.
De required
wijzigingsfunctie kan niet worden gecombineerd met de readonly
wijzigingsfunctie in hetzelfde veld. De eigenschap kan echter wel en init
alleen.required
Vanaf C# 12 zijn primaire constructorparameters een alternatief voor het declareren van velden. Wanneer uw type afhankelijkheden bevat die moeten worden opgegeven bij de initialisatie, kunt u een primaire constructor maken die deze afhankelijkheden biedt. Deze parameters kunnen worden vastgelegd en gebruikt in plaats van gedeclareerde velden in uw typen. In het geval van record
typen worden primaire constructorparameters weergegeven als openbare eigenschappen.
C#-taalspecificatie
Zie de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.