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

Womanne

Member
C# 11.0 için yeni bir özellik tanım türü açıklanmıştır. Şimdi .NET 9.0'da C#derleyicisinin on üçüncü versiyonu ile, işlevin deneysel olarak olan yarı otomobil özelliklerini içerir. Bu nedenle, yalnızca bir proje dosyasında kullanılabilir <EnablePreviewFeatures>True</EnablePreviewFeatures> VEYA <LangVersion>preview</LangVersion> ayarlamak.








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.







Yarı otomatik bir özellik (yarı otomatik özellikler), tam özellikler ile otomatik doğru arasındaki boşluğu etkiler. Başlangıçta sadece C#'da, standart okuma ve yazma veri durumu için depolama alanı gibi bir kapı ve bir ayarlayıcı ve bir alanın uygulanması gereken tam özellikler vardı. Zaten C# 3.0'da, alanların alanlarının yapılabileceği otomatik özellikler geldi ve ıslak ve setterde hiçbir şey yapılmaması durumunda harflerin ve ayarların uygulanması. C# 6.0'dan beri, otomatik özellikler doğrudan beyanda da başlatılabilir.

Ancak, Getter ve/veya Setter doğrulama veya bildirim gibi kapsamlı işlevler içermez, otomatik bir özellik artık bir seçenek değildi. Burada yeni yarı araçlık özellik atlamaları: Getter ve Setter uygulayabilirsiniz, ancak açıkça bir alan beyan etmeniz gerekmez. Bunun yerine, yeni anahtar kelime kullanılır field. Derleyici, depolama alanı olarak otomatik olarak bir alan oluşturur.

Yarı automatik bir özellik ile aşağıdaki seçenekler vardır:

  • Getter veya Setter hariç tutulabilir; Sadece ikisinden birine ihtiyacın var.
  • Yerine setde yapabilir init kullanılabilir. Yani sadece başlangıç için yarı -otomatik bir özelliğiniz var.
  • Sonunda, yarı -otomatik bir özellik bir değerle başlatılabilir.






Geliştirme ortamı, araç ipucunda derleyicinin anahtar kelimeler alanında bir alan oluşturacağını gösterir.


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



Bir programlama diline yeni bir anahtar kelimenin tanıtılması, her zaman mevcut tanımlayıcılarla adlandırılan bir çarpışma riskine ev sahipliği yapar. Kodunuzda bir adı olan bir alan iseniz field Bunun yerine sahip olmalısın @field VEYA this.field Bu mevcut alanı kullanmaya devam etmek için yazın.

Aşağıdaki kod, karşılaştırmalı olarak eksiksiz bir özellik, otomatik bir özellik ve yarı -otomatik bir özelliği göstermektedir:


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"
}
}
}




(RME)
 
Üst