Microsoft, Visual Studio 2026 Insiders sürüm 11709.129 ile birlikte .NET sürüm 11.0 Preview 3'ü yayımladı. .NET 11.0, C# programlama dilinin 15.0 sürümünü içerir.
Duyurudan sonra devamını okuyun
Dr. Holger Schwichtenberg, .NET 10.0, C# 14.0, Blazor 10.0 ve Entity Framework Core 10.0 üzerine uzman kitapları yayınladı. www.IT-Visions.de'de danışman ve eğitmen olarak çalışmaktadır.
Sendikalara ayrımcılık yapılıyor
Ayırt edilmiş bir birleşim (genellikle etiketli birleşim, cebirsel veri türü veya toplam türü olarak da adlandırılır), birkaç olası türden tam olarak birini içerebilen bir veri türüdür, dolayısıyla hangi türün halihazırda dahil edildiği her zaman açıktır. F#, Rust, Swift veya TypeScript gibi birçok modern dil bu kavrama hakimdir; Kotlin gibi diğerleri ise bunun kopyalanmasına izin verir. Daha önce C#'ta temel türle uğraşmak zorundaydınız System.Objectmiras, arayüzler, kalıp eşleştirme veya OneOf kütüphanesi gibi genel tür tabanlı uygulamalar.
Geliştiriciler, yeni C# anahtar sözcüğünü kullanarak C# 15.0'da bir birleşim türü oluşturur union örneğin bir ad ve bir veya daha fazla türün belirtilmesi
public union UnionName(Typ1, Typ2, Typ3);
Belirtilen türlerin ortak hiçbir yanı olmamalıdır: ne bir temel sınıfı ne de bir arayüzü paylaşmamalıdırlar. Anahtar kelime null tür olarak belirtilemez. Null yapılabilir değer türleri (ör. int?) ve Null yapılabilir referans türleri (Person?) izin verilir.
Bir tür değişkeni UnionName daha sonra her iki örneğine de sahip olabilirsiniz Typ1 VE Typ2 birlikte Typ3 ayrıca uygunsa null atamak. Ancak başka herhangi bir nesne türü ataması engellenir.
Duyurudan sonra devamını okuyun
Operatör ile is veya desen eşleştirme, birleşim türü değişkenini hangi türün içerdiğini sorgulayabilirsiniz. Desen eşleştirme otomatik olarak hedef türe aktarılırken desen eşleştirme olmadan özelliği değiştirmeniz gerekir Value Belirli bir türü elde etmek için kullanın. Ancak teslim eder Value adam System.Objecto zaman dökümü tekrarlamanız gerekir.
Ayrımlı birleşimler için tipik bir uygulama örnek teşkil etmektedir: bir iş mantığı işlemi, çeşitli hata durumlarının yanı sıra karakter dizileri, sayılar veya istisna nesneleri içeren belirli bir sonuç nesnesini rapor edebilir. Kullanırken switch-expression, derleyici, bloğun CS8509 uyarısıyla tüm durumları sorgulamaması durumunda uyarır: “Anahtar ifadesi, giriş türünün tüm olası değerlerini işlemez (ayrıntılı değildir).
Birlik türleri, yazılan sonuçlarla WebAPI işlemleri gibi .NET uygulama çerçevelerinin bazı bölümlerinde basitleştirme sağlama potansiyeline sahiptir. Bu şu anda mümkün değildir ancak 2026 sonuna kadar ASP.NET Web API'lerini, ASP.NET Core SignalR ve Blazor'u uygulamaya yönelik yol haritasına dahil edilmiştir.
Aşağıdaki kod, bir iş mantığı yönteminin ayrıntılı dönüş türleri için C# 15,0 birleşim türünü gösterir:
#nullable enable
namespace NET11_Console.CS15;
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public string Website { get; set; }
public override string ToString()
{
return $"Person: #{ID} Name: {Name} Website: {Website}";
}
}
public union PersonOperationResult(Person?, string, int?, Exception);
class BL
{
public PersonOperationResult GetPerson(int ID)
{
try
{
if (ID <= 0) return "Ungültige Person-ID";
if (ID == 123) return new Person() { ID = ID, Name = "Dr. Holger Schwichtenberg", Website = "www.IT-Visions.de" };
if (ID == 0815) throw new ApplicationException("Anwendungsfehler");
return ID; // Person nicht gefunden
}
catch (Exception ex)
{
return ex;
}
}
}
class UnionTypeDemo
{
public void Run()
{
CUI.Demo(nameof(UnionTypeDemo));
BL BL = new();
CUI.H1("nLade Person mit ID 123");
PersonOperationResult result1 = BL.GetPerson(123);
PrintResult(result1);
CUI.H1("nTest mit Null-Wert");
PersonOperationResult result2 = null;
PrintResult(result2);
CUI.H1("nLade Person mit ID 0 (Fehlerfall)");
PersonOperationResult result3 = BL.GetPerson(-1);
PrintResult(result3);
CUI.H1("nLade Person mit ID 101 (nicht gefunden)");
PersonOperationResult result4 = BL.GetPerson(101);
PrintResult(result4);
CUI.H1("nLade Person mit ID 0815 (Anwendungsfehler)");
PersonOperationResult result5 = BL.GetPerson(0815);
PrintResult(result5);
// Nicht erlaubt
//PersonOperationResult result = new FileInfo(@"c:tempDatei.xy");
}
private static void PrintResult(PersonOperationResult result)
{
if (result is int)
{
CUI.Error($"Person #{result.Value} nicht gefunden");
}
else if (result is string)
{
CUI.Error($"Fehler: {result.Value}");
}
else if (result is Exception)
{
CUI.Error($"Fehler: {(result.Value as Exception).Message}");
}
else if (result is Person)
{
CUI.Print(result.Value);
}
else if (result is null)
{
CUI.Error("Null-Wert");
}
}
private static void PrintResult_PatternMatching(PersonOperationResult result)
{
if (result is int i)
{
CUI.Error($"Person #{i} nicht gefunden");
}
else if (result is string s)
{
CUI.Error($"Fehler: {s}");
}
else if (result is Exception ex)
{
CUI.Error($"Fehler: {ex.Message}");
}
else if (result is Person p)
{
CUI.Print(p);
}
}
private static void PrintResult_Switch(PersonOperationResult result)
{
Console.WriteLine(result switch
{
Person p => $"Person: {p.Name}",
string s => $"Fehler: {s}",
Exception ex => $"Fehler: {ex.Message}",
int i => $"Person #{i} nicht gefunden",
null => "Null-Wert"
});
}
}

Örnek, bir kimlik belgesine dayalı olarak bir “kişinin” yüklenmesinin çeşitli durumlarını göstermektedir (Şekil 1).
Birleşim türleri için ilk destek Mart ayında .NET 11.0 Preview 2'de kullanıma sunuldu. Ancak Microsoft, blog yazısında bu özellikten bahsetmeyi unuttu. .NET 11.0 Preview 2 sürüm notlarında, C# bağlaması nirvanaya yol açtı. Nisan ayının başlarında, birleştirme türlerinin Önizleme 2'de zaten mümkün olduğunu ancak editör desteği olmadan mümkün olduğunu belirten bir blog yazısı vardı. Düzenleyici artık Visual Studio 2026 Insiders sürüm 11709.129'daki birleşim türleri için çalışıyor.
Ancak Önizleme 3'te bile temel sınıf kitaplığında bazı kodlar hâlâ eksik. Günün yanı sıra <LangVersion>preview</LangVersion> Bu nedenle geliştiricilerin ayrıca aşağıdaki listenin içeriğini proje dosyasındaki ek açıklamanın uygulanmasına dahil etmesi gerekecektir. [Union] ders yoluyla UnionAttribute Birleşim türlerini kullanmak istediğiniz herhangi bir projeye ekleyin:
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,
AllowMultiple = false)]
public sealed class UnionAttribute : Attribute;
public interface IUnion
{
object? Value { get; }
}
}
Arka plan, C# 15.0 derleyicisinin tüm birleştirme türleri için ek açıklamayı otomatik olarak kullanmasıdır. [Union] sağlar. Birleşim türünü kullanırsanız bunu görebilirsiniz ILSpy kaynak koda dönüştürülmüş:
// NET11_Console, Version=11.3.0.0, Culture=neutral, PublicKeyToken=null
// NET11_Console.CS15.PersonOperationResult
using System;
using System.Runtime.CompilerServices;
using NET11_Console.CS15;
[Union]
public struct PersonOperationResult : IUnion
{
public object? Value { get; }
[CompilerGenerated]
public PersonOperationResult(Person? value)
{
Value = value;
}
[CompilerGenerated]
public PersonOperationResult(string value)
{
Value = value;
}
[CompilerGenerated]
public PersonOperationResult(int value)
{
Value = value;
}
[CompilerGenerated]
public PersonOperationResult(Exception value)
{
Value = value;
}
}
Yeni ve değiştirilmiş API'ler
.NET 11.0 Preview 1'de Microsoft, Deflate, GZip ve Brotli'ye alternatif olarak Zstandard sıkıştırmayı tanıttı. Önizleme 3'te bu uygulama artık System.IO.Compression.dll dosyasının bir parçasıdır ve artık tek başına bir System.IO.Compression.Zstandard.dll dosyası değildir. Artık girişlerin CRC32 kontrolü de mevcut, böylece hatalı arşivler hızla tespit ediliyor. ASP.NET Core'da artık HTTP sıkıştırması için Zstandard'ı kullanabilirsiniz. Ancak bu, manuel aktivasyon gerektirir:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddResponseCompression();
builder.Services.AddRequestDecompression();
builder.Services.Configure<ZstandardCompressionProviderOptions>(options =>
{
options.CompressionOptions = new ZstandardCompressionOptions
{
Quality = 6 // 1-22, higher = better compression, slower
};
});
Entity Framework Core nesne ilişkisel eşleştiricisinde yeni bir yöntem var GetEntriesForState() sınıfta ChangeTracker. Bu, örneğin belirli durumlardaki (eklenmiş, değiştirilmiş, silinmiş, değiştirilmemiş) tüm nesneleri teslim etmek için kullanılabilir.
<Image Source="bild.png">
<Image.GestureRecognizers>
<LongPressGestureRecognizer
MinimumPressDuration="1000"
Command="{Binding ShowContextMenuCommand}" />
</Image.GestureRecognizers>
</Image>
Daha önce mevcut olan operasyonun aksine Entries()bu bilgiyi de sağlayan kişi, arayın GetEntriesForState() önceden yöntem değil DetectChanges() iyi doldurulmuş bağlam örneklerinde performansı düşürebilir.
Artık .NET MAUI'de bir tane var LongPressGestureRecognizeruzun süreli baskıya yanıt vermek. Hareketin “uzun” olarak değerlendirilmesi gereken minimum süreyi milisaniye cinsinden belirtebilirsiniz:
<Image Source="bild.png">
<Image.GestureRecognizers>
<LongPressGestureRecognizer
MinimumPressDuration="1000"
Command="{Binding ShowContextMenuCommand}" />
</Image.GestureRecognizers>
</Image>
Ayrıca harita kontrolü
.NET SDK CLI aracılığıyla çözüm filtre dosyaları
Sürüm notlarına göre artık yalnızca Visual Studio aracılığıyla değil, komut satırı aracılığıyla da çözüm filtre dosyaları oluşturabilmeniz gerekiyor. Microsoft bu komut satırı kodunu sürüm notlarında sağlar:
dotnet new slnf --name MyApp.slnf
dotnet sln MyApp.slnf add src/Lib/Lib.csproj
dotnet sln MyApp.slnf list
dotnet sln MyApp.slnf remove src/Lib/Lib.csproj
Ancak hızlı test, uygulamanın sürüm notlarında belirtilenden farklı olduğunu gösterdi çünkü
dotnet new slnf --name MyApp.slnf
çift uzantılı bir dosya oluşturur: MyApp.slnf.slnf. Yani dosya adı uzantısını burada dışarıda bırakmalısınız, ancak aşağıdaki komutlarda mevcut olması gerekir. Ayrıca, Microsoft örneği yalnızca filtrenin tam olarak çözüm dosyasının kendisi gibi, .slnx yerine .slnf ile adlandırılması gerekiyorsa çalışır.
Aşağıdaki kod, farklı bir adla çalışan bir uygulamayı gösterir:
$ErrorActionPreference = "stop"
$slnf = "NET11Blazor.slnf"
$slnfWithExtension = "$slnf.slnf"
dotnet new slnf --name $slnf -s www.IT-Visions.de_NET11_Demos.slnx --force
dotnet sln $slnfWithExtension add NET11_BlazorServer/NET11_BlazorServer.csproj
dotnet sln $slnfWithExtension add NET11_BlazorWASMStandalone/NET11_BlazorWASMStandalone.csproj
dotnet sln $slnfWithExtension list
dotnet sln $slnfWithExtension add NET11_BlazorWASMStandalone/NET11_BlazorWASMStandalone.csproj
dotnet sln $slnfWithExtension list
Dosya tabanlı uygulamalar için içerir
.NET 10.0 ile Microsoft, C# program kodunu çözüm olmadan ve önceden derlemeye gerek kalmadan doğrudan tek bir kaynak kod dosyasında çalıştırabileceğiniz dosya tabanlı uygulamalar olarak adlandırılan uygulamaları tanıttı. .NET 11.0 Preview 3'te bu işlevsellik, dosyaları içerecek şekilde genişletildi. Bu, başka dosyalar oluşturmak için bir C# dosyasındaki yeni yapıyı kullanmanıza olanak tanır #:include katmak:
#:include ./Datenklasse.cs#:include ./Hilfsroutinen.cs
Bunun için şu anda aşağıdaki satıra da ihtiyacınız var:
#:property ExperimentalFileBasedProgramEnableIncludeDirective=true
Geçerli C# Dev Kit sürüm 3.11.200 ile Visual Studio Code sürüm 1.115, düzenleyicinin henüz işlevselliği bilmediğini bildirmektedir:

Visual Studio Code henüz #:include ifadesinin anlamını bilmiyor (Şekil 2).
Entity Framework Core ile şema geçişleri
İle bir veritabanı şeması geçişi oluştururken Add-Migration sırasıyla dotnet ef migrations add Entity Framework Core, şema geçişinin oluşturulduğu andaki nesne modelinin geçerli durumunu temsil eden anlık görüntü dosyasında artık geçerli şema geçişinin adını adlı bir değişkende saklıyor. LatestMigrationId. Orada da bir yorum var:
// If you encounter a merge conflict in the line below, it means you need to
// discard one of the migration branches and recreate its migrations on top of
// the other branch. See https://aka.ms/efcore-docs-migrations-conflicts for more info.
public override string LatestMigrationId => "20260415083524_v9";
Bu, şema geçişlerinizde sürüm çakışması olup olmadığını görmenizi kolaylaştırır.

Entity Framework Core 10.0'daki (solda) nesne modelinin Entity Framework Core 11.0 (sağda) ile karşılaştırmasının anlık görüntüsü (Şekil 3)
Eşzamansız çalışma zamanına yönelik iyileştirmeler
.NET 11.0 Preview 2'den başlayarak, .NET için ilk kez doğrudan eşzamansız çalışma zamanı ortamı mevcuttur. async VE await derleyicinin arka planda bir durum makinesi oluşturmasına gerek kalmadan anlar. Önizleme 3'te Microsoft, ReadyToRun görüntüleri ve yerel AOT ile doğrudan makine kodu oluşturmanın yanı sıra eşzamansız çalışma zamanı ortamını da uygulamıştır. Ayrıca proje ortamı <EnablePreviewFeatures>true</EnablePreviewFeatures> artık gerekli değil. Eşzamansız çalışma zamanı ortamını ayarlamak için tek yapmanız gereken: <Features>runtime-async=on</Features> ayarlamak.
görüş
.NET sürüm 11.0 Preview 3 ve Visual Studio 2026 Insiders sürüm 11709.129 duyurularında ek ayrıntılar bulunabilir.
.NET 11.0'ın Kasım 2026'da piyasaya sürülmesi planlanıyor ve iki yıllık standart süreli destek alacak. O zamana kadar, Mayıs'tan Ağustos'a kadar dört ön izleme sürümünün yanı sıra Eylül ve Ekim aylarında da aday sürümün yayınlanması planlanıyor.
(Ben)

Bir yanıt yazın