Kayıt türlerini kullanma

Tavsiye

Yazılım geliştirme konusunda yeni misiniz? İlk olarak Başlangıç öğreticileri ile başlayın. Sınıflara, metotlara ve döngülere alışkınsınız.

Başka bir dilde mi deneyimlisiniz? Bu öğreticide, her gün kullandığınız C# kayıt özelliklerine odaklanılmıştır: değer eşitliği, konumsal söz dizimi ve with ifadeler.

Bu öğreticide, kayıtları ve kayıt yapılarını kullanarak günlük sıcaklıkları modelleyen bir konsol uygulaması oluşturacaksınız.

Bu eğitimde şunları öğreniyorsunuz:

  • Konumsal kayıtları ve kayıt yapılarını bildirin.
  • Küçük bir kayıt hiyerarşisi oluşturun.
  • Derleyici tarafından oluşturulan eşitlik ve biçimlendirmeyi kullanın.
  • Yok edici olmayan mutasyonlar için with ifadelerini kullanın.

Prerequisites

Yükleme yönergeleri

Windows'ta tüm önkoşulları yüklemek için bu WinGet yapılandırma dosyasını kullanın. Zaten yüklü bir şey varsa WinGet bu adımı atlar.

  1. Dosyayı indirin ve çift tıklayarak çalıştırın.
  2. Lisans sözleşmesini okuyun, yyazın ve kabul etmek isteyip istemediğiniz sorulduğunda Enter seçin.
  3. Görev Çubuğunuzda yanıp sönen bir Kullanıcı Hesabı Denetimi (UAC) istemi alırsanız yüklemenin devam etmesi için izin verin.

Diğer platformlarda, bu bileşenlerin her birini ayrı ayrı yüklemeniz gerekir.

  1. Önerilen yükleyiciyi .NET SDK indirme sayfasından indirin ve çift tıklayarak çalıştırın. İndirme sayfası platformunuzu algılar ve platformunuz için en son yükleyiciyi önerir.
  2. Visual Studio Code giriş sayfasından en son yükleyiciyi indirin ve çift tıklayarak çalıştırın. Bu sayfa ayrıca platformunuzu algılar ve bağlantı sisteminiz için doğru olmalıdır.
  3. C# DevKit uzantısı sayfasındaki "Yükle" düğmesine tıklayın. Bu, Visual Studio kodu açar ve uzantıyı yüklemek mi yoksa etkinleştirmek mi istediğinizi sorar. "Yükle" seçeneğini belirleyin.

Uygulamayı ve ilk kaydınızı oluşturma

Uygulamanız için bir klasör oluşturun, komutunu çalıştırın dotnet new consoleve oluşturulan projeyi açın.

adlı DailyTemperature.csbir dosya ekleyin ve sıcaklık değerleri için bir konumsal readonly record struct ekleyin:

public readonly record struct DailyTemperature(double HighTemp, double LowTemp)
{
    public double Mean => (HighTemp + LowTemp) / 2.0;
}

adlı Program.csbir dosya ekleyin ve örnek sıcaklık verileri oluşturun:

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) 
];

Bu söz dizimi sabit değer semantiği ile kısa veri modellemesi sağlar.

Kayıt yapısına davranış ekleme

DailyTemperature.cs içinde, kayıt yapısı zaten hesaplanan Mean özelliğine sahiptir:

public double Mean => (HighTemp + LowTemp) / 2.0;

Her değer küçük ve bağımsız olduğundan kayıt yapısı burada iyi çalışır.

Derece günü hesaplamaları için kayıt türleri oluşturma

Uyarı

Isıtma derece günleri ve soğutma derece günleri , günlük ortalama sıcaklığın bir temel sıcaklıktan (genellikle 65°F/18°C) ne kadar sapma olduğunu ölçer. Isıtma derece günleri, ortalamanın tabanın altında olduğu soğuk günlerde birikirken, soğutma derece günleri ortalamanın tabanın üzerinde olduğu sıcak günlerde birikir. Bu hesaplamalar, ısıtma veya soğutma binaları için enerji tüketimini tahmin etme konusunda yardımcı olur ve bunları hizmet şirketleri, bina yöneticileri ve iklim analizi için kullanışlı hale getirir.

Isıtma ve soğutma derece günü hesaplamaları için hiyerarşi ile adlı DegreeDays.cs bir dosya oluşturun:

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);
}

Şimdi Main yönteminizde Program.cs toplamları hesaplayın:

var heatingDegreeDays = new HeatingDegreeDays(65, data);
Console.WriteLine(heatingDegreeDays);

var coolingDegreeDays = new CoolingDegreeDays(65, data);
Console.WriteLine(coolingDegreeDays);

Oluşturulan ToString çıkış, yineleme sırasında hızlı tanılama için kullanışlıdır.

Çıktıyı özelleştirmek için PrintMembers üstüne yazın

Varsayılan çıkış çok fazla kirlilik içeriyorsa, temel kayıtta geçersiz kılın PrintMembers :

protected virtual bool PrintMembers(StringBuilder stringBuilder)
{
    stringBuilder.Append($"BaseTemperature = {BaseTemperature}");
    return true;
}

Üstün kılma, çıktının ihtiyacınız olan bilgilere odaklanmasını sağlar.

Yok edici olmayan mutasyon için ifadelerle kullanma

Özgün kaydı kapatmadan değiştirilmiş kopyalar oluşturmak için kullanın with :

// Growing degree days measure warming to determine plant growing rates
var growingDegreeDays = coolingDegreeDays with { BaseTemperature = 41 };
Console.WriteLine(growingDegreeDays);

Giriş verilerinizin dilimlerindeki sıralı toplamları hesaplamak için bu fikri genişletin:

// 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);
}

Bu yaklaşım, özgün değerleri korurken dönüştürmelere ihtiyacınız olduğunda kullanışlıdır.

Sonraki Adımlar