Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Tip
Novità dello sviluppo di software? Iniziare prima con le esercitazioni introduttive . Ci si abitua a classi, metodi e cicli lì.
Esperienza in un'altra lingua? Questa esercitazione è incentrata sulle funzionalità dei record C# usate ogni giorno: uguaglianza dei valori, sintassi posizionale ed with espressioni.
In questa esercitazione si crea un'applicazione console per modellare le temperature giornaliere usando record e struct record.
In questa esercitazione apprenderai a:
- Dichiarare record posizionali e strutture registrate.
- Creare una gerarchia di record di piccole dimensioni.
- Usare l'uguaglianza e la formattazione generate dal compilatore.
- Usa le espressioni
withper una modifica non distruttiva.
Prerequisites
- La versione più recente .NET SDK
- Visual Studio Code editor
- Il DevKit C#
Istruzioni per l'installazione
Su Windows, usa questo file di configurazione WinGet per installare tutti i prerequisiti. Se è già installato un elemento, WinGet ignorerà questo passaggio.
- Scaricare il file e fare doppio clic per eseguirlo.
- Leggere il contratto di licenza, digitare ye selezionare Immettere quando viene richiesto di accettare.
- Se viene visualizzato un prompt di controllo dell'account utente lampeggiante nella barra delle applicazioni, consentire all'installazione di continuare.
In altre piattaforme è necessario installare ognuno di questi componenti separatamente.
- Scaricare il programma di installazione consigliato dalla pagina di download .NET SDK e fare doppio clic per eseguirlo. La pagina di download rileva la piattaforma e consiglia il programma di installazione più recente per la piattaforma.
- Scaricare il programma di installazione più recente dalla home page Visual Studio Code e fare doppio clic per eseguirlo. Questa pagina rileva anche la tua piattaforma e il collegamento dovrebbe essere corretto per il tuo sistema.
- Fare clic sul pulsante "Installa" nella pagina dell'estensione C# DevKit. Si apre Visual Studio Code e ti chiede se vuoi installare o abilitare l'estensione. Seleziona "install".
Crea la tua app e il tuo primo record
Creare una cartella per l'app, eseguire dotnet new consolee aprire il progetto generato.
Aggiungere un file denominato DailyTemperature.cse aggiungere una posizione readonly record struct per i valori di temperatura:
public readonly record struct DailyTemperature(double HighTemp, double LowTemp)
{
public double Mean => (HighTemp + LowTemp) / 2.0;
}
Aggiungere un file denominato Program.cse creare dati di temperatura di esempio:
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)
];
Questa sintassi offre una modellazione concisa dei dati con semantica dei valori non modificabili.
Aggiungere il comportamento allo struct del record
In DailyTemperature.cs lo struct di record ha già una proprietà calcolata Mean :
public double Mean => (HighTemp + LowTemp) / 2.0;
Uno struct record funziona bene qui perché ogni valore è piccolo e autonomo.
Creare i tipi di record per i calcoli dei giorni-grado
Note
I giorni di riscaldamento e i giorni di raffreddamento misurano la quantità di temperatura media giornaliera deviata da una temperatura base (in genere 65°F/18°C). I giorni di riscaldamento si accumulano nei giorni freddi quando la media è inferiore alla base, mentre i giorni di raffreddamento si accumulano nei giorni caldi quando la media è al di sopra della base. Questi calcoli aiutano a stimare il consumo di energia per gli edifici di riscaldamento o raffreddamento, rendendoli utili per le aziende di utilità, gli edifici e l'analisi del clima.
Creare un file denominato DegreeDays.cs con una struttura gerarchica per i calcoli dei gradi giorno di riscaldamento e raffreddamento.
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);
}
Ora calcola i totali dal metodo Main in Program.cs.
var heatingDegreeDays = new HeatingDegreeDays(65, data);
Console.WriteLine(heatingDegreeDays);
var coolingDegreeDays = new CoolingDegreeDays(65, data);
Console.WriteLine(coolingDegreeDays);
L'output generato ToString è utile per la diagnostica rapida durante l'iterazione.
Effettuare l'override di PrintMembers per personalizzare l'output
Quando l'output predefinito include troppo rumore, eseguire l'override PrintMembers nel record di base:
protected virtual bool PrintMembers(StringBuilder stringBuilder)
{
stringBuilder.Append($"BaseTemperature = {BaseTemperature}");
return true;
}
L'override mantiene l'output incentrato sulle informazioni necessarie.
Usare con espressioni per la modifica non distruttiva
Usare with per creare copie modificate senza modificare il record originale:
// Growing degree days measure warming to determine plant growing rates
var growingDegreeDays = coolingDegreeDays with { BaseTemperature = 41 };
Console.WriteLine(growingDegreeDays);
Estendere questa idea per calcolare i totali progressivi dalle porzioni dei dati di input.
// 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);
}
Questo approccio è utile quando sono necessarie trasformazioni mantenendo i valori originali.
Passaggi successivi
- Esaminare i tipi di record C# per indicazioni più approfondite.
- Continuare con C# orientato agli oggetti per modelli di progettazione più ampi.
- Esplora conversione dei tipi per combinare i record utilizzando modelli di conversione sicuri.