Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Tip
Är du nybörjare på att utveckla programvara? Börja med självstudierna Komma igång först. Du blir bekväm med klasser, metoder och loopar där.
Har du erfarenhet av ett annat språk? Den här handledningen fokuserar på C#-records egenskaper som du använder varje dag: värdeekvivalens, positionssyntax och with uttryck.
I den här självstudien skapar du en konsolapp som modellerar dagliga temperaturer med hjälp av poster och poststrukturer.
I den här tutorialen lär du dig följande:
- Deklarera positionella poster och poststrukturer.
- Skapa en liten posthierarki.
- Använd kompilatorgenererad likhet och formatering.
- Använd
withuttryck för icke-förstörande mutation.
Förutsättningar
- Den senaste versionen av .NET SDK
- Visual Studio Code redigeringsverktyg
- C# DevKit
Installationsanvisningar
På Windows används den här WinGet-konfigurationsfilen för att installera alla krav. Om du redan har något installerat hoppar WinGet över det steget.
- Ladda ned filen och dubbelklicka för att köra den.
- Läs licensavtalet, skriv yoch välj Ange när du uppmanas att acceptera.
- Om du får en flashande UAC-fråga (User Account Control) i aktivitetsfältet tillåter du att installationen fortsätter.
På andra plattformar måste du installera var och en av dessa komponenter separat.
- Ladda ned det rekommenderade installationsprogrammet från nedladdningssidan .NET SDK och dubbelklicka för att köra det. Nedladdningssidan identifierar din plattform och rekommenderar den senaste installationsprogrammet för din plattform.
- Ladda ned det senaste installationsprogrammet från startsidan Visual Studio Code och dubbelklicka för att köra det. Den sidan identifierar även din plattform och länken bör vara korrekt för ditt system.
- Klicka på knappen "Installera" på sidan C# DevKit tillägg. Då öppnas Visual Studio-kod och du tillfrågas om du vill installera eller aktivera tillägget. Välj "installera".
Skapa appen och din första post
Skapa en mapp för din app, kör dotnet new consoleoch öppna det genererade projektet.
Lägg till en fil med namnet DailyTemperature.csoch lägg till en position för readonly record struct temperaturvärden:
public readonly record struct DailyTemperature(double HighTemp, double LowTemp)
{
public double Mean => (HighTemp + LowTemp) / 2.0;
}
Lägg till en fil med namnet Program.csoch skapa exempeltemperaturdata:
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)
];
Den här syntaxen ger dig koncis datamodellering med oföränderlig värdesemantik.
Lägg till beteende i record-struct
I DailyTemperature.cs har record-strukturen redan en beräknad Mean-egenskap:
public double Mean => (HighTemp + LowTemp) / 2.0;
En record struct fungerar bra här eftersom varje värde är litet och självförsörjande.
Skapa posttyper för examensdagsberäkningar
Anmärkning
Uppvärmningsgraderdagar och kylgraderdagar mäter hur mycket den dagliga medeltemperaturen avviker från en bastemperatur (vanligtvis 65°F/18°C). Uppvärmningsdygnsgrader ackumuleras på kalla dagar när genomsnittet är under basen, medan kylningsdygnsgrader ackumuleras på varma dagar när genomsnittet är över basen. Dessa beräkningar hjälper till att uppskatta energiförbrukning för värme- eller kylbyggnader, vilket gör dem användbara för allmännyttiga företag, byggchefer och klimatanalys.
Skapa en fil med namnet DegreeDays.cs med en hierarki för beräkningar av uppvärmning och kylning av graddagar:
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);
}
Beräkna nu summor från din Main metod i Program.cs:
var heatingDegreeDays = new HeatingDegreeDays(65, data);
Console.WriteLine(heatingDegreeDays);
var coolingDegreeDays = new CoolingDegreeDays(65, data);
Console.WriteLine(coolingDegreeDays);
De genererade ToString utdata är användbara för snabb diagnostik medan du itererar.
Åsidosätt PrintMembers för att anpassa utdata
När standardutdata innehåller för mycket brus åsidosätter du PrintMembers i basposten:
protected virtual bool PrintMembers(StringBuilder stringBuilder)
{
stringBuilder.Append($"BaseTemperature = {BaseTemperature}");
return true;
}
Åsidosättningen håller utdata fokuserade på den information du behöver.
Använd med uttryck för icke-förstörande ändring
Använd with för att skapa ändrade kopior utan att ändra den ursprungliga posten:
// Growing degree days measure warming to determine plant growing rates
var growingDegreeDays = coolingDegreeDays with { BaseTemperature = 41 };
Console.WriteLine(growingDegreeDays);
Utöka den idén för att beräkna rullande summor från utdrag av dina indata.
// 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);
}
Den här metoden är användbar när du behöver transformeringar medan du bevarar ursprungliga värden.
Nästa steg
- Granska C#-posttyper för djupare vägledning.
- Fortsätt med Objektorienterad C# för bredare designmönster.
- Utforska Konvertering av typer för att kombinera poster med säkra konverteringsmönster.