.NET 9.0'daki yenilikler [5]: C# 13.0'daki yarı otomatik özellikler

Adanali

Member
C# 11.0 için yeni bir tür özellik tanımı zaten duyuruldu. Yarı Otomatik Özellikler özelliği artık C# derleyicisinin 13. sürümüyle birlikte .NET 9.0'a dahil edilmiştir ancak deneysel durumdadır. Bu nedenle yalnızca bir proje dosyasında da mevcuttur <EnablePreviewFeatures>True</EnablePreviewFeatures> VEYA <LangVersion>preview</LangVersion> Setler.


Duyuru








Dr. Holger Schwichtenberg, 53 tanınmış uzmanıyla danışmanlık, eğitim ve yazılım geliştirme yoluyla çok sayıda orta ve büyük ölçekli şirketi destekleyen www.IT-Visions.de uzman ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası konferansa katılımı, 90'dan fazla uzmanlık kitabı ve 1.500'den fazla uzmanlık makalesi sayesinde Holger Schwichtenberg, .NET ve web teknolojileri konusunda Almanya'nın en tanınmış uzmanlarından biridir.







Yarı otomatik özellik (yarı otomatik özellik), tam özellikler ile otomatik özellikler arasındaki boşluğu doldurur. Başlangıçta C#'ta yalnızca eksiksiz özellikler vardı; burada standart veri okuma ve yazma durumu için depolama olarak bir alanın yanı sıra bir alıcı ve ayarlayıcının uygulanması gerekliydi. Zaten C# 3.0'dan başlayarak, otomatik özellikler tanıtıldı; burada tek yapmanız gereken, alandaki verileri okumak veya alıcı ve ayarlayıcıda başka hiçbir şey yapılmaması durumunda alana kaydetmek, alanın bildirimi ve yapabilecekleriniz Alıcılar ve Ayarlayıcılar uygulanmadığı sürece. C# 6.0'dan başlayarak, otomatik özellikler doğrudan bildirim sırasında da başlatılabilir.

Ancak alıcılar ve/veya ayarlayıcılar doğrulama veya bildirim gibi gelişmiş özellikler içerdiğinde, otomatik özellik artık bir seçenek olmaktan çıktı. Yeni yarı otomatik özelliğin devreye girdiği yer burasıdır: alıcıları ve ayarlayıcıları uygulayabilirsiniz, ancak açıkça bir alan bildirmeniz gerekmez. Bunun yerine new anahtar kelimesini kullanırsınız field. Bu amaçla derleyici otomatik olarak depolama alanı olarak bir alan oluşturur.

Yarı otomatik bir özellik için aşağıdaki seçenekler mevcuttur:

  • Alıcılar veya ayarlayıcılar ihmal edilebilir; ikisinden yalnızca birine ihtiyacınız var.
  • Yerine seto da olabilir init Kullanılacak. Yani yalnızca önyükleme için yarı otomatik bir özelliğe sahipsiniz.
  • Yarı otomatik bir özellik, sonunda bir değerle başlatılabilir.






Geliştirme ortamı, araç ipucunda derleyicinin alan anahtar sözcüğünün yerine bir alan oluşturacağını belirtir.


(Resim: Ekran görüntüsü (Holger Schwichtenberg))



Bir programlama diline yeni bir anahtar kelime eklemek her zaman mevcut tanımlayıcılarla ad çakışması riskini taşır. Kodunuzda ada sahip bir alanınız varsa field onun yerine sen yapmalısın @field VEYA this.field Bu mevcut alanı kullanmaya devam etmek için.

Aşağıdaki kod, bir tam özelliği, bir otomatik özelliği ve bir yarı otomatik özelliğin karşılaştırılmasını gösterir:


namespace NET9_Console.CS13;

/// <summary>
/// Klasse mit Semi-Auto Properties.
/// The feature 'field keyword' is currently in Preview and *unsupported*. To use Preview features, use the 'preview' language version.
/// <EnablePreviewFeatures>True</EnablePreviewFeatures> oder <LangVersion>preview</LangVersion>-->
/// </summary>
class PersonWithID
{
/// <summary>
/// Auto Property
/// </summary>
public string Name { get; set; } = "unbekannt";

private string company = "Freelancer";
/// <summary>
/// Full Properties
/// </summary>
public string Company
{
get => company; set
{
if (value == null)
{
throw new ArgumentOutOfRangeException();
}
company = value;
}
}

/// <summary>
/// Semi-Auto Property
/// </summary>
public int ID
{
get;
set // init auch erlaubt!
{
if (value < 0) throw new ArgumentOutOfRangeException();
if (field > 0) throw new ApplicationException("ID schon gesetzt");
field = value;
}
} = -1;
}

/// <summary>
/// Client für Semi-Auto Properties
/// </summary>
class CS13_SemiAutoProperties
{
public void Run()
{
CUI.Demo(nameof(CS13_SemiAutoProperties));

PersonWithID p = new PersonWithID();
Console.WriteLine($"{p.ID}: {p.Name} arbeitet bei {p.Company}");
p.ID = 42;
p.Name = "Dr. Holger Schwichtenberg";
p.Company = "www.IT-Visions.de";
Console.WriteLine($"{p.ID}: {p.Name} arbeitet bei {p.Company}");
try
{
p.ID = 43;
}
catch (Exception ex)
{
CUI.PrintError(ex.Message); // "ID schon gesetzt"
}
}
}




(Ben)
 
Üst