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.
Not
Bu makale bir özellik belirtimidir. Belirtim, özelliğin tasarım belgesi olarak görev alır. Önerilen belirtim değişikliklerini ve özelliğin tasarımı ve geliştirilmesi sırasında gereken bilgileri içerir. Bu makaleler, önerilen belirtim değişiklikleri son haline getirilene ve geçerli ECMA belirtimine dahil edilene kadar yayımlanır.
Özellik belirtimi ile tamamlanan uygulama arasında bazı tutarsızlıklar olabilir. Bu farklılıklar,ilgili
Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek için
Şampiyon sorunu: https://github.com/dotnet/csharplang/issues/5529
Özet
Üst düzey tür bildirimlerinde file değiştirici kullanmaya izin ver. Türü yalnızca bildirildiği dosyada bulunur.
// File1.cs
namespace NS;
file class Widget
{
}
// File2.cs
namespace NS;
file class Widget // different symbol than the Widget in File1
{
}
// File3.cs
using NS;
var widget = new Widget(); // error: The type or namespace name 'Widget' could not be found.
Motivasyon
Birincil motivasyonumuz kaynak jeneratörlerden geliyor. Kaynak oluşturucular, kullanıcının derlemesine dosya ekleyerek çalışır.
- Bu dosyalar derlemenin geri kalanından gizlenen uygulama ayrıntılarını içerebilmelidir, ancak bildirildikleri dosya boyunca kullanılabilir.
- Tür adlarının kullanıcı kodundaki bildirimlerle veya diğer oluşturuculardan gelen kodlarla çakışmaması için oluşturucuların "arama" ihtiyacını azaltmak istiyoruz.
Ayrıntılı tasarım
-
filedeğiştiricisini aşağıdaki değiştirici kümelerine ekliyoruz:- sınıf
- yapısı
- arabirimi
- sabit listesi
- temsilci
- kayıt
- kayıt yapısı.
-
filedeğiştiricisi yalnızca üst düzey bir türde kullanılabilir.
Bir türün file değiştiricisine sahip olması durumunda, bu türün dosya-yerel bir türü olduğu söylenir.
Erişilebilirlik
file değiştiricisi erişilebilirlik değiştiricisi olarak sınıflandırılmamış. Bir türdeki file ile birlikte hiçbir erişilebilirlik değiştiricisi kullanılamaz.
file, erişilebilirlikten bağımsız bir kavram olarak değerlendirilir. Yerel dosya türleri iç içe yerleştirilemediklerinden, yalnızca varsayılan erişilebilirlik internalfile türlerde kullanılabilir.
public file class C1 { } // error
internal file class C2 { } // error
file class C3 { } // ok
Adlandırma
Uygulama, aynı ada sahip farklı dosyalardaki dosya yerel türlerinin çalışma zamanı için ayrı olmasını garanti eder. Türün meta verilerdeki erişilebilirliği ve adı uygulama tanımlıdır. Amaç, derleyicinin çalışma zamanında özellik için uygun olan gelecekteki erişim sınırlaması özelliklerini benimsemesine izin vermektir. İlk uygulamada bir internal erişilebilirliğinin kullanılması ve türün bildirildiği dosyaya bağlı olarak okunaksız bir adın oluşturulması beklenir.
Arama İşlemi
üye arama bölümünü aşağıdaki gibi değiştiriyoruz (yeni metin kalın):
- Ardından,
Ksıfırsa, bildirimleri tür parametrelerini içeren tüm iç içe türler kaldırılır.Ksıfır değilse, farklı sayıda tür parametresine sahip tüm üyeler kaldırılır.Ksıfır olduğunda, tür çıkarım işlemi (§11.6.3) tür bağımsız değişkenlerini çıkarabileceği için tür parametrelerine sahip yöntemler kaldırılmaz.- Ardından, F üye aramasının gerçekleştiği ifadeyi içeren derleme birimi olmasına izin verin. Dosya yerel türlerinden olan ve F'de bildirilmeyen tüm üyeler kümeden kaldırılır.
- Sonra, erişilebilir üye kümesi dosya yerel türleri içeriyorsa, dosya yerel türleri olmayan tüm üyeler kümeden kaldırılır.
Açıklamalar
Bu kurallar, bildirildiği dosyanın dışındaki dosya yerel türlerinin kullanımına izin vermez.
Bu kurallar, dosya yerel türünün bir ad alanı veya yerel olmayan bir tür gölge
// File1.cs
class C
{
public static void M() { }
}
// File2.cs
file class C
{
public static void M() { }
}
class Program
{
static void Main()
{
C.M(); // refers to the 'C' in File2.cs
}
}
Şuna dikkat edin ki kapsamları bölümünü şartnamede güncelleştirmiyoruz. Bunun sebebi, şartnamenin belirttiği gibi:
Bir adın kapsamı , adın nitelendirilmesine gerek kalmadan adla bildirilen varlığa başvurmanın mümkün olduğu program metni bölgesidir.
Aslında kapsam yalnızca nitelenmemiş adların aramasını etkiler. Bu, nitelikli adların aranma işlemini de etkilememiz gerektiğinden, tam olarak bizim yararlanabileceğimiz bir kavram değildir.
// File1.cs
namespace NS1
{
file class C
{
public static void M() { }
}
}
namespace NS2
{
class Program
{
public static void M()
{
C.M(); // error: C is not in scope
NS1.C.M(); // ok: C can be accessed through NS1.
}
}
}
// File2.cs
namespace NS1
{
class Program
{
C.M(); // error
NS1.C.M(); // error
}
}
Bu nedenle, özelliği türün hangi kapsamda yer aldığı açısından değil, üye aramasında ek "filtreleme kuralları" olarak belirtiriz.
Öznitelik
Dosya yerel sınıflarının öznitelik türleri olmasına izin verilir ve öznitelik türü dosya yerel olmayan bir tür gibi hem dosya yerel türleri hem de yerel olmayan türler içinde öznitelik olarak kullanılabilir. Dosya yerel öznitelik türünün meta veri adı, diğer dosya yerel türleriyle aynı ad oluşturma stratejisinden geçer. Bu, sabit kodlanmış bir dize adı kullanarak dosya-yerel bir türün varlığını algılamanın muhtemelen pratik olmadığı anlamına gelir, çünkü derleyicinin zamanla değişebilecek iç ad oluşturma stratejisine bağlı olmak gerekir. Ancak, typeof(MyFileLocalAttribute) aracılığıyla algılama işe yarar.
using System;
using System.Linq;
file class MyFileLocalAttribute : Attribute { }
[MyFileLocalAttribute]
public class C
{
public static void Main()
{
var attribute = typeof(C).CustomAttributes.Where(attr => attr.AttributeType == typeof(MyFileLocalAttribute)).First();
Console.Write(attribute); // outputs the generated name of the file-local attribute type
}
}
İmzalardaki kullanım
Dosya yerel türlerinin, üyenin kullanım noktasında kapsamda olmayabileceği durumlarda, üye parametrelerinde, dönüşlerinde ve tür parametresi kısıtlamalarında görünmesini önlemeye yönelik genel bir gereksinim vardır.
Dosya yerel olmayan türlerin, türlerin daha az erişilebilir arabirimleri nasıl uygulayabileceğine benzer şekilde dosya yerel arabirimleri uygulamasına izin verilebileceğini unutmayın. Arabirim üyelerinde bulunan türlere bağlı olarak, aşağıdaki bölümde kuralların ihlaline neden olabilir.
Yalnızca dosya yerel türlerinin üyelerinde imza kullanımına izin ver
Bunu sağlamanın en basit yolu, bu dosya yerel türlerinin yalnızca imzalarda veya diğer dosya yerel türlerinin temel türleri olarak görünmesini zorunlu kılmaktır:
file class FileBase
{
}
public class Derived : FileBase // error
{
private FileBase M2() => new FileBase() // error
}
file class FileDerived : FileBase // ok
{
private FileBase M2() => new FileBase(); // ok
}
Bu tür kullanımlar güvenli olsa bile, bunun açık uygulamalarda kullanımı kısıtladığını unutmayın. Özelliğin ilk yinelenmesine yönelik kuralları basitleştirmek için bunu yaparız.
file interface I
{
void M(I i);
}
class C : I
{
void I.M(I i) { } // error
}
global using static
global using static yönergesinde dosya yerel türünü kullanmak bir derleme zamanı hatasıdır; örneğin.
global using static C; // error
file class C
{
public static void M() { }
}
Uygulama/geçersiz kılmalar
dosya yerel tür bildirimleri, normal tür bildirimleri gibi arabirimler uygulayabilir, sanal yöntemleri geçersiz kılabilir.
file struct Widget : IEquatable<Widget>
{
public bool Equals(Widget other) => true;
}
C# feature specifications