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, dil tasarım toplantısı (LDM)'deki notlarda kaydedilmiştir.
Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek için belirtimleri makalesinde bulabilirsiniz.
Şampiyon sayısı: https://github.com/dotnet/csharplang/issues/8645
Özet
Using_alias_directive (§13.5.2) üzerindeki kısıtlamaları gevşeterek, sadece adlandırılmış türler yerine herhangi bir türü işaret edebilmesini sağlayın. Bu, tanımlama grubu türleri, işaretçi türleri, dizi türleri vb. gibi bugün izin verilmeyen türleri destekler. Örneğin, buna artık izin verilir:
using Point = (int x, int y);
Motivasyon
C# uzun zamandır ad alanları ve adlandırılmış türler (sınıflar, temsilciler, arabirimler, kayıtlar ve yapılar) için diğer adlar ekleme özelliğine sahiptir. Bu, using_directive
'lerden alınan normal bir adın belirsiz olabileceği ve karmaşık genel türlerle ilgilenirken daha basit bir ad sağlamanın bir yolunu sağladığı durumlarda çakışmayan adlar sunmak için uygun bir yöntem sağladığından, kabul edilebilir bir şekilde işe yaradı. Ancak, dildeki ek karmaşık tür simgelerinin artması, diğer adların değerli olduğu ancak şu anda izin verilmediği durumlarda daha fazla kullanımın ortaya çıkmasına neden olmuştur. Örneğin, hem tanımlama demetleri hem de işlev işaretçileri genellikle sürekli olarak yazmak için acı verici olabilecek büyük ve karmaşık düzenli metin biçimlerine ve okumaya çalışma yüküne sahip olabilir. Diğer adlar bu durumlarda, bu tam yapısal formlar yerine kullanılabilecek kısa, geliştirici tarafından sağlanan bir ad vererek yardımcı olabilir.
Ayrıntılı tasarım
using_alias_directive
'nin gramerini bu şekilde değiştireceğiz:
using_alias_directive
- : 'using' identifier '=' namespace_or_type_name ';'
+ : 'using' identifier '=' (namespace_name | type) ';'
;
Üst düzey başvuru türü null değeri atanabilirlik açıklama notlarına izin verilmiyor.
İlginç bir şekilde, §13.5.2 belirtim dilinin çoğunun değişmesi gerekmez. Zaten birçok dil 'ad alanı veya tür'e atıfta bulunur, örneğin:
Using_alias_directive, bir derleme birimi veya ad alanı gövdesi içinde, ad alanı veya tür için bir diğer ad olarak hizmet eden bir tanımlayıcı tanıtır.
Bu durum hâlâ geçerli, ancak dil bilgisi artık 'türün' artık namespace_or_type_name
ile sınırlı olan kümeye değil, herhangi bir keyfi türe izin veriyor.
Güncelleştirilmesi gereken bölümler şunlardır:
- The order in which using_alias_directives are written has no significance, and resolution of the namespace_or_type_name referenced by a using_alias_directive is not affected by the using_alias_directive itself or by other using_directives in the immediately containing compilation unit or namespace body. In other words, the namespace_or_type_name of a using_alias_directive is resolved as if the immediately containing compilation unit or namespace body had no using_directives. A using_alias_directive may however be affected by extern_alias_directives in the immediately containing compilation unit or namespace body. In the example
+ The order in which using_alias_directives are written has no significance, and resolution of the `(namespace_name | type)` referenced by a using_alias_directive is not affected by the using_alias_directive itself or by other using_directives in the immediately containing compilation unit or namespace body. In other words, the `(namespace_name | type)` of a using_alias_directive is resolved as if the immediately containing compilation unit or namespace body had no using_directives. A using_alias_directive may however be affected by extern_alias_directives in the immediately containing compilation unit or namespace body. In the example
- The namespace_name referenced by a using_namespace_directive is resolved in the same way as the namespace_or_type_name referenced by a using_alias_directive. Thus, using_namespace_directives in the same compilation unit or namespace body do not affect each other and can be written in any order.
+ The namespace_name referenced by a using_namespace_directive is resolved in the same way as the namespace_or_type_name referenced by a using_alias_directive. Thus, using_namespace_directives in the same compilation unit or namespace body do not affect each other and can be written in any order.
+ It is illegal for a using alias type to be a nullable reference type.
1. `using X = string?;` is not legal.
2. `using X = List<string?>;` is legal. The alias is to `List<...>` which is itself not a nullable reference type itself, even though it contains one as a type argument.
3. `using X = int?;` is legal. This is a nullable *value* type, not a nullable *reference* type.
İşaretçi içeren türler için takma adları destekleme.
yeni güvenli olmayan bağlam, using_alias_directive üretiminde isteğe bağlı 'güvensiz' anahtar sözcüğü ile eklenir.
using_alias_directive
+ : 'using' 'unsafe'? identifier '=' (namespace_name | type) ';'
;
using_static_directive
+ : 'using' 'static' 'unsafe'? type_name ';'
;
+ 'unsafe' can only be used with an using_alias_directive or using_static_directive, not a using_directive.
+ The 'unsafe' keyword present in a 'using_alias_directive' causes the entire textual extent of the 'type' portion (not the 'namespace_name' portion) to become an unsafe context.
+ The 'unsafe' keyword present in a 'using_static_directive' causes the entire textual extent of the 'type_name' portion to become an unsafe context.
C# feature specifications