.NET 8.0’daki yenilikler [3]: C# 12.0’daki birincil kurucular

Adanali

Member
C# 12.0, Visual Studio 2022 sürüm 17.8 ve .NET 8.0 ile birlikte 14 Kasım 2023’te piyasaya sürüldü. C# 12.0, yalnızca .NET 8.0’dan itibaren Microsoft tarafından resmi olarak desteklenir (“C# 12.0 yalnızca .NET 8 ve sonraki sürümlerde desteklenir. “). Ancak, .NET Framework, .NET Core ve Xamarin dahil olmak üzere .NET’in önceki sürümlerinde bulunan C# 12,0 dil özelliklerinin çoğunu (ancak hepsini değil) de kullanabilirsiniz. Bunu yapmak için yapmanız gerekenler <LangVersion> proje dosyasında (.csproj) “12.0” olarak ayarlayın.

Duyuru








Dr. Holger Schwichtenberg, son derece kritik güvenlikle ilgili alanlar da dahil olmak üzere yenilik ve deneyime dayalı yazılım geliştirme sunan MAXIMAGO’da baş teknoloji uzmanıdır. Aynı zamanda, 43 tanınmış uzmanla yazılım geliştirme ve kullanımı konusunda danışmanlık ve eğitim vererek çok sayıda orta ve büyük ölçekli şirketi destekleyen www.IT-Visions.de uzman ağını da yönetmektedir.







C# 12.0’daki en önemli yeni özellik, sınıflar için birincil oluşturucuları içerir. Deneyimli C# geliştiricileri, dilin bu özelliğinin 2014 yılında C# 6.0 için prototip olarak zaten mevcut olduğunu ancak daha sonra aşamalı olarak kaldırıldığını hatırlayacaktır.

Şimdi, altı C# sürümünden sonra Microsoft, C# 9.0’dan başlayan birincil oluşturucularda mevcut olan kayıt türlerinin ışığında, C# 12.0’da bu konuya geri dönüyor:


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


Birincil yapıcı, tür adının hemen ardından gelen parametrelerin 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 = "");


Böyle bir sınıf, içerik alanı (yani küme parantezleri) olmadan var olabilir, ancak işe yaramaz. C# 9.0’da tanıtılan kayıt türlerinin aksine, birincil oluşturucu sınıfta genel özellikler oluşturmaz, yalnızca özel alanlar oluşturur. Bu sınıfa bir kod çözücüdeki birincil kurucuyla bakarsanız, başlangıçta birincil kurucuda herhangi bir parametre işleme göremezsiniz:


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



Bunun nedeni yapıcının birincil parametrelerinin hiç kullanılmamasıdır. Öğretmeliyiz; B. civarında 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}";
}
}



Artık ILSpy derleyicisinde yapıcı parametresi için özel bir alan olduğunu görüyoruz. id yaratıldı ama bunun için değil name VE websitebunlarla yalnızca bir özellik başlatıldığından ve artık birincil kurucunun adlarına doğrudan erişim olmadığından (name VE website küçük bir baş harfle!).

Yalnızca başlatma için bir yapıcı parametresi kullanırsanız özel alan oluşturulmaz:


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 oluşturucuda iletilen verilere genel olarak erişmek için atamalar için yapıcı parametrelerini kullanmanız gerekir; aşağıdaki kod örneğinde ad ve web sitesine bakın. İçinde sınıfın yanında var Person ikinci bir türetilmiş sınıf Autor birincil yapıcıyla:


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, C#’ta birincil kurucuların TypeScript yapıcılarının yaptığı gibi görünürlükten geçme yeteneği yoktur. public VE private ortaya çıkan sınıf üyesi verilerinin hangi görünürlüğü alması gerektiğini kontrol etmek için.

Aynı şekilde herhangi bir kısıtlama yok readonly Bu, sınıftaki program kodunun iletilen değeri değiştirmesini engeller.


(kendim)



Haberin Sonu
 
Üst