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. .NET 11 SDK'sını veya Visual Studio 2026'nın uyumlu bir sürümü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 - Eski çalışma zamanlarında sanal olmayan statik arabirim üyeleri
- Bellek güvenliği (önizleme özelliği)
C# 15, .NET 11 SDK'sını hedefleyen net11.0 projeler için varsayılan dil sürümüdür. Bellek güvenliği dışında bu özellikler <LangVersion>preview</LangVersion> gerektirmez. .NET 11 SDK hâlâ ön sürümdedir. Daha fazla bilgi için bkz. C# dili sürüm oluşturma.
Ayrıca bellek güvenliği önizleme özelliğini de deneyebilirsiniz. Söz dizimi ve işaretçi gevşetmeleri için önizleme dili sürümünü ve güncelleştirilmiş güvenlik kuralları için updated-memory-safety-rules özellik bayrağını etkinleştirin.
"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
Temel koleksiyonun oluşturucusuna veya fabrika yöntemine bağımsız değişkenler geçirmek için koleksiyon ifadesindeki ilk öğe olarak bir with(...) öğesini kullanın. 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,
};
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.
Eski çalışma zamanlarında sanal olmayan statik arabirim üyeleri
C# 15'den başlayarak, hedef çalışma zamanı varsayılan arabirim uygulamalarını desteklemese bile sanal olmayan statik arabirim üyelerini bildirebilir ve kullanabilirsiniz. Örneğin, bir arabirim her uygulama türünden bir uygulama gerektirmeden statik bir yardımcı yöntemi sağlayabilir:
public interface IMeasurement
{
public static double ToMeters(double centimeters) => centimeters / 100;
}
Bu yardımcıyı doğrudan arabirim üzerinde çağırın, örneğin, IMeasurement.ToMeters(250). örnek varsayılan uygulamaları, static abstract ve static virtual üyeleri ile korumalı arabirim üyeleri yine de çalışma zamanı desteği gerektirir.
Daha fazla bilgi için bkz. Statik arabirim üyeleri ve çalışma zamanı desteği.
Bellek güvenliği
.NET 11 SDK, dildeki bellek güvenliğini yeniden tanımlamak için birden çok sürümü kapsayan bir çaba başlatan bir bellek güvenliği önizleme özelliği içerir. 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.
Güncelleştirilmiş kuralları etkinleştirdiğinizde, unsafe bir üyede bunu requires-unsafe olarak işaretler: denetim yükümlülüğü, üyeyi bir unsafe bağlamdan kullanması gereken çağırana akar. Derleyici, derlemenin güncelleştirilmiş kuralları kullandığını System.Runtime.CompilerServices.MemorySafetyRulesAttribute özniteliğiyle kaydeder. Model ayrıca açık veya genişletilmiş düzen türlerindeki üyeleri ve alanları güvenli olarak işaretleyen extern bağlamsal bir safe 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, açıkça belirtilmiş veya genişletilmiş düzen türlerindeki safe üyeler ve alanlar da dahil olmak üzere, bir güvenlik sözleşmesi taşıyabilen bildirimlerdeki extern bağlamsal anahtar sözcüğünü de tanır. Yeni söz dizimini ve işaretçi gevşetmelerini etkinleştirmek için preview değerini LangVersion olarak ayarlayın.
requires-unsafe çağıran sorumlulukları da dahil olmak üzere güncelleştirilmiş kuralları da etkinleştirmek için updated-memory-safety-rules derleyici özelliğini etkinleştirin. Proje ve dosya tabanlı program söz dizimi için bkz . Güncelleştirilmiş bellek güvenliği kurallarını etkinleştirme.
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