Dosya Kapsamlı Ad Alanları
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 dil tasarım toplantısı (LDM) notlarında
Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek için
Özet
Dosya kapsamlı ad alanları, yalnızca bir ad alanı içeren dosyaların tipik durumu için daha az ayrıntılı bir biçim kullanır. Dosya kapsamlı ad alanı biçimi namespace X.Y.Z;
(noktalı virgül ve küme ayracı eksikliğini not edin). Bu, aşağıdaki gibi dosyalara izin verir:
namespace X.Y.Z;
using System;
class X
{
}
Semantik, namespace X.Y.Z;
formu kullanmanın, dosya kapsamlı ad alanını izleyen dosyanın geri kalanının standart ad alanı bildiriminin ...
bölümünde yer aldığı namespace X.Y.Z { ... }
yazmaya eşdeğer olmasıdır.
Motivasyon
C# ekosisteminin analizi, yaklaşık 99,7% dosyasının şu biçimlerden biri olduğunu gösterir:
namespace X.Y.Z
{
// usings
// types
}
veya
// usings
namespace X.Y.Z
{
// types
}
Ancak, her iki biçim de kullanıcıyı kodunun büyük kısmını girintilemeye zorlar ve aslında çok temel bir kavram için önemli ölçüde fazladan iş yükü ekler. Bu, netliği, yatay ve dikey alan kullanımını etkiler ve hem C#'ye alışkın olan hem de genellikle burada daha az tören içeren diğer dillerden gelen kullanıcılar için sıklıkla tatmin edici değildir.
Bu nedenle özelliğin birincil hedefi, ekosistemin çoğunluğunun ihtiyaçlarını gereksiz ayrıntılar olmadan karşılamaktır.
Ayrıntılı tasarım
Bu teklif, belirtimin mevcut derleme birimleri (§14.2) bölümüne bir farklılık olarak sunulmaktadır.
Fark
compilation_unit bir kaynak dosyanın genel yapısını tanımlar. Derleme birimi, sıfır veya daha fazla using_directive, ardından sıfır veya daha fazla global_attributes ve son olarak sıfır veya daha fazla namespace_member_declarationiçerebilir.
compilation_unit bir kaynak dosyanın genel yapısını tanımlar. Derleme birimi sıfır veya daha fazla using_directive, ardından sıfır veya daha fazla global_attributes ve ardından bir compilation_unit_bodyoluşur.
compilation_unit
~~ : extern_alias_directive* using_directive* global_attributes? namespace_member_declaration*~~
: extern_alias_directive* using_directive* global_attributes? compilation_unit_body
;
compilation_unit_body
: statement* namespace_member_declaration*
| file_scoped_namespace_declaration
;
... değişmeden ...
Bir file_scoped_namespace_declaration, anlamsal olarak eşdeğer olduğu namespace_declaration'e karşılık gelen üyeleri sağlar. Daha fazla bilgi için bkz. (Ad Alanı Bildirimleri) .
Ad alanı bildirimleri
namespace_declaration, namespace
anahtar kelimesiyle başlayan, ardından bir ad alanı ismi ve gövdesi gelen, isteğe bağlı olarak bir noktalı virgülle devam eden bir yapıdır.
file_scoped_namespace_declaration, namespace
anahtar sözcüğünden ve ardından ad alanı adı, noktalı virgül ve isteğe bağlı extern_alias_directives, using_directives ve type_declarationlistesinden oluşur.
namespace_declaration
: 'namespace' qualified_identifier namespace_body ';'?
;
file_scoped_namespace_declaration
: 'namespace' qualified_identifier ';' extern_alias_directive* using_directive* type_declaration*
;
... unchanged ...
... değişmeden ...
Yukarıdaki iki ad alanı bildirimi, aynı bildirim alanına katkıda bulunur; bu durumda, N1.N2.A
ve N1.N2.B
tam adlarına sahip iki sınıf bildirir. İki bildirim aynı deklarasyon alanına katkıda bulunduğu için, her biri aynı ada sahip bir üye bildirimi içeriyorsa bu bir hata teşkil ederdi.
file_scoped_namespace_declaration, bir ad alanı bildiriminin { ... }
bloğu olmadan yazılmasına izin verir. Örneğin:
extern alias A;
namespace Name;
using B;
class C
{
}
anlamsal olarak eşdeğer
extern alias A;
namespace Name
{
using B;
class C
{
}
}
Özellikle, bir file_scoped_namespace_declaration, aynı qualified_identifierile aynı konumdaki bir compilation_unit içinde bir namespace_declaration olarak muamele edilir. Bu file_scoped_namespace_declaration içindeki extern_alias_directive'ler, using_directive'ler ve type_declaration'ler, namespace_body içinde, namespace_declarationile aynı sırada bildirilmiş gibi davranır.
Kaynak dosya hem file_scoped_namespace_declaration hem de namespace_declarationiçeremez. Kaynak dosya birden çok file_scoped_namespace_declarationiçeremez.
Extern takma adlar
... değişmeden ...
C# feature specifications