.NET 9.0 Önizleme 3: Çeşitli Parçacıklar

Adanali

Member


  1. .NET 9.0 Önizleme 3: Çeşitli Parçacıklar

Microsoft, .NET 9.0 Preview 3'ü yayımladı. .NET 9.0'ın ilk iki önizleme sürümünde (Önizleme 1 ve Önizleme 2) olduğu gibi, yeniliklerin miktarı ve kapsamı, .NET'in en son sürümlerinde zaten mevcut olan önemli yeniliklerle karşılaştırıldığında yönetilebilir durumdadır. NET'in erken önizleme sürümlerinde.

Duyuru



En azından Microsoft artık zayıf iletişim eleştirilerine yanıt verdi ve sürüm notlarını daha hedefe yönelik hale getiriyor (bkz. Şekil 1). Ancak Microsoft, .NET blogunda önceden oluşturulan gönderilere geri dönmedi.




.NET 9.0 Preview 3 sürüm notları yeni özellikleri daha net bir şekilde vurgulamaktadır (Şekil 1).



.NET 9.0 Preview 3 sürüm notları yeni özellikleri daha net bir şekilde vurgulamaktadır (Şekil 1).


(Resim: Dr. Holger Schwichtenberg)



TimeSpan için daha fazla hassasiyet


Veri yapısında System.TimeSpan.NET Framework'ün 2002'deki ilk sürümünden bu yana ortalıkta olan bu yöntem, yöntem dönüşümünde zorluk yarattı FromMicroseconds(), FromSeconds(), FromMinutes(), FromHours() VE FromDays() parametre olarak double-Beklenen değer. THE double-Tür, kayan noktalı bir sayı olarak kesin değildir. Microsoft bu nedenle .NET 9.0'da daha fazla yeni değişken sunuyor From-Tam sayıları parametre olarak alan yöntemler:

  • public static TimeSpan FromDays(int days);
  • public static TimeSpan FromDays(int days, int hours = 0, long minutes = 0, long seconds = 0, long milliseconds = 0, long microseconds = 0);
  • public static TimeSpan FromHours(int hours);
  • public static TimeSpan FromHours(int hours, long minutes = 0, long seconds = 0, long milliseconds = 0, long microseconds = 0);
  • public static TimeSpan FromMinutes(long minutes);
  • public static TimeSpan FromMinutes(long minutes, long seconds = 0, long milliseconds = 0, long microseconds = 0);
  • public static TimeSpan FromSeconds(long seconds);
  • public static TimeSpan FromSeconds(long seconds, long milliseconds = 0, long microseconds = 0);
  • public static TimeSpan FromMilliseconds(long milliseconds, long microseconds = 0);
  • public static TimeSpan FromMicroseconds(long microseconds);
Aşağıdaki örnek, yeni aşırı yüklemelerin artan doğruluğunu göstermektedir:


// bisher
TimeSpan timeSpan1 = TimeSpan.FromSeconds(value: 101.832);
Console.WriteLine($"timeSpan1 = {timeSpan1}"); // timeSpan1 = 00:01:41.8319999

// neu
TimeSpan timeSpan2 = TimeSpan.FromSeconds(seconds: 101, milliseconds: 832);
Console.WriteLine($"timeSpan2 = {timeSpan2}"); // timeSpan2 = 00:01:41.8320000


AssemblyBuilder yerine PersistedAssemblyBuilder


.NET 9.0 Preview 1'de Microsoft, klasik .NET Framework'ten bilinen, dosya sisteminde veya herhangi bir akışta çalışma zamanında dinamik olarak oluşturulan kalıcı derlemeler seçeneğini yeniden sundu. Önizleme 3'te API değişti. Daha önce kullanılan sınıf yerine AssemblyBuilder


AssemblyBuilder ab = AssemblyBuilder.DefinePersistedAssembly(new AssemblyName("Math"), typeof(object).Assembly);


Geliştiriciler artık yeni sınıfı kullanıyor PersistedAssemblyBuilder:


PersistedAssemblyBuilder ab = new PersistedAssemblyBuilder(new AssemblyName("Math"), typeof(object).Assembly);


Aşağıdaki listede kullanımına ilişkin bir örnek gösterilmektedir. PersistedAssemblyBuilder. Microsoft, sürüm notlarında giriş noktası olarak meta veri uyarlamasının ek bir örneğini gösterir.


string assemblyPath = Path.Combine(System.AppContext.BaseDirectory, "Math.dll");

PersistedAssemblyBuilder ab = new PersistedAssemblyBuilder(new AssemblyName("Math"), typeof(object).Assembly);
TypeBuilder tb = ab.DefineDynamicModule("MathModule").DefineType("MathUtil", TypeAttributes.Public | TypeAttributes.Class);

MethodBuilder mb = tb.DefineMethod("Sum", MethodAttributes.Public | MethodAttributes.Static,
typeof(int), [typeof(int), typeof(int)]);
ILGenerator il = mb.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Add);
il.Emit(OpCodes.Ret);

tb.CreateType();
Console.WriteLine("Speichere Assembly unter: " + assemblyPath);
ab.Save(assemblyPath); // Speichern ins Dateisystem oder einen Stream






(Resim: Dmytro Vikarchuk/Shutterstock)


iX ve dpunkt.verlag tarafından 19 Kasım 2024'te düzenlenecek BetterCode() .NET 9.0 çevrimiçi konferansında, www.IT-Visions.de adresindeki .NET uzmanları pratik örnekler kullanarak .NET 9.0'ın son sürümünü sunacaklar. Bunlar arasında .NET 9.0 SDK, C# 13.0, ASP.NET Core 9.0, Blazor 9.0, Entity Framework Core 9.0 ile OR eşlemesi, Windows Forms 9.0, WPF 9.0, WinUI, .NET MAUI 9.0 ile platformlar arası geliştirme ve bir perspektif yer alıyor. .NET 10.0'da.

Bilet satışları başladı bile; indirimli kör kuş biletleri program duyurusu öncesinde satışa sunuldu.







Daha hızlı çalışma zamanı hatası işleme


.NET'in çalışma zamanı hatalarını işlemede yavaş olduğu uzun yıllardır bilinmektedir. Bu nedenle çalışma zamanı hatalarından kaçınmak en iyi uygulamalardan biridir. Özellikle, değerler geçersiz olduğunda bir döngüden veya alt programdan çıkmak gibi çalışma zamanı hatalarını kontrol akışı talimatlarının yerine kullanmamalısınız. Ancak Microsoft'un .NET çalışma zamanı sürüm notlarına göre çalışma zamanı hata işlemesi iki ila dört kat artırıldı. Bu, Windows x64, Windows ARM64, Linux x64 ve Linux ARM64 için geçerlidir ancak 32 bit Windows için geçerli değildir. Kalan bazı hataların Önizleme 4'te düzeltilmesi gerekiyor. Geliştiriciler ortam değişkenlerini kullanabilir


DOTNET_LegacyExceptionHandling = 1


veya proje dosyası ayarı


<RuntimeHostConfigurationOption Include="System.Runtime.LegacyExceptionHandling" Value="true" />


çalışma zamanı ortamını eski, daha yavaş hata işleme yöntemini kullanmaya zorlayın.

Geliştirilmiş terminal kaydedici çıkışı


.NET 8.0'da tanıtılan daha kısa Terminal Logger (örn. dotnet build /tl VE msbuild /tl) artık hata mesajlarını satır sonlarıyla daha iyi görüntülüyor ve çıktının sonunda hata ve uyarı sayısının bir özetini de gösteriyor.

Belgelerde bulunmayan ancak Microsoft'un ekran görüntülerinde görülebilen (bkz. şekil 2 ve 3) ve hızlı testte onaylanan şey: dotnet build artık parametreye erişebilirsiniz /tl sırasıyla -tl Terminal günlükçüsünü etkinleştirmek için. MSBuild ile klasik günlükçü, .NET 9.0 SDK'da bile bu parametre olmadan hala etkindir.




.NET 8.0'da Terminal Logger (Şekil 2)



.NET 8.0'da Terminal Logger (Şekil 2)


(Resim: Microsoft)





.NET 9.0'da Terminal Logger (Şekil 3)



.NET 9.0'da Terminal Logger (Şekil 3)


(Resim: Microsoft)



Hiyerarşi kimliklerinin türden bağımsız oluşturulması


Kasım 2023'te yayımlanan Entity Framework Core 8.0'da Microsoft, Microsoft SQL Server veri türü için destek ekledi hierarchyid .NET sınıfı biçiminde tanıtıldı HierarchyId. Sürüm 9.0 Preview 3'ten itibaren geliştiriciler şunları yapabilir: HierarchyId-Daha önce olduğu gibi yalnızca bir karakter dizisinden örnekler (ör. “/4/1/3/1/2/”) değil, aynı zamanda daha tür açısından güvenli bir şekilde diğerine dayalı örnekler HierarchyId ve tamsayılar oluşturun. Aşağıdaki liste yeni aşırı yüklerin kullanımını göstermektedir HierarchyId.Parse().


for (int j = 1; j < 5; j++)
{
// alt
var level2 = $"{startLevel}{i}/{j}/";
var hid2Alt = HierarchyId.Parse(level2);
// neu
var hid2Neu = HierarchyId.Parse(abteilungsleiter.Level, j);

var n = new Employee(hid2Neu, f.Name.FullName(), f.Random.Number(1970, 2023));
n.Company = company;
ctx.Add(n);
Console.WriteLine(" " + n.ToString());
var c3 = ctx.SaveChanges();
}


Otomatik olarak doldurulan şablonlar


Entity Framework Core, bir nesne modelini bir veritabanı şemasına eşlemek için çalışma zamanında program kodu üretir. Bu çalışma zamanı kodunun oluşturulması, büyük nesne modelleri için zaman alıcı olabilir. Ayrıca, çalışma zamanı kodu oluşturma, .NET 7.0'dan beri mevcut olan ve Microsoft'un Entity Framework Core ile .NET 9.0'da da etkinleştirmek istediği Yerel AOT ön derleyicisiyle uyumlu değildir.

Modern nesne ilişkisel eşleyicinin 6.0 sürümünden itibaren, çalışma zamanı kod üretiminin bir kısmının geliştirme zamanında gerçekleştiği derlenmiş modeller zaten mevcuttur. Bunu yapmak için önce bir komut satırı komutunu çalıştırmanız gerekiyordu.


dotnet ef dbcontext optimize


veya PowerShell'de:


Optimize-DbContext


Yani program koduna bir yöntem çağrısı eklemek zorundaydınız OnConfiguring() A ekle:


.UseModel(Kontextname.Instance)


Ek olarak geliştiricilerin, nesne modelinde veya bağlam sınıfında değişiklik yapıldığında derlenen modelleri komut satırında tekrar tekrar yeniden oluşturması gerekiyordu.

Artık tüm bu adımlar atlanabilir. Derleme yeni bir MSBuild göreviyle yapılabilir <EFOptimizeContext> otomatikleştirmek. Bunu yapmak için yeni NuGet paketini Microsoft.EntityFrameworkCore.Tasks ve ardından proje dosyasındaki ayarı entegre etmeniz gerekir. <EFOptimizeContext> AÇIK true ayarlanır:


<PropertyGroup>
<EFOptimizeContext>true</EFOptimizeContext>
</PropertyGroup>


Her çeviri işleminde şunları görebilirsiniz:


Optimizing DbContext...


Aşağıdaki gibi ek ayarlar aracılığıyla şablon derlemesinde değişiklik yapabilirsiniz: EFStartupProject, DbContextName VE EFTargetNamespace olası.

Arama UseModel() Derlenen model bağlam sınıfıyla aynı derlemede olduğu sürece Entity Framework Core 9.0 Preview 3'ten itibaren artık gerekli değildir. Bu, MSBuild görevini kullanmanıza veya model oluşturmayı el ile başlatmaya devam etmenize bakılmaksızın geçerlidir.

ASP.NET Core ve Blazor için iyileştirmeler


ASP.NET Core geliştirme sırasında bir hata sayfası görüntüleyebilir: app.UseDeveloperExceptionPage(). Bu özellik .NET Core 1.0'dan itibaren kullanılabilir. .NET 9.0'da sekme yönlendirme ancak ek son nokta bilgileriyle desteklenmiştir (bkz. Şekil 4).

Sınıf TypedResults ASP.NET Core tabanlı web API'leri için artık durum kodu 500'ü de döndürebilir (“Dahili sunucu hatası”):


var app = WebApplication.Create();
app.MapGet("/", () => TypedResults.InternalServerError("Something went wrong!"));
app.Run();


Blazor'da sınıf artık KeyboardEventArgs mülkte IsComposing büyütülmüş. Bu, klavye vuruşunun, örneğin aksanları girerken (“'” ve “is” için “e”) bileşik klavye girişinin parçası olup olmadığını kontrol etmenize olanak tanır.




ASP.NET Core'daki Geliştirme Süresi hata sayfasındaki Gelişmiş Yönlendirme sekmesi (Şekil 4)



ASP.NET Core geliştirme zamanı hatası sayfasındaki Gelişmiş Yönlendirme sekmesi (Şekil 4)


(Resim: Dr. Holger Schwichtenberg)



.NET'teki gelişmeler hakkında tartışmalar


.NET 9.0, ilk üç önizleme sürümünde çok az yenilik içeriyor ve Microsoft tarafından yayınlanan planlar, son yıllarda gelenlerle karşılaştırıldığında seyrek kalıyor (örneğin, ASP.NET Core 9.0 yol haritasına bakın). .NET 8.0'ın yayınlanmasından beş ay sonra ve .NET 9.0'ın yayınlanmasından yedi ay önce, Entity Framework Core ekibi henüz bir sonraki sürüm için bir plan yayınlamadı (bkz. Şekil 5).




Entity Framework Core ekibi 9.0 sürümü için bir plan yayınlamadı (Şekil 5).



Entity Framework Core ekibi 9.0 sürümü için bir plan yayınlamadı (Şekil 5).


(Resim: Microsoft)



İlginç bir şekilde, ASP.NET Core 9.0 Preview 3'teki üç yeni özelliğin hiçbiri Microsoft'un kendisinden gelmiyor ancak bu sürümde belgelenen tüm yeni özellikler topluluk katkılarıdır.

Bütün bunlar yıllardır “.NET öldü” diye bağıranlar için bir model teşkil ediyor.

Ancak, .NET 9.0'ın yalnızca standart bir dönem sürümü olduğunu ve bu nedenle belki de .NET 8.0 gibi uzun vadeli bir sürümden daha azını beklemelisiniz. Ayrıca, genellikle yeni özelliklerin duyurulmasının habercisi olan yıllık Microsoft Build geliştirici konferansı da 21-23 Mayıs 2024 tarihleri arasında yeniden gerçekleştirilecek.


(Mayıs)



Haberin Sonu
 
Üst