Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
C# 15 aşağıdaki yeni özellikleri içerir. En son Visual Studio 2026 insider sürümünü veya .NET 11 önizleme SDK'sını kullanarak bu özellikleri deneyin:
- Koleksiyon ifadesi bağımsız değişkenleri
- Birleşim türleri
- Kapalı hiyerarşiler
- Uzantı dizin oluşturucuları
-
Etiketli
breakvecontinue - Bellek güvenliği
C# 15, en son C# önizleme sürümüdür. .NET 11 önizleme sürümleri C# 15'i destekler. Daha fazla bilgi için bkz. C# dili sürüm oluşturma.
.NET indirmeleri sayfasından en son .NET 11 önizleme SDK'sını indirebilirsiniz. .NET 11 önizleme SDK'sını içeren Visual Studio 2026 insider'ları da indirebilirsiniz.
"C#'deki yenilikler" sayfası, genel önizleme sürümlerinde kullanıma sunulduğunda yeni özellikler ekler. Roslyn özellik durumu sayfasının çalışma kümesi bölümü, yaklaşmakta olan özelliklerin ana dala ne zaman birleştirildiğini izler.
C# 15'te sunulan hataya neden olan değişiklikleri, hataya neden olan değişiklikler hakkındaki makalemizde bulabilirsiniz.
Uyarı
Bu özelliklerle ilgili geri bildirimlerinizle ilgileniyoruz. Bu yeni özelliklerden herhangi biriyle ilgili sorunlar bulursanız, dotnet/roslyn deposunda yeni bir sorun oluşturun.
Koleksiyon ifadesi bağımsız değişkenleri
with(...) öğesini koleksiyon ifadesindeki ilk öğe olarak kullanarak bağımsız değişkenleri temel koleksiyonun oluşturucusuna veya fabrika yöntemine geçirebilirsiniz. Bu özellik, kapasite, karşılaştırıcılar veya diğer oluşturucu parametrelerini doğrudan koleksiyon ifadesi söz diziminde belirtmenizi sağlar.
Aşağıdaki örnekte, bir kapasite argümanını bir List<T> oluşturucuya ve bir karşılaştırıcıyı HashSet<T>'ye nasıl geçireceğiniz gösterilmektedir.
string[] values = ["one", "two", "three"];
// Pass capacity argument to List<T> constructor
List<string> names = [with(capacity: values.Length * 2), .. values];
// Pass comparer argument to HashSet<T> constructor
HashSet<string> set = [with(StringComparer.OrdinalIgnoreCase), "Hello", "HELLO", "hello"];
// set contains only one element because all strings are equal with OrdinalIgnoreCase
Koleksiyon ifadesi bağımsız değişkenleri hakkında daha fazla bilgi edinmek için koleksiyon ifadeleriyle ilgili dil başvurusu makalesine veya özellik belirtimi bakın. Koleksiyon başlatıcılarında koleksiyon ifadesi bağımsız değişkenlerini kullanma hakkında bilgi için bkz. Nesne ve Koleksiyon Başlatıcıları.
Birleşim türleri
C# 15, birden fazla birleşim türünden biri olabilecek bir değeri temsil eden vaka türlerini tanıtır. Bir birleşimi union anahtar sözcüğüyle bildirin.
public record class Cat(string Name);
public record class Dog(string Name);
public record class Bird(string Name);
public union Pet(Cat, Dog, Bird);
Birleşimler her durum tipinden gizli dönüşümler sağlar ve derleyici tüm durum tiplerinde ifadelerin kapsamlı olmasını sağlarswitch:
Pet pet = new Dog("Rex");
string name = pet switch
{
Dog d => d.Name,
Cat c => c.Name,
Bird b => b.Name,
};
Çalışma zamanı, .NET 11 Preview 5 ile başlayan UnionAttribute ve IUnion türlerini içerir.
Teklif belirtiminden bazı özellikler henüz uygulanmadı. Bu özellikler gelecek önizlemelerde sunulacaktır.
Daha fazla bilgi için birleşim türleri veya özellik belirtimi kısmını, dil referansında inceleyebilirsiniz.
Kapalı hiyerarşiler
C# 15’ten itibaren, bir sınıfa closed değiştiricisini uygulayarak kapalı hiyerarşi bildirebilirsiniz. Kapalı bir sınıf yalnızca tanımlandığı derleme içinden türetilebilir; bu da doğrudan türeyenler kümesini derleme zamanında sabitler:
public closed record class GateState;
public record class Closed : GateState;
public record class Open(float Percent) : GateState;
Derleyici her doğrudan alt öğeyi tanıdığından, her birini işleyen bir switch ifade kapsamlıdır ve varsayılan bir kol gerekmez:
string Describe(GateState state) => state switch
{
Closed => "closed",
Open(var percent) => $"{percent}% open",
// No warning: every direct descendant of 'GateState' is handled.
};
Değiştirici closed , bağlamsal bir anahtar sözcüktür. Bir closed sınıf örtük olarak abstract’dir ve sealed, static veya açık bir abstract değiştiricisi ile birleştirilemez. Türetme geçişli değildir: kapalı bir sınıfın kapalı olmayan bir alt sınıfından yine de başka derlemelerde türetme yapılabilir. Kapsayıcılık denetimini hiyerarşi boyunca daha alt düzeylere yaymak için ara alt öğeleri de closed işaretleyin.
Daha fazla bilgi için, dil başvurusundaki kapalı değiştirici ve Kapalı hiyerarşi desenlerine veya özellik belirtimine bakın.
Uzantı dizin oluşturucuları
C# 15'ten itibaren, bir bloğunda extension bildirebilirsiniz. Uzantı dizin oluşturucuları, dizin oluşturucu alıcı türünde bildirilmiştir gibi bir alıcıya dizin oluşturmanızı sağlar. Dizin oluşturucular her zaman örnek üyeleri olduğundan, dizin oluşturucu bildiren bir uzantı bloğunun adlandırılmış bir alıcı parametresi sağlaması gerekir.
Aşağıdaki örnek, IEnumerable<int> üzerinde, belirtilen konumdaki öğeyi döndüren yalnızca get erişimli bir dizin oluşturucu bildirir:
public static class SequenceIndexer
{
extension(IEnumerable<int> sequence)
{
public int this[int index] => sequence.ElementAt(index);
}
}
Dizinleyici, alıcı tipinin bir üyesiymiş gibi alıcı üzerinde indeksleme yaparsınız:
IEnumerable<int> numbers = Enumerable.Range(1, 10);
int third = numbers[2];
Daha fazla bilgi için, dil başvuru belgesindeki Uzantı bildirimi bölümüne ya da özellik belirtimi belgesine bakın.
break ve continue olarak etiketlenen
C# 15'ten itibaren, break ve continue deyimleri kapsayıcı bir yapı üzerindeki bir etiketi adlandırabilir. İçinde bulunulan bir döngüden veya break deyiminden çıkmak için etiketli bir switch kullanın. Bir kapsayan döngünün sonraki yinelemesini başlatmak için etiketli continue bir kullanın.
Etiketli break ve continue, iç döngüde ayarlayıp ardından her dış düzeyde denetlediğiniz bir Boole bayrağı ya da döngülerin dışına atlayan bir goto gibi, normalde iç içe döngülerde denetim akışını yönlendirmek için kullanacağınız geçici çözümlerin yerini alır. Atlama deyiminde hedef döngüyü doğrudan adlandırmak, bu ek takip işini ortadan kaldırır ve amaçlanan kontrol akışını okumayı kolaylaştırır.
outer: for (int row = 0; row < grid.Height; row++)
{
for (int column = 0; column < grid.Width; column++)
{
if (grid[row, column].IsBlocked)
{
continue outer;
}
if (grid[row, column].IsGoal)
{
break outer;
}
}
}
Etiketi, tanımladığı döngünün veya switch deyiminin doğrudan üzerine yerleştirin. Etiket olmadan, break ve continue orijinal davranışlarını korur ve uygulanabilir en içteki deyimi hedefler.
IDE0410 stil kuralı, etiketli bir atlama deyiminin değiştirebileceği Boole bayrağını ve goto desenlerini işaret eder ve her birinin önce ve sonra örneklerini gösterir.
Daha fazla bilgi için, dil başvurusundaki Atlama deyimleri bölümüne veya özellik belirtimine bakın.
Bellek güvenliği
C# 15, dildeki bellek güvenliğini yeniden tanımlamak için çok yönlü bir çalışma başlatır. Amaç, unsafe bağlamını işaretçi türlerinin varlığına değil, yönetilmeyen belleğe gerçekten erişen işlemlere bağlamaktır. Bellek güvenliği güvenlik açıklarının çoğu bu erişim işlemlerinden gelir, bu nedenle dil onları gözden geçirenler ve denetçiler için öne çıkarır.
Tam modelde, unsafe bir üyeyi requires-unsafe olarak işaretler: denetim yükümlülüğü çağırana geçer; çağıran da üyeyi bir unsafe bağlamı içinde kullanmalıdır. Bir derleme bu uygulamaya dahil olur ve derleyici bu seçimi System.Runtime.CompilerServices.MemorySafetyRulesAttribute özniteliğiyle kaydeder. Model ayrıca safe üyeleri ile açık düzen alanlarını güvenli olarak işaretleyen bağlamsal bir extern anahtar sözcük ekler. Bu kurallar birlikte, olası bellek güvenliği ihlallerinin sınırlarını program genelinde açıkça ortaya koyar.
İlk adım işaretçi gevşemelerini içerir. Dil sürümüyle preview derleme yaptığınızda, aşağıdaki işlemler artık bir unsafe bağlam gerektirmez:
- İşaretçi türü bildirme ve
&işleciyle bir değişkenin adresini alma. - Değişkeni sabitleyen
fixeddeyimi. - İfadeyi
stackallocişaretçiye dönüştürme. - Herhangi bir yönetilmeyen türe uygulanan
sizeofişleci
Aşağıdaki örnek, bağlam olmadan unsafe bir işaretçi oluşturur ve sabitler:
int number = 42;
int* pointer = &number;
int[] numbers = [10, 20, 30];
fixed (int* first = numbers)
{
// Dereferencing the pointer still requires an unsafe context.
}
İşaret edilen belleğe erişen işlemler; örneğin işaretçi dolaylılığı (*p), işaretçi üyesi erişimi (p->member), işaretçi öğesi erişimi (p[i]) ve işlev işaretçisi çağrısı, yine de bir unsafe bağlamı gerektirir.
C# 15, unsafe(expression)tek bir unsafe ifade için güvenli olmayan bir bağlam oluşturan bir ifade de ekler. Bir unsafe bloğunun söz dizimsel olarak yer alamadığı durumlarda, örneğin bir alan başlatıcısı, bir oluşturucu başlatıcısı veya bir catch filtresinde kullanışlıdır:
class Header
{
// A field initializer can't contain an unsafe block, but it can contain an unsafe expression.
static readonly int Signature = unsafe(ReadSignature());
static unsafe int ReadSignature()
{
int rawValue = 0x1234;
int* pointer = &rawValue;
return *pointer;
}
}
Bellek güvenliği önizlemesinin geri kalanında olduğu gibi, unsafe ifadeleri de AllowUnsafeBlocks dil sürümünü ve preview derleyici seçeneğini gerektirir.
Derleyici ayrıca extern bağlamsal anahtar sözcüğünü, safe üyelerinde ve açık düzenli alanlarda bir niteleyici olarak tanır. Ancak, requires-unsafe üye modeli ve derlemenin güncellenmiş bellek güvenliği kurallarını açıkça etkinleştirmesi henüz kullanılamadığından, unsafe ve safe şu anda çağıranlar üzerinde hiçbir etkiye sahip değildir.
Daha fazla bilgi için bkz. Dil başvurusunda veya özellik belirtimindegüvenli olmayan kod, işaretçi türleri ve işlev işaretçileri.
Ayrıca bakınız
.NET 11