.NET 9.0'daki yenilikler [4]: C# 13.0'da kısmi özellikler ve kısmi indeksleyiciler

Saberie

Active member
C# 13.0'daki önemli bir yenilik kısmi özellikler ve indeksleyicilerdir. C# 3.0'da kısmi yöntemlerin kullanıma sunulmasından bu yana birçok geliştirici bu dil özelliğini bekliyordu. C# anahtar sözcüğü partial aynı zamanda C# 2.0 dersleri için de mevcut.


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.







Kısmi sınıflarla, tek bir sınıfın program kodunu, miras kullanmadan birden fazla kod dosyasına bölebilirsiniz. Bu yalnızca büyük sınıflarda daha fazla netlik sağlamak için yararlı olmakla kalmaz, aynı zamanda esas olarak sınıfın bir kısmı otomatik olarak oluşturulduğunda ve sınıfın diğer kısmı manuel olarak yazıldığında kullanılır. Bu yaklaşım .NET'te, örneğin ASP.NET Webforms ve Blazor gibi GUI kitaplıklarında, Entity Framework ve Entity Framework Core ile veritabanı tersine mühendisliğinde ve kaynak oluşturucularda (örneğin normal ifadeler ve JSON serileştirmesi için) kullanılır.

C# 13.0'da geliştiriciler ayrıca özellik ve dizin oluşturucu tanımlarını ve bunların uygulanmasını da tanımlayabilir. partial iki sıraya ayırın. Her iki taraf da aynı görünürlük ve türde aynı alıcı ve ayarlayıcı kombinasyonunu uygulamalıdır.

Somut bir örnek: Sınıfın bir bölümündeki bir mülkün hem kamu alıcısı hem de kamu belirleyicisi varsa, diğer bölümde de mevcut ve kamuya açık olmaları gerekir. Ancak bir kısım otomatik bir özellik kullanırken diğer kısım açık bir uygulamaya sahip olabilir.

Kısmi özellikler ve kısmi dizin oluşturucular, tıpkı kısmi sınıflar ve kısmi yöntemler gibi, birden fazla projeden/derlemeden birleştirilemez. Tüm parçalar aynı projede olmalıdır!

Kod örneklerindeki yeni özellikler


Aşağıdaki listede kısmi yöntem, kısmi özellik ve kısmi dizinleyici içeren bölünmüş bir sınıf örneği gösterilmektedir.

İlk kod parçacığı, kısmi sınıfın ilk bölümünü yalnızca özellik tanımlarıyla birlikte gösterir ID, Indexer VE Print():


using System.Text.Json.Serialization;

namespace NET9_Console.CS13;

/// <summary>
/// Erster Teil der partiellen Klasse nur mit Definitionen
/// </summary>
public partial class PersonWithAutoID
{
// NEU: Partielles Property --> kein "Convert to Full Property"
public partial int ID { get; set; }
// NEU: Partieller Indexer
public partial string this[int index] { get; }
// "Normales Property"
public string Name { get; set; }
// Partielle Methode (gab es vorher schon)
public partial void Print();
}



Dersin ikinci bölümünde kısmi alıcılar ve ayarlayıcılar ID ve Indexer yöntemin yanı sıra Print() uygulandı:


/// <summary>
/// Implementierung der Getter und Setter für ID, der Getter für den Indexer sowie die Methode Print()
/// </summary>
public partial class PersonWithAutoID
{
int counter = 0;

// Implementierung des Partial Property
private int iD;

public partial int ID
{
get
{
if (iD == 0) iD = ++counter;
return iD;
}
set
{
if (ID > 0) throw new ApplicationException("ID ist bereits gesetzt");
iD = value;
}
}

// Implementierung des Partial Indexer
public partial string this[int index]
{
get
{
return index switch
{
0 => ID.ToString(),
1 => Name,
_ => throw new IndexOutOfRangeException()
};
}
}

// Implementierung der Partial Method
public partial void Print()
{
Console.WriteLine($"{this.ID}: {this.Name}");
}
}



Aşağıdaki kod bileşik sınıf kullanıcısını uygular PersonWithAutoID:


/// <summary>
/// Client-Klasse für die Demo
/// </summary>
public class CS13_PartialPropertyAndIndexerDemoClient
{
public void Run()
{
CUI.Demo(nameof(CS13_PartialPropertyAndIndexerDemoClient));
CS13.PersonWithAutoID p = new() { Name = "Holger Schwichtenberg" };
p.Print(); // 1: Holger Schwichtenberg
CUI.H2("Versuch, die ID neu zu setzen, führt zum Fehler:");
try
{
p.ID = 42;
}
catch (Exception ex)
{
CUI.Error(ex); // System.ApplicationException: ID ist bereits gesetzt
}
CUI.Print($"Nutzung des Indexers: {p[0]}: {p[1]} ");
}
}




(Ben)
 
Üst