Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Tip
Nieuw bij het ontwikkelen van software? Begin eerst met de handleiding Aan de slag. Je raakt hier vertrouwd met klassen, methoden en lussen.
Ervaren in een andere taal? Deze zelfstudie is gericht op C#-recordfuncties die u elke dag gebruikt: gelijkheid van waarden, positionele syntaxis en with expressies.
In deze zelfstudie bouwt u een console-app die dagelijkse temperaturen modelleert met behulp van records en recordstructs.
In deze handleiding leer je hoe je:
- Positiegebonden records en recordstructs declareren.
- Bouw een kleine recordhiërarchie.
- Gebruik door compiler gegenereerde gelijkheid en opmaak.
- Gebruik
withexpressies voor niet-destructieve mutatie.
Vereiste voorwaarden
- De nieuwste .NET SDK
- Visual Studio Code editor
- De C# DevKit
Installatie-instructies
Op Windows wordt dit WinGet-configuratiebestand gebruikt om alle vereisten te installeren. Als u al iets hebt geïnstalleerd, slaat WinGet die stap over.
- Download het bestand en dubbelklik erop om het uit te voeren.
- Lees de gebruiksrechtovereenkomst, typ yen selecteer Enter wanneer u wordt gevraagd om te accepteren.
- Als u een knipperende UAC-prompt (User Account Control) krijgt op de taakbalk, staat u de installatie toe om door te gaan.
Op andere platforms moet u elk van deze onderdelen afzonderlijk installeren.
- Download het aanbevolen installatieprogramma op de downloadpagina van de .NET SDK en dubbelklik erop om het uit te voeren. De downloadpagina detecteert uw platform en raadt het meest recente installatieprogramma voor uw platform aan.
- Download het meest recente installatieprogramma op de startpagina van Visual Studio Code en dubbelklik erop om het uit te voeren. Deze pagina detecteert ook uw platform en de koppeling moet juist zijn voor uw systeem.
- Klik op de knop Installeren op de pagina C# DevKit extensie. Hiermee wordt Visual Studio code geopend en wordt gevraagd of u de extensie wilt installeren of inschakelen. Selecteer 'installeren'.
De app en uw eerste record maken
Maak een map voor uw app, voer het uit dotnet new consoleen open het gegenereerde project.
Voeg een bestand met de naam DailyTemperature.cstoe en voeg een positie readonly record struct toe voor temperatuurwaarden:
public readonly record struct DailyTemperature(double HighTemp, double LowTemp)
{
public double Mean => (HighTemp + LowTemp) / 2.0;
}
Voeg een bestand toe met de naam Program.csen maak voorbeeldtemperatuurgegevens:
private static DailyTemperature[] data = [
new DailyTemperature(HighTemp: 57, LowTemp: 30),
new DailyTemperature(60, 35),
new DailyTemperature(63, 33),
new DailyTemperature(68, 29),
new DailyTemperature(72, 47),
new DailyTemperature(75, 55),
new DailyTemperature(77, 55),
new DailyTemperature(72, 58),
new DailyTemperature(70, 47),
new DailyTemperature(77, 59),
new DailyTemperature(85, 65),
new DailyTemperature(87, 65),
new DailyTemperature(85, 72),
new DailyTemperature(83, 68),
new DailyTemperature(77, 65),
new DailyTemperature(72, 58),
new DailyTemperature(77, 55),
new DailyTemperature(76, 53),
new DailyTemperature(80, 60),
new DailyTemperature(85, 66)
];
Deze syntaxis biedt beknopte gegevensmodellering met onveranderbare waardesemantiek.
Gedrag toevoegen aan de recordstruct
In DailyTemperature.csheeft de recordstruct al een berekende Mean eigenschap:
public double Mean => (HighTemp + LowTemp) / 2.0;
Een recordstruct werkt hier goed omdat elke waarde klein en zelfstandig is.
Recordtypen maken voor graaddagberekeningen
Opmerking
Verwarmingsdagen en koeldagen meten hoeveel de dagelijkse gemiddelde temperatuur afwijkt van een basistemperatuur (meestal 65°F/18°C). Verwarmingsgraaddagen worden op koude dagen geaccumuleerd wanneer het gemiddelde lager is dan de basiswaarde, terwijl koelingsgraaddagen op warme dagen worden geaccumuleerd wanneer het gemiddelde boven de basiswaarde ligt. Deze berekeningen helpen bij het schatten van het energieverbruik voor verwarmings- of koelgebouwen, waardoor ze nuttig zijn voor nutsbedrijven, bouwmanagers en klimaatanalyse.
Maak een bestand met de naam DegreeDays.cs met een hiërarchie voor berekeningen van verwarmings- en koeldagen:
public abstract record DegreeDays(double BaseTemperature, IEnumerable<DailyTemperature> TempRecords);
public sealed record HeatingDegreeDays(double BaseTemperature, IEnumerable<DailyTemperature> TempRecords)
: DegreeDays(BaseTemperature, TempRecords)
{
public double DegreeDays => TempRecords.Where(s => s.Mean < BaseTemperature).Sum(s => BaseTemperature - s.Mean);
}
public sealed record CoolingDegreeDays(double BaseTemperature, IEnumerable<DailyTemperature> TempRecords)
: DegreeDays(BaseTemperature, TempRecords)
{
public double DegreeDays => TempRecords.Where(s => s.Mean > BaseTemperature).Sum(s => s.Mean - BaseTemperature);
}
Bereken nu totalen van uw Main methode in Program.cs:
var heatingDegreeDays = new HeatingDegreeDays(65, data);
Console.WriteLine(heatingDegreeDays);
var coolingDegreeDays = new CoolingDegreeDays(65, data);
Console.WriteLine(coolingDegreeDays);
De gegenereerde ToString uitvoer is handig voor snelle diagnoses tijdens iteraties.
Overschrijf PrintMembers om de uitvoer aan te passen
Wanneer de standaarduitvoer te veel ruis bevat, overschrijven PrintMembers in de basisrecord:
protected virtual bool PrintMembers(StringBuilder stringBuilder)
{
stringBuilder.Append($"BaseTemperature = {BaseTemperature}");
return true;
}
De overschrijving houdt de uitvoer gericht op de informatie die u nodig hebt.
Gebruik met uitdrukkingen voor niet-destructieve mutatie
Gebruik with om gewijzigde kopieën te maken zonder het oorspronkelijke gegevensrecord te wijzigen.
// Growing degree days measure warming to determine plant growing rates
var growingDegreeDays = coolingDegreeDays with { BaseTemperature = 41 };
Console.WriteLine(growingDegreeDays);
Breid dit idee uit om lopende totalen te berekenen bij segmenten van uw gegevensinvoer.
// showing moving accumulation of 5 days using range syntax
List<CoolingDegreeDays> movingAccumulation = new();
int rangeSize = (data.Length > 5) ? 5 : data.Length;
for (int start = 0; start < data.Length - rangeSize; start++)
{
var fiveDayTotal = growingDegreeDays with { TempRecords = data[start..(start + rangeSize)] };
movingAccumulation.Add(fiveDayTotal);
}
Console.WriteLine();
Console.WriteLine("Total degree days in the last five days");
foreach(var item in movingAccumulation)
{
Console.WriteLine(item);
}
Deze methode is handig wanneer u transformaties nodig hebt terwijl u oorspronkelijke waarden behoudt.
Volgende stappen
- Bekijk C#-recordtypen voor uitgebreidere richtlijnen.
- Ga verder met objectgeoriënteerde C# voor bredere ontwerppatronen.
- Verken conversietypen om records te combineren met veilige conversiepatronen.