.NET 8.0'da yeni [3]: C# 12.0'daki birincil üreticiler

Womanne

Member
C# 12.0, 14 Kasım 2023'te Visual Studio 2022 sürüm 17.8 E.NET 8.0 ile birlikte yayınlandı. C# 12.0, Microsoft tarafından resmi olarak desteklenmektedir. Bununla birlikte, çoğu (hepsi değil!) C# 12.0 Dilin işlevselliği, .NET Framework, .NET Core ve Xamarin dahil olmak üzere eski .NET sürümlerinde de kullanılabilir. Yapmalısın <LangVersion> Proje dosyasında (.cfroj), “12.0” a yükselir.










Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.







C# 12.0'daki en önemli yenilik, sınıfların birincil üreticileridir. Geliştiriciler C# arasındaki eski tavşanlar, bu dilsel işlevin 2014 yılında C# 6.0 için bir prototip olarak mevcut olduğunu, ancak bu nedenle ortadan kaldırıldığını hatırlayacaklar.

Altı sürüm C, Microsoft, C# 9.0'dan birincil üreticilerle birlikte kayıt türlerinin arka planına karşı C# 12.0'a döner:


public record Person(int ID, string Name, string Website = "");


Birincil üretici, türün adının hemen arkasındaki parametrelerin bir listesidir. C# 12.0'da bu sınıf tanımları için de mümkündür:


public class Person(int ID, string Name, string Website = "");


Bu sınıf bir içerik alanı (yani sevimli parantez) olmadan var olabilir, ancak işe yaramaz. C# 9.0'da tanıtılan kayıt türlerinin aksine, birincil üretici sınıfta kamu mülkleri değil, sadece özel alanlar oluşturur. Bu sınıfa bir sondajda birincil üreticiyle bakarsanız, başlangıçta birincil üreticideki parametrelerin işlenmesini görmek mümkün değildir:




public class Person
{
public Person(int ID, string Name, string Website = "")
{
}
}



Bunun nedeni, birincil üreticinin parametrelerinin hiç kullanılmamasıdır. ZB sınıfını yapmalıyız ToString() genişletmek:


public class Person(int id, string name, string website = "")
{
public string Name { get; set; } = name;
public string Website { get; set; } = website;

public override string ToString()
{
return $"Person #{id}: {Name} -> {Website}";
}
}



Şimdi ILSPY ayrışmasında, üreticinin parametresi için özel bir alanın bakalım id yaratıldı, ama için değil name VE websiteOnlarla yalnızca bir özellik başlatıldığından ve birincil üreticinin adlarına doğrudan erişim olmadığından (name VE website Küçük bir başlangıç mektubu ile!).

Başlatma için yalnızca bir üreticinin parametresini kullanıyorsanız özel bir alan yoktur:


public class Person
{
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private int <id>P;

public string Name { get; set; }

public string Website { get; set; }

public Person(int id, string name, string website = "")
{
<id>P = id;
Name = name;
Website = website;
base..ctor();
}

public override string ToString()
{
return $"Person #{<id>P}: {Name} -> {Website}";
}
}



Birincil üreticiye aktarılan verilere herkese açık olarak erişmek için, üreticinin parametrelerini tahsisler için kullanmak gerekir, aşağıdaki kod örneğinde ad ve web sitesine danışın. Sınıfa ek olarak var Person İkinci türetilmiş bir sınıf Autor Birincil Üretici ile:


using System.ComponentModel.DataAnnotations;
using ITVisions;

namespace NET8Konsole.CS12;

/// <summary>
/// Klasse mit Primärkonstruktor
/// </summary>
public class Person(Guid id, string name)
{
public string Name { get; set; } = name;

public Person() : this(Guid.Empty, "") { }

public override string ToString()
{
// Hier Property Name statt
// Primärkonstruktorparametername verwenden!
// Man würde sonst Namensänderungen nicht sehen!
return $"Person {id}: {Name}";
}
}

/// <summary>
/// Abgeleitete Klasse mit Primärkonstruktor
/// </summary>
public class Autor(Guid id,
string name,
string website) : Person(id, name)
{
public string Website { get; set; } = website;

public override string ToString() {
return $"Autor {id}: {Name} -> {Website}";
}
}

internal class CS12_PrimaryConstructors_Demo
{
public void Run()
{
var p = new Person();
Console.WriteLine(p.Name);
Console.WriteLine(p.ToString());
var a = new Autor(Guid.NewGuid(), "Dr. Holger Schwichtenberg",
"www.IT-Visions.de");
Console.WriteLine(a.Name);
Console.WriteLine(a.Website);
Console.WriteLine(a.ToString());
}
}



Ne yazık ki, birincil üreticilerde C# 'da, TypeShish üreticilerinde olduğu gibi, bir olasılık yok public VE private Görünürlüğü kontrol etmek için, sınıfın ortaya çıkan verilerinin üyeleri almalıdır.

Aynı şekilde, kısıtlama yok readonly Sınıflardaki program kodunun geçmiş değeri değiştirmesini önler.


(RME)
 
Üst