Temel kavramlarBasic concepts

Uygulama başlatmaApplication Startup

Bir derlemeye bir giriş noktası çağrılır bir uygulama.An assembly that has an entry point is called an application. Bir uygulama olduğunda çalıştırın, yeni bir uygulama etki alanı oluşturulur.When an application is run, a new application domain is created. Bir uygulamayı birkaç farklı örneklemeleri aynı makinede aynı anda mevcut olabilir ve her biri kendi uygulama etki alanı vardır.Several different instantiations of an application may exist on the same machine at the same time, and each has its own application domain.

Uygulama etki alanı, uygulama durumu için kapsayıcı olarak çalışan tarafından uygulama yalıtımı sağlar.An application domain enables application isolation by acting as a container for application state. Uygulama etki alanı, bir kapsayıcı ve uygulama ve kullandığı sınıf kitaplıkları içinde tanımlanan türler için sınır olarak görev yapar.An application domain acts as a container and boundary for the types defined in the application and the class libraries it uses. Aynı türden başka bir uygulama etki alanına yüklenen bir uygulama etki alanına yüklenen türleri farklıdır ve nesnelerin örneklerini uygulama etki alanları arasında doğrudan paylaşılmaz.Types loaded into one application domain are distinct from the same type loaded into another application domain, and instances of objects are not directly shared between application domains. Örneğin, her uygulama etki alanı statik değişkenler bu türleri için kendi kopyasına sahip ve bir tür için bir statik Oluşturucu uygulama etki alanı başına en fazla bir kez çalıştırılır.For instance, each application domain has its own copy of static variables for these types, and a static constructor for a type is run at most once per application domain. Uygulamaları oluşturma ve yok edilmesini uygulama etki alanları için uygulamaya özel ilke veya mekanizmaları sağlamak ücretsizdir.Implementations are free to provide implementation-specific policy or mechanisms for the creation and destruction of application domains.

Uygulama başlatma yürütme ortamı uygulamanın giriş noktası olarak adlandırılan belirlenen bir yöntemi çağırdığında gerçekleşir.Application startup occurs when the execution environment calls a designated method, which is referred to as the application's entry point. Bu giriş noktası yönteminin her zaman adlı Mainve aşağıdaki imzalara sahip olabilir:This entry point method is always named Main, and can have one of the following signatures:

static void Main() {...}

static void Main(string[] args) {...}

static int Main() {...}

static int Main(string[] args) {...}

Gösterildiği gibi giriş noktası isteğe bağlı olarak döndürebilir bir int değeri.As shown, the entry point may optionally return an int value. Bu dönüş değeri, uygulama sonlandırılmasıyla kullanılır (uygulama sonlandırma).This return value is used in application termination (Application termination).

Giriş noktası isteğe bağlı olarak bir biçimsel parametreye sahip olabilir.The entry point may optionally have one formal parameter. Parametresi, herhangi bir ad olabilir, ancak parametresinin türü olmalıdır string[].The parameter may have any name, but the type of the parameter must be string[]. Biçimsel parametre varsa, yürütme ortamı oluşturur ve başarılı bir string[] olan komut satırı bağımsız değişkenleri içeren değişken belirtilen uygulama başlatıldığı.If the formal parameter is present, the execution environment creates and passes a string[] argument containing the command-line arguments that were specified when the application was started. string[] Bağımsız değişken NULL'dur hiçbir zaman, ancak hiçbir komut satırı bağımsız değişkenleri belirtilmişse sıfır uzunluğuna sahip olabilir.The string[] argument is never null, but it may have a length of zero if no command-line arguments were specified.

C# yöntemi aşırı yüklemesi desteklediğinden, sağlanan her farklı bir imzaya sahip bir sınıfın veya yapının bazı yöntemi birden çok tanımları içerebilir.Since C# supports method overloading, a class or struct may contain multiple definitions of some method, provided each has a different signature. Ancak, tek bir program içindeki herhangi bir sınıf veya yapı adında birden fazla yöntem içerebilir Main tanımında bu uygulaması giriş noktası olarak kullanılacak niteliği taşır.However, within a single program, no class or struct may contain more than one method called Main whose definition qualifies it to be used as an application entry point. Diğer aşırı yüklenmiş sürümleri Main , ancak birden fazla parametre sahip oldukları ya da yalnızca kendi parametre türüdür dışında sağlanan izin verilen string[].Other overloaded versions of Main are permitted, however, provided they have more than one parameter, or their only parameter is other than type string[].

Bir uygulamanın birden fazla sınıflar veya yapılar oluşur.An application can be made up of multiple classes or structs. Adlı yöntemi içeren birden fazla bu sınıflar veya yapılar için mümkün olduğu Main tanımında bu uygulaması giriş noktası olarak kullanılacak niteliği taşır.It is possible for more than one of these classes or structs to contain a method called Main whose definition qualifies it to be used as an application entry point. Böyle durumlarda (örneğin, bir komut satırı derleyicisi seçeneği) veren dış mekanizmayı bunlardan birini seçmek için kullanılmalıdır Main giriş noktası olarak yöntemler.In such cases, an external mechanism (such as a command-line compiler option) must be used to select one of these Main methods as the entry point.

C# ' ta her yöntemi bir sınıf veya yapı üyesi olarak tanımlanmalıdır.In C#, every method must be defined as a member of a class or struct. Normalde, bildirilen erişilebilirliği (erişilebilirlik bildirilen) yöntemi tarafından erişim değiştiricileri belirlenir (erişim değiştiricilerine) bildiriminden ve benzer şekilde bildirilen belirtilen bir türün erişilebilirlik bildiriminde belirtilen erişim değiştiricileri tarafından belirlenir.Ordinarily, the declared accessibility (Declared accessibility) of a method is determined by the access modifiers (Access modifiers) specified in its declaration, and similarly the declared accessibility of a type is determined by the access modifiers specified in its declaration. Çağrılabilir olması için sırada belirli bir yöntemin belirli bir türün, tür ve üye hem erişilebilir olması gerekir.In order for a given method of a given type to be callable, both the type and the member must be accessible. Ancak, uygulama giriş noktası bir özel durumdur.However, the application entry point is a special case. Özellikle, yürütme ortamı, uygulamanın giriş noktasını bakılmaksızın kendi bildirilen erişilebilirliği ve öğesinin bildirilen erişilebilirliği kapsayan kendi tür bildirimleri bağımsız olarak erişebilirsiniz.Specifically, the execution environment can access the application's entry point regardless of its declared accessibility and regardless of the declared accessibility of its enclosing type declarations.

Uygulama giriş noktası yöntemi, bir genel sınıf bildiriminde olmayabilir.The application entry point method may not be in a generic class declaration.

Diğer tüm yönden girdi noktası yöntemleri giriş noktası olmayan olanlar gibi davranır.In all other respects, entry point methods behave like those that are not entry points.

Uygulamayı sonlandırmaApplication termination

Uygulama sonlandırma yürütme ortamı denetimini döndürür.Application termination returns control to the execution environment.

Uygulamanın, dönüş türü giriş noktası yöntemi int, döndürülen değer uygulamanın hizmet veren sonlandırma durum kodu.If the return type of the application's entry point method is int, the value returned serves as the application's termination status code. Bu kodun amacı, başarı veya başarısızlık yürütme ortamı için iletişime izin vermektir.The purpose of this code is to allow communication of success or failure to the execution environment.

Giriş noktası yönteminin dönüş türü ise void, sağ ayraç ulaşmasını (}), sonlandıran yöntemi veya yürütülürken bir return olan herhangi bir ifade deyimi sonlandırma durum koduna sonuçları 0.If the return type of the entry point method is void, reaching the right brace (}) which terminates that method, or executing a return statement that has no expression, results in a termination status code of 0.

Bu tür temizleme atlanmadıkları sürece uygulamanın sonlanması öncesinde yok ediciler için tüm henüz çöp olarak toplanacak olan nesneleri, çağrılır (kitaplık yöntemine bir çağrıyla GC.SuppressFinalize, örneğin).Prior to an application's termination, destructors for all of its objects that have not yet been garbage collected are called, unless such cleanup has been suppressed (by a call to the library method GC.SuppressFinalize, for example).

BildirimlerDeclarations

Bildirimleri bir C# programında, programın şekli oluşturan öğeler tanımlayın.Declarations in a C# program define the constituent elements of the program. C# programları, ad alanlarını kullanarak düzenlenir (ad alanları), türü içerebilecek bildirimler ve iç içe geçmiş ad alanı bildirimi.C# programs are organized using namespaces (Namespaces), which can contain type declarations and nested namespace declarations. Tür bildirimleri (tür bildirimleri) sınıflarını tanımlamak için kullanılır (sınıfları), yapılar (yapılar), arabirimleri (arabirimleri ), sabit listeleri (numaralandırmalar) ve temsilciler (Temsilciler).Type declarations (Type declarations) are used to define classes (Classes), structs (Structs), interfaces (Interfaces), enums (Enums), and delegates (Delegates). Türde üye türü bildiriminde izin türü bildirimi formunda bağlıdır.The kinds of members permitted in a type declaration depend on the form of the type declaration. Örneğin, sınıf bildirimleri sabitleri için bildirimi içerebilir (sabitleri), alanlar (alanları), yöntemleri (yöntemleri), özellikleri ( Özellikleri), olaylar (olayları), dizin oluşturucular (dizin oluşturucular), işleçler (işleçleri), örnek oluşturucuları ( Örnek oluşturucuları), statik oluşturucular (statik oluşturucular), Yıkıcılar (yok ediciler) ve iç içe geçmiş türler (iç içe türler).For instance, class declarations can contain declarations for constants (Constants), fields (Fields), methods (Methods), properties (Properties), events (Events), indexers (Indexers), operators (Operators), instance constructors (Instance constructors), static constructors (Static constructors), destructors (Destructors), and nested types (Nested types).

Bir bildirimi bir ad tanımlar bildirim alanı bildirimi ait olduğu.A declaration defines a name in the declaration space to which the declaration belongs. Hariç üyeler aşırı (imzalar ve aşırı yükleme), bir bildirim alanında aynı ada sahip üye tanıtan iki veya daha fazla bildirimleri sağlamak için bir derleme zamanı hata.Except for overloaded members (Signatures and overloading), it is a compile-time error to have two or more declarations that introduce members with the same name in a declaration space. Aynı ada sahip üyelerinin farklı türleri içeren bir bildirim alanı için hiçbir zaman mümkündür.It is never possible for a declaration space to contain different kinds of members with the same name. Örneğin, bir bildirim alanı hiçbir zaman alan ve bir yöntem aynı adla içerebilir.For example, a declaration space can never contain a field and a method by the same name.

Aşağıda açıklandığı gibi birkaç farklı türde bildirimi alanları vardır.There are several different types of declaration spaces, as described in the following.

  • Bir programın tüm kaynak dosyaları içinde namespace_member_declarationhiçbir kapsayan ile s namespace_declaration adlı tek bir birleştirilmiş bildirimi boşluk üyeleri genel Bildirim alanı.Within all source files of a program, namespace_member_declarations with no enclosing namespace_declaration are members of a single combined declaration space called the global declaration space.
  • Bir programın tüm kaynak dosyaları içinde namespace_member_declarationürününe namespace_declarationtam ad alanı ile aynı ada sahip s olan tek bir birleştirilmiş bildirimine üyeleri boşluk.Within all source files of a program, namespace_member_declarations within namespace_declarations that have the same fully qualified namespace name are members of a single combined declaration space.
  • Yeni bir bildirim alanı her sınıf, yapı veya arabirim bildirimi oluşturur.Each class, struct, or interface declaration creates a new declaration space. Adları kullanıma sunulan bu bildirim alanına class_member_declarations, struct_member_declarations, interface_member_declarations, veya type_parameters.Names are introduced into this declaration space through class_member_declarations, struct_member_declarations, interface_member_declarations, or type_parameters. Aşırı yüklenmiş bir örnek oluşturucusu hariç, bildirimler ve statik Oluşturucu bildirimi, bir sınıfın veya yapının sınıfın veya yapının aynı ada sahip bir üye bildirimi içeremez.Except for overloaded instance constructor declarations and static constructor declarations, a class or struct cannot contain a member declaration with the same name as the class or struct. Bir sınıf, yapı veya arabirim aşırı yüklenmiş yöntemler ve dizin oluşturucular bildirimi izin verir.A class, struct, or interface permits the declaration of overloaded methods and indexers. Ayrıca, bir sınıf veya yapı bildirimi aşırı yüklenmiş örnek oluşturucuları ve işleçleri izin verir.Furthermore, a class or struct permits the declaration of overloaded instance constructors and operators. Bu yöntem bildirimleri kendi imzasında farklı sağlanan Örneğin, bir sınıf, yapı veya arabirim aynı ada sahip birden çok yöntem bildirimleri içerebilir (imzalar ve aşırı yükleme).For example, a class, struct, or interface may contain multiple method declarations with the same name, provided these method declarations differ in their signature (Signatures and overloading). Temel sınıflar bir sınıfın bildiriminin alanına katkıda bulunan değil ve temel arabirimleri bildirim alanına bir arabirimin katkıda bulunmuyor unutmayın.Note that base classes do not contribute to the declaration space of a class, and base interfaces do not contribute to the declaration space of an interface. Bu nedenle, türetilen bir sınıfta veya arabirimde aynı ada sahip bir üyesi devralınmış bir üyeyi olarak bildirin izin verilmez.Thus, a derived class or interface is allowed to declare a member with the same name as an inherited member. Böyle bir üyesi edilir Gizle devralınan üye.Such a member is said to hide the inherited member.
  • Yeni bir bildirim alanı her temsilci bildirimi oluşturur.Each delegate declaration creates a new declaration space. Adları bu bildirim alanına biçimsel parametreler aracılığıyla kullanıma sunulmuştur (fixed_parameters ve parameter_arrays) ve type_parameters.Names are introduced into this declaration space through formal parameters (fixed_parameters and parameter_arrays) and type_parameters.
  • Yeni bir bildirim alanı her numaralandırma bildirimi oluşturur.Each enumeration declaration creates a new declaration space. Adları kullanıma sunulan bu bildirim alanına enum_member_declarations.Names are introduced into this declaration space through enum_member_declarations.
  • Her yöntem bildiriminde, dizin oluşturucu bildirimi, işleç bildirimi, kopya Oluşturucusu bildirimi ve anonim işlev adı verilen yeni bir bildirim alanı oluşturur bir yerel değişken bildiriminde yer.Each method declaration, indexer declaration, operator declaration, instance constructor declaration and anonymous function creates a new declaration space called a local variable declaration space. Adları bu bildirim alanına biçimsel parametreler aracılığıyla kullanıma sunulmuştur (fixed_parameters ve parameter_arrays) ve type_parameters.Names are introduced into this declaration space through formal parameters (fixed_parameters and parameter_arrays) and type_parameters. İşlev üyesi veya anonim işlev gövdesinin varsa, yerel değişken bildiriminde alanı içinde iç içe geçmiş kabul edilir.The body of the function member or anonymous function, if any, is considered to be nested within the local variable declaration space. Bir yerel değişken bildiriminde alan ve aynı ada sahip öğeleri içeren bir iç içe yerel değişken bildiriminde alan için bir hatadır.It is an error for a local variable declaration space and a nested local variable declaration space to contain elements with the same name. Bu nedenle, bir iç içe geçmiş bir bildirim alanı içinde yerel bir değişken veya yerel bir değişken olarak aynı ada sahip sabit veya sabit kapsayan bir bildirim alanı bildirmek mümkün değildir.Thus, within a nested declaration space it is not possible to declare a local variable or constant with the same name as a local variable or constant in an enclosing declaration space. Diğer bildirim boşluk içerdiği sürece aynı ada sahip öğeleri içeren iki bildirimi boşluk mümkündür.It is possible for two declaration spaces to contain elements with the same name as long as neither declaration space contains the other.
  • Her blok veya switch_block , hem de bir için, foreach ve kullanarak deyimi, oluşturur bir yerel değişken bildiriminde yer yerel değişkenleri ve yerel sabitleri için.Each block or switch_block , as well as a for, foreach and using statement, creates a local variable declaration space for local variables and local constants . Adları kullanıma sunulan bu bildirim alanına local_variable_declarations ve local_constant_declarations.Names are introduced into this declaration space through local_variable_declarations and local_constant_declarations. İçinde kendi parametrelerini için bu işlevleri tarafından bildirilen yerel değişken bildiriminde yer olarak veya bir üye işlev veya anonim işlev gövdesi içinde oluşan bloklar yerleştirilir unutmayın.Note that blocks that occur as or within the body of a function member or anonymous function are nested within the local variable declaration space declared by those functions for their parameters. Bu nedenle, örneğin bir yerel değişken ve aynı ada sahip bir parametre ile bir yöntem sağlamak için bir hatadır.Thus it is an error to have e.g. a method with a local variable and a parameter of the same name.
  • Her blok veya switch_block etiketleri için ayrı bildirim boşluk oluşturur.Each block or switch_block creates a separate declaration space for labels. Adları kullanıma sunulan bu bildirim alanına labeled_statements yanı sıra, adları başvuru aracılığıyla goto_statements.Names are introduced into this declaration space through labeled_statements, and the names are referenced through goto_statements. Etiket bildirim alanı bloğu tüm iç içe geçmiş blokları içerir.The label declaration space of a block includes any nested blocks. Bu nedenle, iç içe geçmiş bir bloğu içinde kapsayan bir blok içinde bir etiket olarak aynı ada sahip bir etiket bildirmek mümkün değildir.Thus, within a nested block it is not possible to declare a label with the same name as a label in an enclosing block.

Adları bildirilen metinsel genellikle hiçbir önemini sırasıdır.The textual order in which names are declared is generally of no significance. Özellikle, metinsel sırası önemli bildirimler ve ad alanları, sabitleri, yöntemleri, özellikleri, olayları, Dizinleyicileri, işleçleri, örnek oluşturucuları, yok ediciler, statik oluşturucular ve türleri kullanımı için değildir.In particular, textual order is not significant for the declaration and use of namespaces, constants, methods, properties, events, indexers, operators, instance constructors, destructors, static constructors, and types. Aşağıdaki yollarla bildirim sırası önemlidir:Declaration order is significant in the following ways:

  • Alan bildirimleri ve yerel değişken bildirimleri için bildirim sırasında kendi başlatıcıları (varsa) yürütüldüğü sırasını belirler.Declaration order for field declarations and local variable declarations determines the order in which their initializers (if any) are executed.
  • Yerel değişkenler, kullanılmadan önce tanımlanmalıdır (kapsamları).Local variables must be defined before they are used (Scopes).
  • Sabit listesi üye bildirimleri için bildirim sırasında (numaralandırma üyeleri) önemli olduğunda constant_expression değerleri atlanmış.Declaration order for enum member declarations (Enum members) is significant when constant_expression values are omitted.

Bildirimi bir ad alanının "Bitti" açık"ve iki ad alanı bildirimleri aynı tam ada sahip aynı bildirim alanına katkıda bulunan bir alandır.The declaration space of a namespace is "open ended", and two namespace declarations with the same fully qualified name contribute to the same declaration space. Örneğin:For example

namespace Megacorp.Data
{
    class Customer
    {
        ...
    }
}

namespace Megacorp.Data
{
    class Order
    {
        ...
    }
}

Bu durumda tam olarak nitelenmiş ada sahip iki sınıfları bildirme aynı bildirim alanına, yukarıdaki iki ad alanı bildirimi katkıda Megacorp.Data.Customer ve Megacorp.Data.Order.The two namespace declarations above contribute to the same declaration space, in this case declaring two classes with the fully qualified names Megacorp.Data.Customer and Megacorp.Data.Order. İki bildirimi aynı bildirim alanına katkıda bulunan, her aynı ada sahip bir sınıf bildirimi içeriyorsa, bir derleme zamanı hatası nedeni.Because the two declarations contribute to the same declaration space, it would have caused a compile-time error if each contained a declaration of a class with the same name.

Bildirim alanı bir blok olarak yukarıda belirtilen, herhangi bir iç içe geçmiş bloğu içerir.As specified above, the declaration space of a block includes any nested blocks. Bu nedenle, aşağıdaki örnekte, F ve G yöntemleri, çünkü bir derleme zamanı hatası neden adı i dış blokta bildirilen ve iç bloğu içinde bildirilemez.Thus, in the following example, the F and G methods result in a compile-time error because the name i is declared in the outer block and cannot be redeclared in the inner block. Ancak, H ve I yöntemleri iki itibaren geçerlidir iait ayrı iç içe olmayan bloklar olarak bildirilir.However, the H and I methods are valid since the two i's are declared in separate non-nested blocks.

class A
{
    void F() {
        int i = 0;
        if (true) {
            int i = 1;            
        }
    }

    void G() {
        if (true) {
            int i = 0;
        }
        int i = 1;                
    }

    void H() {
        if (true) {
            int i = 0;
        }
        if (true) {
            int i = 1;
        }
    }

    void I() {
        for (int i = 0; i < 10; i++)
            H();
        for (int i = 0; i < 10; i++)
            H();
    }
}

ÜyelerMembers

Ad alanları ve türler sahip üyeleri.Namespaces and types have members. Bir varlık üyeleri ve ardından varlığa bir başvuru ile başlayan bir tam adı kullanılarak genel kullanıma sunulmuştur bir "." belirteci, takip eden üyenin adı.The members of an entity are generally available through the use of a qualified name that starts with a reference to the entity, followed by a "." token, followed by the name of the member.

Bir türün üyeleri ya da tür bildiriminde bildirilen veya devralınan türü temel sınıftan.Members of a type are either declared in the type declaration or inherited from the base class of the type. Bir tür bir temel sınıftan örnek Oluşturucular, Yıkıcılar ve statik oluşturucular dışında temel sınıfın tüm üyeleri devralan üyeler türetilmiş bir türde olur.When a type inherits from a base class, all members of the base class, except instance constructors, destructors and static constructors, become members of the derived type. Bir temel sınıf üyenin bildirilen erişilebilirliği, üye devralınan olup olmadığını denetlemez; devralma bir örnek oluşturucusu, statik oluşturucu veya yıkıcı olmayan herhangi bir üyeye genişletir.The declared accessibility of a base class member does not control whether the member is inherited—inheritance extends to any member that isn't an instance constructor, static constructor, or destructor. Ancak, devralınan bir üyeyi bir türetilmiş türde, ya da bildirilen erişilebilirliğini nedeniyle erişilemiyor olabilir (erişilebilirlik bildirilen) veya bir tür bildiriminde tarafından gizlendiği (aracılığıyla gizleme Devralma).However, an inherited member may not be accessible in a derived type, either because of its declared accessibility (Declared accessibility) or because it is hidden by a declaration in the type itself (Hiding through inheritance).

Namespace üyeleriniNamespace members

Ad alanları ve kapsayan ad uzayı olmayan türleri olan üyeleri genel ad alanı.Namespaces and types that have no enclosing namespace are members of the global namespace. Bu doğrudan genel bildirim alanında bildirilen adların karşılık gelir.This corresponds directly to the names declared in the global declaration space.

Bu ad, ad alanları ve ad alanı içinde bildirilen türler üyeleridir.Namespaces and types declared within a namespace are members of that namespace. Bu doğrudan ad alanı bildirimi alana bildirilen adların karşılık gelir.This corresponds directly to the names declared in the declaration space of the namespace.

Ad alanları, hiçbir erişim kısıtlamasına sahip.Namespaces have no access restrictions. Özel, korumalı veya iç ad alanı bildirmek mümkün değildir ve ad alanı adları her zaman genel olarak erişilebilir.It is not possible to declare private, protected, or internal namespaces, and namespace names are always publicly accessible.

Yapı üyeleriStruct members

Yapı üyeleri struct bildirilen üyeler ve yapının doğrudan temel sınıftan devralınan üyeleri olan System.ValueType ve dolaylı temel sınıfı object.The members of a struct are the members declared in the struct and the members inherited from the struct's direct base class System.ValueType and the indirect base class object.

Basit bir tür üyelerini doğrudan yapı türü diğer adlı basit bir tür tarafından üyelerinin karşılık gelir:The members of a simple type correspond directly to the members of the struct type aliased by the simple type:

  • Üyeleri sbyte üyeleri System.SByte yapısı.The members of sbyte are the members of the System.SByte struct.
  • Üyeleri byte üyeleri System.Byte yapısı.The members of byte are the members of the System.Byte struct.
  • Üyeleri short üyeleri System.Int16 yapısı.The members of short are the members of the System.Int16 struct.
  • Üyeleri ushort üyeleri System.UInt16 yapısı.The members of ushort are the members of the System.UInt16 struct.
  • Üyeleri int üyeleri System.Int32 yapısı.The members of int are the members of the System.Int32 struct.
  • Üyeleri uint üyeleri System.UInt32 yapısı.The members of uint are the members of the System.UInt32 struct.
  • Üyeleri long üyeleri System.Int64 yapısı.The members of long are the members of the System.Int64 struct.
  • Üyeleri ulong üyeleri System.UInt64 yapısı.The members of ulong are the members of the System.UInt64 struct.
  • Üyeleri char üyeleri System.Char yapısı.The members of char are the members of the System.Char struct.
  • Üyeleri float üyeleri System.Single yapısı.The members of float are the members of the System.Single struct.
  • Üyeleri double üyeleri System.Double yapısı.The members of double are the members of the System.Double struct.
  • Üyeleri decimal üyeleri System.Decimal yapısı.The members of decimal are the members of the System.Decimal struct.
  • Üyeleri bool üyeleri System.Boolean yapısı.The members of bool are the members of the System.Boolean struct.

Numaralandırma üyeleriEnumeration members

Bir numaralandırma sabit listesinde bildirilen sabitler ve sabit listesinin doğrudan temel sınıftan devralınan üyeleri üyeleri System.Enum ve dolaylı temel sınıfların System.ValueType ve object.The members of an enumeration are the constants declared in the enumeration and the members inherited from the enumeration's direct base class System.Enum and the indirect base classes System.ValueType and object.

Sınıf üyeleriClass members

Bir sınıfın üyeleri sınıfta bildirilen üyeleri ve temel sınıftan devralınan üyeleri olan (sınıf dışında object temel sınıfa sahip).The members of a class are the members declared in the class and the members inherited from the base class (except for class object which has no base class). Temel sınıftan devralınan üyeleri, sabitleri, alanları, yöntemleri, özellikleri, olayları, dizin oluşturucular, işleçler ve tür temel sınıfı, ancak örnek Oluşturucular, Yıkıcılar ve temel sınıfın statik oluşturucular içerir.The members inherited from the base class include the constants, fields, methods, properties, events, indexers, operators, and types of the base class, but not the instance constructors, destructors and static constructors of the base class. Temel sınıf üyelerinin bakılmaksızın kendi erişilebilirlik devralınır.Base class members are inherited without regard to their accessibility.

Bir sınıf bildirimi bildirimlerini sabitleri, alanları, yöntemler, özellikler, olaylar, Dizinleyicileri, işleçleri, örnek oluşturucuları, yok ediciler, statik oluşturucular ve türleri içerebilir.A class declaration may contain declarations of constants, fields, methods, properties, events, indexers, operators, instance constructors, destructors, static constructors and types.

Üyeleri object ve string karşılık gelen sınıf türü üyeleri doğrudan bunlar diğer adı:The members of object and string correspond directly to the members of the class types they alias:

  • Üyeleri object üyeleri System.Object sınıfı.The members of object are the members of the System.Object class.
  • Üyeleri string üyeleri System.String sınıfı.The members of string are the members of the System.String class.

Arabirim üyeleriInterface members

Bir arabirim üyelerinin arabirimi ve tüm temel arabirimleri arabiriminin bildirilen üyeleridir.The members of an interface are the members declared in the interface and in all base interfaces of the interface. Sınıf üyeleri object kesinlikle anlamda, herhangi bir arabirim üyesi değilseniz, (arabirim üyeleri).The members in class object are not, strictly speaking, members of any interface (Interface members). Ancak, sınıf üyeleri object herhangi bir arabirim türüne içinde'üye araması aracılığıyla kullanılabilir (üye araması).However, the members in class object are available via member lookup in any interface type (Member lookup).

Dizi üyeleriArray members

Dizi üyelerinin sınıftan devralınan üyeleri System.Array.The members of an array are the members inherited from class System.Array.

Temsilci üyeDelegate members

Bir temsilci sınıftan devralınan üyeleri üyeleri System.Delegate.The members of a delegate are the members inherited from class System.Delegate.

Üye erişimiMember access

Üye bildirimlerini üye erişimi denetlemenizi sağlar.Declarations of members allow control over member access. Bir üyenin erişilebilirliğini tarafından bildirilen erişilebilirliği kurulur (erişilebilirlik bildirilen) üyesi varsa hemen içeren türün erişilebilirlik ile birleştirilmiş.The accessibility of a member is established by the declared accessibility (Declared accessibility) of the member combined with the accessibility of the immediately containing type, if any.

Belirli bir üye erişimine izin verileceğini, üyesi olduğu söylenir erişilebilir.When access to a particular member is allowed, the member is said to be accessible. Belirli bir üyeye erişim izni, buna karşılık, üyesi olduğu söylenir erişilemez.Conversely, when access to a particular member is disallowed, the member is said to be inaccessible. Metinsel konumun erişim yer alan erişilebilirlik etki alanında eklendiğinde bir üye erişim izin verilir (erişilebilirlik etki alanları) üyesi.Access to a member is permitted when the textual location in which the access takes place is included in the accessibility domain (Accessibility domains) of the member.

Bildirilen erişilebilirliğiDeclared accessibility

Erişilebilirlik bildirilen üyesi aşağıdakilerden biri olabilir:The declared accessibility of a member can be one of the following:

  • Dahil ederek seçtiğiniz ortak bir public değiştiricisi üye bildirimi.Public, which is selected by including a public modifier in the member declaration. Sezgisel anlamını public "olmayan sınırlı erişim".The intuitive meaning of public is "access not limited".
  • Korumalı, seçili dahil ederek bir protected değiştiricisi üye bildirimi.Protected, which is selected by including a protected modifier in the member declaration. Sezgisel anlamını protected "içeren sınıfı veya türleri sınırlı erişim içeren sınıfından türetilir".The intuitive meaning of protected is "access limited to the containing class or types derived from the containing class".
  • Dahil ederek seçilen dahili bir internal değiştiricisi üye bildirimi.Internal, which is selected by including an internal modifier in the member declaration. Sezgisel anlamını internal "Bu program için sınırlı erişim".The intuitive meaning of internal is "access limited to this program".
  • İç (korumalı veya iç anlamına gelir), korumalı, seçili her ikisi de dahil ederek bir protected ve internal değiştiricisi üye bildirimi.Protected internal (meaning protected or internal), which is selected by including both a protected and an internal modifier in the member declaration. Sezgisel anlamını protected internal "Bu program için sınırlı erişim veya içeren sınıfından türetilen türler".The intuitive meaning of protected internal is "access limited to this program or types derived from the containing class".
  • Dahil ederek seçildiğinden özel, bir private değiştiricisi üye bildirimi.Private, which is selected by including a private modifier in the member declaration. Sezgisel anlamını private "kapsadığı tür için sınırlı erişim".The intuitive meaning of private is "access limited to the containing type".

Bağlama bağlı olarak bir üye bildirim aldığı yerleştirin, yalnızca belirli türlerdeki bildirilen erişilebilirliği izin verilir.Depending on the context in which a member declaration takes place, only certain types of declared accessibility are permitted. Ayrıca, üye bildirimi herhangi bir erişim değiştiricileri içermez, bildirimi yer aldığı içerik erişilebilirlik bildirilen varsayılan belirler.Furthermore, when a member declaration does not include any access modifiers, the context in which the declaration takes place determines the default declared accessibility.

  • Örtük olarak ad sahip public erişilebilirlik bildirilir.Namespaces implicitly have public declared accessibility. Ad alanı bildirimi üzerinde hiçbir erişim değiştiricisine izin verilir.No access modifiers are allowed on namespace declarations.
  • Türleri derleme biriminden veya ad alanı bildirimi olabilir public veya internal erişilebilirlik ve varsayılan olarak bildirilen internal erişilebilirlik bildirilir.Types declared in compilation units or namespaces can have public or internal declared accessibility and default to internal declared accessibility.
  • Sınıf üyeleri bildirilen erişilebilirliği beş tür hiçbirini ve varsayılan private erişilebilirlik bildirilir.Class members can have any of the five kinds of declared accessibility and default to private declared accessibility. (Bir türü bir ad alanının bir üyesi yalnızca olabilir olarak bildirilmiş ancak bildirilen erişilebilirliği beş türde herhangi bir sınıfın üyesi olabildiği gibi bir türü bildirilen Not public veya internal erişilebilirlik bildirildi.)(Note that a type declared as a member of a class can have any of the five kinds of declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility.)
  • Yapı üyeleri olabilir public, internal, veya private erişilebilirlik ve varsayılan olarak bildirilen private yapılardan türetme çünkü erişilebilirlik bildirilir.Struct members can have public, internal, or private declared accessibility and default to private declared accessibility because structs are implicitly sealed. (Bu, bu yapı tarafından devralınan değil) yapı sürümünde Struct üyelerinin olamaz protected veya protected internal erişilebilirlik bildirilir.Struct members introduced in a struct (that is, not inherited by that struct) cannot have protected or protected internal declared accessibility. (Yapı üyesi olabildiği gibi bir türü bildirilen unutmayın public, internal, veya private erişilebilirlik, türü bir ad alanının bir üyesi yalnızca olabilir olarak bildirilmiş ancak bildirilen public veya internal erişilebilirlik bildirildi.)(Note that a type declared as a member of a struct can have public, internal, or private declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility.)
  • Arabirim üyeleri örtük olarak sahip public erişilebilirlik bildirilir.Interface members implicitly have public declared accessibility. Arabirim üye bildirimlerinde hiçbir erişim değiştiricisine izin verilir.No access modifiers are allowed on interface member declarations.
  • Numaralandırma üyelerini örtük olarak sahip public erişilebilirlik bildirilir.Enumeration members implicitly have public declared accessibility. Hiçbir erişim değiştiricisine sabit listesi üye bildirimlerinde izin verilir.No access modifiers are allowed on enumeration member declarations.

Erişilebilirlik etki alanlarıAccessibility domains

Erişilebilirlik etki alanı program metni üyesine erişim verilir (büyük olasılıkla ayrık) bölümlerini üyesi oluşur.The accessibility domain of a member consists of the (possibly disjoint) sections of program text in which access to the member is permitted. Erişilebilirlik etki alanı üyesi tanımlama amacıyla, üyesi olduğu söylenir en üst düzey bir tür içinde bildirilmedi ve üyesi olduğu söylenir iç içe geçmiş başka bir tür içinde bildirilirse.For purposes of defining the accessibility domain of a member, a member is said to be top-level if it is not declared within a type, and a member is said to be nested if it is declared within another type. Ayrıca, program metni bir programı tüm program tüm kaynak dosyalarında bulunan metin program ve tüm bulunan metin programı gibi bir tür öğesinin program metni tanımlanır tanımlanan type_declarations (büyük olasılıkla, tür içinde iç içe geçmiş türler dahil) türü.Furthermore, the program text of a program is defined as all program text contained in all source files of the program, and the program text of a type is defined as all program text contained in the type_declarations of that type (including, possibly, types that are nested within the type).

Önceden tanımlanmış bir tür erişilebilirlik etki alanı (gibi object, int, veya double) sınırsızdır.The accessibility domain of a predefined type (such as object, int, or double) is unlimited.

Erişilebilirlik etki alanı bir üst düzey ilişkisiz türü T (bağlı ve türleri ilişkisiz) bildirilen bir programda P şu şekilde tanımlanır:The accessibility domain of a top-level unbound type T (Bound and unbound types) that is declared in a program P is defined as follows:

  • Varsa öğesinin bildirilen erişilebilirliği T olduğu public, Erişilebilirlik etki alanı T öğesinin program metnidir P ve başvuran herhangi bir programı P.If the declared accessibility of T is public, the accessibility domain of T is the program text of P and any program that references P.
  • Varsa öğesinin bildirilen erişilebilirliği T olduğu internal, Erişilebilirlik etki alanı T öğesinin program metnidir P.If the declared accessibility of T is internal, the accessibility domain of T is the program text of P.

Üst düzey bir bağlanmamış tür erişilebilirlik etki alanı her zaman en az olduğunu izleyen bu tanımları yazın, program öğesinin program metni bildirilir.From these definitions it follows that the accessibility domain of a top-level unbound type is always at least the program text of the program in which that type is declared.

Erişilebilirlik etki alanı için oluşturulan tür T<A1, ..., An> ilişkisiz genel bir türün erişilebilirlik etki alanının kesişimidir T ve tür bağımsız değişkenlerini erişilebilirlik etki alanları A1, ..., An.The accessibility domain for a constructed type T<A1, ..., An> is the intersection of the accessibility domain of the unbound generic type T and the accessibility domains of the type arguments A1, ..., An.

Erişilebilirlik etki alanı iç içe üyenin M bir türde bildirilen T bir programın P şu şekilde tanımlanır (dikkate alınarak M kendisini büyük olasılıkla bir türü olabilir):The accessibility domain of a nested member M declared in a type T within a program P is defined as follows (noting that M itself may possibly be a type):

  • Varsa öğesinin bildirilen erişilebilirliği M olduğu public, Erişilebilirlik etki alanı M erişilebilirlik etki alanıdır T.If the declared accessibility of M is public, the accessibility domain of M is the accessibility domain of T.
  • Varsa öğesinin bildirilen erişilebilirliği M olduğu protected internal, let D öğesinin program metni birleşimi olabilir P ve türetilen her türlü program metni T, dışında bildirilen P.If the declared accessibility of M is protected internal, let D be the union of the program text of P and the program text of any type derived from T, which is declared outside P. Erişilebilirlik etki alanı M erişilebilirlik etki alanının kesişimidir T ile D.The accessibility domain of M is the intersection of the accessibility domain of T with D.
  • Varsa öğesinin bildirilen erişilebilirliği M olduğu protected, let D öğesinin program metni birleşimi olabilir T ve türetilen her türlü program metni T.If the declared accessibility of M is protected, let D be the union of the program text of T and the program text of any type derived from T. Erişilebilirlik etki alanı M erişilebilirlik etki alanının kesişimidir T ile D.The accessibility domain of M is the intersection of the accessibility domain of T with D.
  • Varsa öğesinin bildirilen erişilebilirliği M olduğu internal, Erişilebilirlik etki alanı M erişilebilirlik etki alanının kesişimidir T öğesinin program metni ile P.If the declared accessibility of M is internal, the accessibility domain of M is the intersection of the accessibility domain of T with the program text of P.
  • Varsa öğesinin bildirilen erişilebilirliği M olduğu private, Erişilebilirlik etki alanı M öğesinin program metnidir T.If the declared accessibility of M is private, the accessibility domain of M is the program text of T.

Bu tanımlarından iç içe üyenin erişilebilirlik etki alanı her zaman en az olduğunu izleyen program metni türündeki üye bildirilir.From these definitions it follows that the accessibility domain of a nested member is always at least the program text of the type in which the member is declared. Ayrıca, Erişilebilirlik etki alanı üyesi hiç üyesi bildirildiği türün erişilebilirlik etki daha kapsamlı olduğunu izler.Furthermore, it follows that the accessibility domain of a member is never more inclusive than the accessibility domain of the type in which the member is declared.

Sezgisel koşullarında bir tür veya üye M olan erişim, aşağıdaki adımları erişim izin verildiğinden emin olmak için değerlendirilir:In intuitive terms, when a type or member M is accessed, the following steps are evaluated to ensure that the access is permitted:

  • İlk olarak, eğer M (olarak karşılıklı derleme biriminde veya bir ad alanı), bir tür içindeki bir derleme zamanı hatası oluşur türü erişilebilir durumda değilse bildirilir.First, if M is declared within a type (as opposed to a compilation unit or a namespace), a compile-time error occurs if that type is not accessible.
  • Ardından, eğer M olduğu public, erişime izin verilir.Then, if M is public, the access is permitted.
  • Aksi takdirde M olduğu protected internal, programda içinde ortaya çıkarsa erişimine izin verilen M bildirilen veya bir sınıf içinde oluşursa türetilen sınıfta M bildirilir ve türetilmiş üzerinden gerçekleşir sınıf türü (korumalı üyeleri örneği için erişim).Otherwise, if M is protected internal, the access is permitted if it occurs within the program in which M is declared, or if it occurs within a class derived from the class in which M is declared and takes place through the derived class type (Protected access for instance members).
  • Aksi takdirde M olduğu protected, sınıfta içinde ortaya çıkarsa erişimine izin verilen M bildirilen veya bir sınıf içinde oluşursa türetilen sınıfta M bildirilir ve türetilmiş üzerinden gerçekleşir sınıf türü (korumalı üyeleri örneği için erişim).Otherwise, if M is protected, the access is permitted if it occurs within the class in which M is declared, or if it occurs within a class derived from the class in which M is declared and takes place through the derived class type (Protected access for instance members).
  • Aksi takdirde M olduğu internal, programda içinde ortaya çıkarsa erişimine izin verilen M bildirilir.Otherwise, if M is internal, the access is permitted if it occurs within the program in which M is declared.
  • Aksi takdirde M olduğu private, hangi tür içinde ortaya çıkarsa erişimine izin verilen M bildirilir.Otherwise, if M is private, the access is permitted if it occurs within the type in which M is declared.
  • Aksi takdirde, türe veya üyeye erişilemiyor ve bir derleme zamanı hatası oluşur.Otherwise, the type or member is inaccessible, and a compile-time error occurs.

ÖrnekteIn the example

public class A
{
    public static int X;
    internal static int Y;
    private static int Z;
}

internal class B
{
    public static int X;
    internal static int Y;
    private static int Z;

    public class C
    {
        public static int X;
        internal static int Y;
        private static int Z;
    }

    private class D
    {
        public static int X;
        internal static int Y;
        private static int Z;
    }
}

Aşağıdaki erişilebilirlik etki alanları, sınıflar ve üyeler vardır:the classes and members have the following accessibility domains:

  • Erişilebilirlik etki alanı A ve A.X sınırsızdır.The accessibility domain of A and A.X is unlimited.
  • Erişilebilirlik etki alanı A.Y, B, B.X, B.Y, B.C, B.C.X, ve B.C.Y içeren program öğesinin program metnidir.The accessibility domain of A.Y, B, B.X, B.Y, B.C, B.C.X, and B.C.Y is the program text of the containing program.
  • Erişilebilirlik etki alanı A.Z öğesinin program metnidir A.The accessibility domain of A.Z is the program text of A.
  • Erişilebilirlik etki alanı B.Z ve B.D öğesinin program metnidir B, öğesinin program metni dahil olmak üzere B.C ve B.D.The accessibility domain of B.Z and B.D is the program text of B, including the program text of B.C and B.D.
  • Erişilebilirlik etki alanı B.C.Z öğesinin program metnidir B.C.The accessibility domain of B.C.Z is the program text of B.C.
  • Erişilebilirlik etki alanı B.D.X ve B.D.Y öğesinin program metnidir B, öğesinin program metni dahil olmak üzere B.C ve B.D.The accessibility domain of B.D.X and B.D.Y is the program text of B, including the program text of B.C and B.D.
  • Erişilebilirlik etki alanı B.D.Z öğesinin program metnidir B.D.The accessibility domain of B.D.Z is the program text of B.D.

Erişilebilirlik etki alanı üyesi hiçbir zaman örnekte gösterildiği gibi bir kapsayan tür daha büyük.As the example illustrates, the accessibility domain of a member is never larger than that of a containing type. Örneğin, olsa bile tüm X üyelere sahip genel bildirilen erişilebilirliği dışındaki tüm A.X içeren bir tür tarafından kısıtlanmış erişilebilirlik etki alanınız.For example, even though all X members have public declared accessibility, all but A.X have accessibility domains that are constrained by a containing type.

Bölümünde anlatıldığı gibi üyeleri, örneğin Oluşturucular, Yıkıcılar ve statik oluşturucular dışında bir taban sınıfın tüm üyeleri türetilen türler tarafından devralınır.As described in Members, all members of a base class, except for instance constructors, destructors and static constructors, are inherited by derived types. Bu, bir taban sınıfın bile özel üyeler içerir.This includes even private members of a base class. Ancak, özel üye erişilebilirlik etki alanı üyesi bildirildiği türü yalnızca program metni içerir.However, the accessibility domain of a private member includes only the program text of the type in which the member is declared. ÖrnekteIn the example

class A
{
    int x;

    static void F(B b) {
        b.x = 1;        // Ok
    }
}

class B: A
{
    static void F(B b) {
        b.x = 1;        // Error, x not accessible
    }
}

B sınıfından devralan bir özel üye x gelen A sınıfı.the B class inherits the private member x from the A class. Özel üye olduğundan, yalnızca içinde erişilebilir class_body , A.Because the member is private, it is only accessible within the class_body of A. Bu nedenle, erişim izni b.x içinde başarılı A.F yöntemi, ancak başarısız olursa B.F yöntemi.Thus, the access to b.x succeeds in the A.F method, but fails in the B.F method.

Örnek üyeleri için Korumalı ErişimProtected access for instance members

Olduğunda bir protected örnek üyesi içinde bildirildiğinde, sınıf öğesinin program metni dışında erişilebilir ve ne zaman bir protected internal erişim içinde gerçekleşmesi gerekir, örnek üyesi, bildirilen program öğesinin program metni dışında erişilebilir bir sınıf bildirimi içinde bildirildiği sınıfından türetilir.When a protected instance member is accessed outside the program text of the class in which it is declared, and when a protected internal instance member is accessed outside the program text of the program in which it is declared, the access must take place within a class declaration that derives from the class in which it is declared. Ayrıca, erişim, türetilmiş sınıf türü ya da ondan oluşturulan sınıf türünde bir örnek üzerinden gerçekleşmesi için gerekli değildir.Furthermore, the access is required to take place through an instance of that derived class type or a class type constructed from it. Bu kısıtlama, bir türetilmiş sınıf bile aynı temel sınıftan devralınan üyeleri, türetilen diğer sınıflar korumalı üyelerine erişmesini engeller.This restriction prevents one derived class from accessing protected members of other derived classes, even when the members are inherited from the same base class.

İzin B bir korumalı örnek üye bildirir bir taban sınıfı olarak Mve D türetildiği bir sınıf olması B.Let B be a base class that declares a protected instance member M, and let D be a class that derives from B. İçinde class_body , D, erişim M aşağıdaki biçimlerden birini alabilir:Within the class_body of D, access to M can take one of the following forms:

  • Nitelenmemiş bir type_name veya primary_expression formun M.An unqualified type_name or primary_expression of the form M.
  • A primary_expression formun E.M, türü sağlanan E olduğu T veya türetilmiş bir sınıf Tburada T sınıf türüdür D, veya bir sınıf türü oluşturulan DA primary_expression of the form E.M, provided the type of E is T or a class derived from T, where T is the class type D, or a class type constructed from D
  • A primary_expression formun base.M.A primary_expression of the form base.M.

Bu erişim forms ek olarak, bir korumalı örnek oluşturucusu içinde temel sınıfın türetilmiş bir sınıf erişebilirsiniz bir constructor_initializer (Oluşturucu başlatıcıları).In addition to these forms of access, a derived class can access a protected instance constructor of a base class in a constructor_initializer (Constructor initializers).

ÖrnekteIn the example

public class A
{
    protected int x;

    static void F(A a, B b) {
        a.x = 1;        // Ok
        b.x = 1;        // Ok
    }
}

public class B: A
{
    static void F(A a, B b) {
        a.x = 1;        // Error, must access through instance of B
        b.x = 1;        // Ok
    }
}

içinde A, erişim mümkündür x örnekleri her ikisi de aracılığıyla A ve B, her iki durumda da yer örneği üzerinden erişim gerektirdiğinden A veya türetilmiş bir sınıf A.within A, it is possible to access x through instances of both A and B, since in either case the access takes place through an instance of A or a class derived from A. Bununla birlikte, içinde B, erişmek mümkün değildir x örneği üzerinden A, bu yana A türünden türemez B.However, within B, it is not possible to access x through an instance of A, since A does not derive from B.

ÖrnekteIn the example

class C<T>
{
    protected T x;
}

class D<T>: C<T>
{
    static void F() {
        D<T> dt = new D<T>();
        D<int> di = new D<int>();
        D<string> ds = new D<string>();
        dt.x = default(T);
        di.x = 123;
        ds.x = "test";
    }
}

üç atamaları x genel türünden oluşturulduğu sınıf türleri örnekleri aracılığıyla tüm gerçekleşmesi için izin verilir.the three assignments to x are permitted because they all take place through instances of class types constructed from the generic type.

Erişilebilirlik kısıtlamalarıAccessibility constraints

C# dilinde çeşitli yapıları türünün olmasını gerektiren en az olarak erişilebilir olarak üyesi veya başka bir tür.Several constructs in the C# language require a type to be at least as accessible as a member or another type. Bir tür T üyenin veya türün en az olarak erişilebilir olduğu söylenir M , Erişilebilirlik etki alanı T erişilebilirlik etki alanının bir üst kümesidir M.A type T is said to be at least as accessible as a member or type M if the accessibility domain of T is a superset of the accessibility domain of M. Diğer bir deyişle, T en az olarak erişilebilir olarak M varsa T tüm bağlamlarda erişilebilir M erişilebilir.In other words, T is at least as accessible as M if T is accessible in all contexts in which M is accessible.

Aşağıdaki erişilebilirlik kısıtlamaları mevcuttur:The following accessibility constraints exist:

  • Bir sınıf türünün doğrudan temel sınıf en az sınıf türü kendisini olarak erişilebilir olması gerekir.The direct base class of a class type must be at least as accessible as the class type itself.
  • Açık bir arabirim türü temel arabirimleri en az arabirim türü kendisini olarak erişilebilir olması gerekir.The explicit base interfaces of an interface type must be at least as accessible as the interface type itself.
  • Bir temsilci türü parametre türleri ve dönüş türü, en az temsilci türü kendisini olarak erişilebilir olması gerekir.The return type and parameter types of a delegate type must be at least as accessible as the delegate type itself.
  • Bir sabit değer türü en az sabit olarak olarak erişilebilir olması gerekir.The type of a constant must be at least as accessible as the constant itself.
  • Bir alan türü en az alan olarak olarak erişilebilir olması gerekir.The type of a field must be at least as accessible as the field itself.
  • Bir yöntemin parametre türleri ve dönüş türü, en az yöntemi olarak olarak erişilebilir olması gerekir.The return type and parameter types of a method must be at least as accessible as the method itself.
  • Bir özelliğin türünü en az özelliği olarak olarak erişilebilir olması gerekir.The type of a property must be at least as accessible as the property itself.
  • Bir olay türü en az olay olarak olarak erişilebilir olması gerekir.The type of an event must be at least as accessible as the event itself.
  • Bir dizin oluşturucu türü ve parametre türleri, en az Indexer olarak erişilebilir olması gerekir.The type and parameter types of an indexer must be at least as accessible as the indexer itself.
  • Operatör için parametre türleri ve dönüş türü, en azından operatör olarak olarak erişilebilir olması gerekir.The return type and parameter types of an operator must be at least as accessible as the operator itself.
  • Bir örnek oluşturucusunda parametre türleri, en az örnek oluşturucusu kendisini olarak erişilebilir olması gerekir.The parameter types of an instance constructor must be at least as accessible as the instance constructor itself.

ÖrnekteIn the example

class A {...}

public class B: A {...}

B sınıfı sonuçları bir derleme zamanı hatası nedeniyle A en az olarak erişilebilir olarak değil B.the B class results in a compile-time error because A is not at least as accessible as B.

Benzer şekilde, örnekteLikewise, in the example

class A {...}

public class B
{
    A F() {...}

    internal A G() {...}

    public A H() {...}
}

H yönteminde B çünkü dönüş türü bir derleme zamanı hatası oluşur A en az yöntemi olarak olarak erişilebilir değil.the H method in B results in a compile-time error because the return type A is not at least as accessible as the method.

İmzalar ve aşırı yüklemeSignatures and overloading

Yöntemleri, örnek oluşturucuları, dizin oluşturucular ve işleçleri göre nitelenen kendi imzaları:Methods, instance constructors, indexers, and operators are characterized by their signatures:

  • Yöntemi, tür parametreleri sayısı ve türü ve tür (değer, başvuru veya çıkış) her birini sırayla soldan sağa kabul biçimsel parametrelerinin adı, yöntemin imzası oluşur.The signature of a method consists of the name of the method, the number of type parameters and the type and kind (value, reference, or output) of each of its formal parameters, considered in the order left to right. Bu amaçlar için oluşan bir biçimsel parametre türü yöntemin herhangi bir tür parametre adına göre değil, ancak türü bağımsız değişken listesindeki sıralı konumuna yöntem tarafından tanımlanır.For these purposes, any type parameter of the method that occurs in the type of a formal parameter is identified not by its name, but by its ordinal position in the type argument list of the method. Yöntemin imzası dönüş türü, özellikle içermez params en sağdaki parametresi ya da isteğe bağlı tür parametresi kısıtlamaları için belirtilen değiştiricisi.The signature of a method specifically does not include the return type, the params modifier that may be specified for the right-most parameter, nor the optional type parameter constraints.
  • Tür ve tür (değer, başvuru veya çıkış) sırayla soldan sağa kabul kendi biçimsel parametrelerinin her biri bir örnek oluşturucusu imzası oluşur.The signature of an instance constructor consists of the type and kind (value, reference, or output) of each of its formal parameters, considered in the order left to right. Bir örnek oluşturucusunda imzası özellikle içermemesi params en sağdaki parametresi için belirtilen değiştiricisi.The signature of an instance constructor specifically does not include the params modifier that may be specified for the right-most parameter.
  • Bir dizin oluşturucu imzasının her birini sırayla soldan sağa kabul biçimsel parametrelerinin türünü oluşur.The signature of an indexer consists of the type of each of its formal parameters, considered in the order left to right. Bir dizin oluşturucu imzası özel öğe türü içermiyor ya da içeriyor mu params en sağdaki parametresi için belirtilen değiştiricisi.The signature of an indexer specifically does not include the element type, nor does it include the params modifier that may be specified for the right-most parameter.
  • Bir işleç imzası adını işleci ve her birini sırayla soldan sağa kabul biçimsel parametrelerinin türünü oluşur.The signature of an operator consists of the name of the operator and the type of each of its formal parameters, considered in the order left to right. Bir işleç imzası, özellikle sonuç türü içermez.The signature of an operator specifically does not include the result type.

İmzalar, etkinleştirme mekanizması aşırı yükleme sınıflar, yapılar ve arabirimler üyelerin:Signatures are the enabling mechanism for overloading of members in classes, structs, and interfaces:

  • Yöntemlerinin aşırı yükleme, bir sınıf, yapı veya arabirim bunların imzalarını sağlanan aynı ada sahip birden çok yöntem, sınıf, yapı veya arabirim içinde benzersiz bildirmek için izin verir.Overloading of methods permits a class, struct, or interface to declare multiple methods with the same name, provided their signatures are unique within that class, struct, or interface.
  • İmzaları, sınıf veya yapı içinde benzersiz olması koşuluyla örnek oluşturucuları aşırı yüklemesi bir sınıfın veya yapının birden çok örnek oluşturucuları bildirmek için verir.Overloading of instance constructors permits a class or struct to declare multiple instance constructors, provided their signatures are unique within that class or struct.
  • Bunların imzalarını Bu sınıf, yapı veya arabirim içinde benzersiz olması koşuluyla dizin oluşturucu aşırı yüklemesi bir sınıf, yapı veya arabirim birden çok dizin oluşturucu bildirmek için verir.Overloading of indexers permits a class, struct, or interface to declare multiple indexers, provided their signatures are unique within that class, struct, or interface.
  • Operatörleri aşırı yükleme, bir sınıf veya yapı bunların imzalarını sağlanan aynı ada sahip birden çok işleç, sınıf veya yapı içinde benzersiz bildirmek için izin verir.Overloading of operators permits a class or struct to declare multiple operators with the same name, provided their signatures are unique within that class or struct.

Ancak out ve ref parametre değiştiriciler imzasının bir parçası olarak kabul edilir, tek bir türde bildirilen üyeler olamaz farklı imzasında sadece onun tarafından ref ve out.Although out and ref parameter modifiers are considered part of a signature, members declared in a single type cannot differ in signature solely by ref and out. İki üye aynı ise olacaktır imzalarla aynı türdeki her iki yöntemde de tüm parametrelerinde bildirilir, bir derleme zamanı hatası meydana gelir out değiştiriciler değiştirildi ref değiştiriciler.A compile-time error occurs if two members are declared in the same type with signatures that would be the same if all parameters in both methods with out modifiers were changed to ref modifiers. İmza eşleşen diğer amaçlar için (örneğin, gizleme veya geçersiz kılma), ref ve out imzasının bir parçası olarak kabul edilir ve birbirlerine eşleşmiyor.For other purposes of signature matching (e.g., hiding or overriding), ref and out are considered part of the signature and do not match each other. (Bu kısıtlama izin vermektir C# programları, ortak dil altyapısı (yalnızca içinde farklı yöntemleri tanımlamak için bir yol sağlamaz, CLI üzerinde), çalıştırılacak kolayca çevrilemeyen ref ve out.)(This restriction is to allow C#  programs to be easily translated to run on the Common Language Infrastructure (CLI), which does not provide a way to define methods that differ solely in ref and out.)

İmzaların türleri amacıyla object ve dynamic aynı olarak kabul edilir.For the purposes of signatures, the types object and dynamic are considered the same. Tek bir türde bildirilen üyeler bu nedenle farklı imzasında sadece onun tarafından object ve dynamic.Members declared in a single type can therefore not differ in signature solely by object and dynamic.

Aşağıdaki örnek, aşırı yüklenmiş yöntem bildirimleri bunların imzalarını birlikte bir dizi gösterir.The following example shows a set of overloaded method declarations along with their signatures.

interface ITest
{
    void F();                        // F()

    void F(int x);                   // F(int)

    void F(ref int x);               // F(ref int)

    void F(out int x);               // F(out int)      error

    void F(int x, int y);            // F(int, int)

    int F(string s);                 // F(string)

    int F(int x);                    // F(int)          error

    void F(string[] a);              // F(string[])

    void F(params string[] a);       // F(string[])     error
}

Herhangi bir Not ref ve out parametre değiştiriciler (yöntem parametreleri) bir imza bir parçasıdır.Note that any ref and out parameter modifiers (Method parameters) are part of a signature. Bu nedenle, F(int) ve F(ref int) benzersiz imzalar.Thus, F(int) and F(ref int) are unique signatures. Ancak, F(ref int) ve F(out int) sadece onun tarafından imzalarının farklı olduğundan, aynı arabirimi içinde bildirilemez ref ve out.However, F(ref int) and F(out int) cannot be declared within the same interface because their signatures differ solely by ref and out. Ayrıca, dönüş türü Not ve params değiştiricisi parçası değildir, imza dönüş türü veya ekleme veya çıkarma, yalnızca temel aşırı mümkün olmadığından params değiştiricisi.Also, note that the return type and the params modifier are not part of a signature, so it is not possible to overload solely based on return type or on the inclusion or exclusion of the params modifier. Şekilde yöntemleri bildirimlerini F(int) ve F(params string[]) bir derleme zamanı hatası sonucunda yukarıda tanımlanan.As such, the declarations of the methods F(int) and F(params string[]) identified above result in a compile-time error.

KapsamlarıScopes

Kapsam bir bölge içinde mümkündür nitelik adı olmadan yalnızca adla bildirilen bir varlığa başvurmak program metni adıdır.The scope of a name is the region of program text within which it is possible to refer to the entity declared by the name without qualification of the name. Kapsamları olabilir iç içe geçmiş, ve bir iç kapsamı anlamı, bir dış kapsam adı yeniden bildirmek (Bu ancak tarafından uygulanan kısıtlama kaldırmaz, bildirimleri iç içe geçmiş bir bloğu içinde olmadığını olası) kapsayan bir blok içinde yerel bir değişken olarak aynı ada sahip yerel bir değişken bildirmek için kullanılır.Scopes can be nested, and an inner scope may redeclare the meaning of a name from an outer scope (this does not, however, remove the restriction imposed by Declarations that within a nested block it is not possible to declare a local variable with the same name as a local variable in an enclosing block). Dış kapsamdaki adından sonra denen moddadır gizli programının bölgede metin iç kapsamı tarafından ele ve dış adına erişim, yalnızca olası Adın niteleme tarafından.The name from the outer scope is then said to be hidden in the region of program text covered by the inner scope, and access to the outer name is only possible by qualifying the name.

  • Ad alanı üyesi kapsamı tarafından bildirilen bir namespace_member_declaration (Namespace üyelerini) ile hiçbir kapsayan namespace_declaration tüm program metin.The scope of a namespace member declared by a namespace_member_declaration (Namespace members) with no enclosing namespace_declaration is the entire program text.
  • Ad alanı üyesi kapsamı tarafından bildirilen bir namespace_member_declaration içinde bir namespace_declaration tam adı olan N olduğu namespace_body , her namespace_declaration tam adı olan N veya ile başlayan Nve ardından bir nokta.The scope of a namespace member declared by a namespace_member_declaration within a namespace_declaration whose fully qualified name is N is the namespace_body of every namespace_declaration whose fully qualified name is N or starts with N, followed by a period.
  • Tarafından tanımlanan ad kapsamı bir extern_alias_directive üzerinden genişletir using_directives, global_attributes ve namespace_member_ bildirimihemen içeren derleme birimi veya ad alanı gövdesinde, s.The scope of name defined by an extern_alias_directive extends over the using_directives, global_attributes and namespace_member_declarations of its immediately containing compilation unit or namespace body. Bir extern_alias_directive tüm yeni üyeleri temel alınan bildirim alanına gereksinimdir.An extern_alias_directive does not contribute any new members to the underlying declaration space. Diğer bir deyişle, bir extern_alias_directive geçişli değildir ancak bunun yerine oluştuğu yalnızca derleme birimi veya ad alanı gövdesi etkiler.In other words, an extern_alias_directive is not transitive, but, rather, affects only the compilation unit or namespace body in which it occurs.
  • Kapsam adı tanımlı ya da içeri aktaran bir using_directive (yönergeleri kullanarak) üzerinden genişletir namespace_member_declarationsn compilation_unit veya namespace_body hangi using_directive gerçekleşir.The scope of a name defined or imported by a using_directive (Using directives) extends over the namespace_member_declarations of the compilation_unit or namespace_body in which the using_directive occurs. A using_directive sıfır veya daha fazla ad alanı, tür veya üye adları belirli bir içinde kullanılabilir hale compilation_unit veya namespace_body, ancak yok tüm yeni üyeleri temel alınan bildirim alanına katkıda bulunur.A using_directive may make zero or more namespace, type or member names available within a particular compilation_unit or namespace_body, but does not contribute any new members to the underlying declaration space. Diğer bir deyişle, bir using_directive geçişli değildir ancak bunun yerine yalnızca etkiler compilation_unit veya namespace_body içinde hangi gerçekleşir.In other words, a using_directive is not transitive but rather affects only the compilation_unit or namespace_body in which it occurs.
  • Bir tür parametresi kapsamı tarafından bildirilen bir type_parameter_list üzerinde bir class_declaration (sınıf bildirimleri) olan class_base, type_parameter_constraints_clauses ve class_body , söz konusu class_declaration.The scope of a type parameter declared by a type_parameter_list on a class_declaration (Class declarations) is the class_base, type_parameter_constraints_clauses, and class_body of that class_declaration.
  • Bir tür parametresi kapsamı tarafından bildirilen bir type_parameter_list üzerinde bir struct_declaration (yapı bildirimleri) olan struct_interfaces , type_parameter_constraints_clauses ve struct_body , söz konusu struct_declaration.The scope of a type parameter declared by a type_parameter_list on a struct_declaration (Struct declarations) is the struct_interfaces, type_parameter_constraints_clauses, and struct_body of that struct_declaration.
  • Bir tür parametresi kapsamı tarafından bildirilen bir type_parameter_list üzerinde bir interface_declaration (arabirim bildirimleri) olan interface_base , type_parameter_constraints_clauses ve interface_body , söz konusu interface_declaration.The scope of a type parameter declared by a type_parameter_list on an interface_declaration (Interface declarations) is the interface_base, type_parameter_constraints_clauses, and interface_body of that interface_declaration.
  • Bir tür parametresi kapsamı tarafından bildirilen bir type_parameter_list üzerinde bir delegate_declaration (temsilci bildirimi) olan Döndür_tür, formal_parameter_list, ve type_parameter_constraints_clauses, söz konusu delegate_declaration.The scope of a type parameter declared by a type_parameter_list on a delegate_declaration (Delegate declarations) is the return_type, formal_parameter_list, and type_parameter_constraints_clauses of that delegate_declaration.
  • Tarafından bildirilen bir üye kapsamını bir class_member_declaration (sınıfı gövdesi) olan class_body bildirimi oluştuğu içinde.The scope of a member declared by a class_member_declaration (Class body) is the class_body in which the declaration occurs. Ayrıca, için bir sınıf üyesinin kapsamını genişletir class_body içeriğiyle erişilebilirlik etki alanında bulunan sınıflar türetilmiş (erişilebilirlik etki alanı) üyesinin.In addition, the scope of a class member extends to the class_body of those derived classes that are included in the accessibility domain (Accessibility domains) of the member.
  • Tarafından bildirilen bir üye kapsamını bir struct_member_declaration (Yapı üyeleri) olan struct_body bildirimi oluştuğu içinde.The scope of a member declared by a struct_member_declaration (Struct members) is the struct_body in which the declaration occurs.
  • Tarafından bildirilen bir üye kapsamını bir enum_member_declaration (numaralandırma üyeleri) olan enum_body bildirimi oluştuğu içinde.The scope of a member declared by an enum_member_declaration (Enum members) is the enum_body in which the declaration occurs.
  • Bir parametre kapsamı içinde bildirilen bir method_declaration (yöntemleri) olan method_body , söz konusu method_declaration.The scope of a parameter declared in a method_declaration (Methods) is the method_body of that method_declaration.
  • Bir parametre kapsamı içinde bildirilen bir indexer_declaration (dizin oluşturucular) olan accessor_declarations , söz konusu indexer_declaration.The scope of a parameter declared in an indexer_declaration (Indexers) is the accessor_declarations of that indexer_declaration.
  • Bir parametre kapsamı içinde bildirilen bir operator_declaration (işleçleri) olan blok , söz konusu operator_declaration.The scope of a parameter declared in an operator_declaration (Operators) is the block of that operator_declaration.
  • Bir parametre kapsamı içinde bildirilen bir constructor_declaration (örnek oluşturucular) olan constructor_initializer ve blok , söz konusu constructor_declaration.The scope of a parameter declared in a constructor_declaration (Instance constructors) is the constructor_initializer and block of that constructor_declaration.
  • Bir parametre kapsamı içinde bildirilen bir lambda_expression (anonim işlev ifadeleri) olan anonymous_function_body , söz konusu lambda_ ifadeThe scope of a parameter declared in a lambda_expression (Anonymous function expressions) is the anonymous_function_body of that lambda_expression
  • Bir parametre kapsamı içinde bildirilen bir anonymous_method_expression (anonim işlev ifadeleri) olan blok , söz konusu anonymous_method _expression.The scope of a parameter declared in an anonymous_method_expression (Anonymous function expressions) is the block of that anonymous_method_expression.
  • Etiket kapsamı içinde bildirilen bir labeled_statement (etiketli deyimler) olan blok bildirimi oluştuğu içinde.The scope of a label declared in a labeled_statement (Labeled statements) is the block in which the declaration occurs.
  • Bildirilen yerel değişken kapsamını bir local_variable_declaration (yerel değişken bildirimlerini) blok bildirimi oluştuğu içinde.The scope of a local variable declared in a local_variable_declaration (Local variable declarations) is the block in which the declaration occurs.
  • Bildirilen yerel değişken kapsamını bir switch_block , bir switch deyimi (switch deyimi) olan switch_block.The scope of a local variable declared in a switch_block of a switch statement (The switch statement) is the switch_block.
  • Bildirilen yerel değişken kapsamını bir for_initializer , bir for deyimi (deyimi için) olan for_initializer, for_condition, for_iteratorve kapsanan deyimi , for deyimi.The scope of a local variable declared in a for_initializer of a for statement (The for statement) is the for_initializer, the for_condition, the for_iterator, and the contained statement of the for statement.
  • Bir yerel sabit kapsamı içinde bildirilen bir local_constant_declaration (yerel sabit bildirimleri) blok bildirimi oluştuğu içinde.The scope of a local constant declared in a local_constant_declaration (Local constant declarations) is the block in which the declaration occurs. Önündeki değerinin metinsel bir konumda yerel bir sabit belirtmek için bir derleme zamanı hata kendi constant_declarator.It is a compile-time error to refer to a local constant in a textual position that precedes its constant_declarator.
  • Bir değişkenin kapsamını bir parçası olarak bildirilen bir foreach_statement, using_statement, lock_statement veya query_expression olduğu verilen yapısının genişletme tarafından belirlenir.The scope of a variable declared as part of a foreach_statement, using_statement, lock_statement or query_expression is determined by the expansion of the given construct.

Ad alanı, sınıf, yapı veya sabit listesi üyesi kapsamında üyesi bildirimi önündeki bir metinsel konumu üye başvurmak mümkündür.Within the scope of a namespace, class, struct, or enumeration member it is possible to refer to the member in a textual position that precedes the declaration of the member. Örneğin:For example

class A
{
    void F() {
        i = 1;
    }

    int i = 0;
}

Burada, geçerli F başvurmak için i bildirilmeden önce.Here, it is valid for F to refer to i before it is declared.

İsteğe bağlı olarak yerel bir değişken kapsamında önündeki değerinin metinsel bir konumda yerel değişkene başvurmak için bir derleme zamanı hatası olmayan local_variable_declarator yerel değişkenin.Within the scope of a local variable, it is a compile-time error to refer to the local variable in a textual position that precedes the local_variable_declarator of the local variable. Örneğin:For example

class A
{
    int i = 0;

    void F() {
        i = 1;                  // Error, use precedes declaration
        int i;
        i = 2;
    }

    void G() {
        int j = (j = 1);        // Valid
    }

    void H() {
        int a = 1, b = ++a;    // Valid
    }
}

İçinde F yukarıdaki yöntemi, ilk atamaya i dış kapsamda bildirilen alan özellikle başvurmuyor.In the F method above, the first assignment to i specifically does not refer to the field declared in the outer scope. Bunun yerine yerel bir değişkene başvuruyor ve metin içeriğini eklemek değişkenin bildirimi kendisinden nedeniyle, bir derleme zamanı hatası oluşur.Rather, it refers to the local variable and it results in a compile-time error because it textually precedes the declaration of the variable. İçinde G yöntemi, kullanımını j başlatıcıda bildirimi için j geçersiz kullanımı önünde değil çünkü local_variable_declarator.In the G method, the use of j in the initializer for the declaration of j is valid because the use does not precede the local_variable_declarator. İçinde H yöntemi, bir sonraki local_variable_declarator daha önceki bir bildirilen yerel değişken doğru başvurduğu local_variable_declarator aynı local_variable_declaration.In the H method, a subsequent local_variable_declarator correctly refers to a local variable declared in an earlier local_variable_declarator within the same local_variable_declaration.

Yerel değişkenler için içeriğin kapsamını belirleyen kuralları anlamı bir ifade bağlamda kullanılan bir ad, her zaman bir blok içindeki aynı olacağını garanti etmek için tasarlanmıştır.The scoping rules for local variables are designed to guarantee that the meaning of a name used in an expression context is always the same within a block. Yerel bir değişkenin kapsamını, yalnızca kendi bildirimden bloğun sonuna kadar genişletmek için olsaydı, ardından yukarıdaki örnekte, örnek değişkeni ilk atama atadığınız ve ikinci atama, büyük olasılıkla için önde gelen bir yerel değişkene atadığınız Blok ifadeleri yeniden düzenlenecek için daha sonra, derleme zamanı hataları.If the scope of a local variable were to extend only from its declaration to the end of the block, then in the example above, the first assignment would assign to the instance variable and the second assignment would assign to the local variable, possibly leading to compile-time errors if the statements of the block were later to be rearranged.

Bir blok içinde bir ad anlamını adı kullanıldığı bağlamı göre farklılık gösterebilir.The meaning of a name within a block may differ based on the context in which the name is used. ÖrnekteIn the example

using System;

class A {}

class Test
{
    static void Main() {
        string A = "hello, world";
        string s = A;                            // expression context

        Type t = typeof(A);                      // type context

        Console.WriteLine(s);                    // writes "hello, world"
        Console.WriteLine(t);                    // writes "A"
    }
}

adı A yerel bir değişkene başvurmak için kullanılan bir ifade bağlamda A ve sınıfa başvurmak için bir tür bağlamında A.the name A is used in an expression context to refer to the local variable A and in a type context to refer to the class A.

Ad gizlemeName hiding

Kapsam, bir varlığın varlık bildirimi alandan daha fazla program metni genellikle kapsar.The scope of an entity typically encompasses more program text than the declaration space of the entity. Özellikle, bir varlığın kapsamı aynı ada sahip bir varlık içeren yeni bir bildirim alanları tanıtan bildirimler içerebilir.In particular, the scope of an entity may include declarations that introduce new declaration spaces containing entities of the same name. Bu tür bildirimleri neden olacak orijinal varlık gizli.Such declarations cause the original entity to become hidden. Buna karşılık, bir varlık olarak kabul edilir görünür değil gizlenen.Conversely, an entity is said to be visible when it is not hidden.

İç içe geçirme ve ne zaman devralma yoluyla kapsamları çakışan aracılığıyla kapsamları çakışan ad gizleme gerçekleşir.Name hiding occurs when scopes overlap through nesting and when scopes overlap through inheritance. Gizleme iki tür özellikleri aşağıdaki bölümlerde açıklanmıştır.The characteristics of the two types of hiding are described in the following sections.

İç içe geçme aracılığıyla gizlemeHiding through nesting

Ad gizleme aracılığıyla iç içe geçme, iç içe geçmiş ad alanlarından veya türlerinden içinde iç içe türleri sınıflar veya yapılar ve parametre ve yerel değişken bildirimleri sonucunda sonucu olarak ad alanları, sonucu olarak ortaya çıkabilir.Name hiding through nesting can occur as a result of nesting namespaces or types within namespaces, as a result of nesting types within classes or structs, and as a result of parameter and local variable declarations.

ÖrnekteIn the example

class A
{
    int i = 0;

    void F() {
        int i = 1;
    }

    void G() {
        i = 1;
    }
}

içinde F yöntemi, bir örnek değişkeni i yerel değişkeni tarafından gizleniyor i, ancak içinde G yöntemi i hala örneği değişkenine başvuruyor.within the F method, the instance variable i is hidden by the local variable i, but within the G method, i still refers to the instance variable.

Bir iç kapsamda bir ada bir adı bir dış kapsamdaki gizler, bu adı aşırı yüklenmiş tüm oluşumlarını gizler.When a name in an inner scope hides a name in an outer scope, it hides all overloaded occurrences of that name. ÖrnekteIn the example

class Outer
{
    static void F(int i) {}

    static void F(string s) {}

    class Inner
    {
        void G() {
            F(1);              // Invokes Outer.Inner.F
            F("Hello");        // Error
        }

        static void F(long l) {}
    }
}

çağrı F(1) çağırır F bildirilen Inner çünkü dış tüm oluşumlarını F iç bildirim tarafından gizlenmiş.the call F(1) invokes the F declared in Inner because all outer occurrences of F are hidden by the inner declaration. Aynı nedenle, arama F("Hello") bir derleme zamanı hatası oluşur.For the same reason, the call F("Hello") results in a compile-time error.

Devralma yoluyla gizlemeHiding through inheritance

Devralma üzerinden ad gizleme sınıflarını veya yapılarını temel sınıftan devralınan adı yeniden bildirmek oluşur.Name hiding through inheritance occurs when classes or structs redeclare names that were inherited from base classes. Bu tür bir ad gizleme aşağıdaki biçimlerden birini alır:This type of name hiding takes one of the following forms:

  • Bir sabit, alan, özelliği, olay veya bir sınıf ya da yapı birimine türü aynı ada sahip tüm taban sınıfı üyelerini gizler.A constant, field, property, event, or type introduced in a class or struct hides all base class members with the same name.
  • Bir sınıf ya da struct'a dahil edilen bir yöntem, yöntem olmayan taban sınıf üyelerinin tamamı aynı ada sahip ve (yöntem adı ve parametre sayısı, değiştiriciler ve türleri) aynı imzaya sahip tüm taban sınıfı yöntemlerini gizler.A method introduced in a class or struct hides all non-method base class members with the same name, and all base class methods with the same signature (method name and parameter count, modifiers, and types).
  • Bir sınıf veya yapı içinde tanıtılan bir dizin oluşturucu (parametre sayısı ve türleri) aynı imzaya sahip tüm taban sınıfı dizin oluşturucularını gizler.An indexer introduced in a class or struct hides all base class indexers with the same signature (parameter count and types).

İşleç bildirimi kuralları (işleçleri) temel sınıfta operatör olarak aynı imzaya sahip bir işleç bildirmek üzere bir türetilmiş sınıfta imkansız hale.The rules governing operator declarations (Operators) make it impossible for a derived class to declare an operator with the same signature as an operator in a base class. Bu nedenle, işleçleri asla birbirleriyle gizleyin.Thus, operators never hide one another.

Bir dış kapsam adı gizleme aykırı devralınan bir kapsamdan erişilebilir bir adı gizleyerek bildirilmesini uyarı neden olur.Contrary to hiding a name from an outer scope, hiding an accessible name from an inherited scope causes a warning to be reported. ÖrnekteIn the example

class Base
{
    public void F() {}
}

class Derived: Base
{
    public void F() {}        // Warning, hiding an inherited name
}

bildirimi F içinde Derived bildirilmesini bir uyarısına neden olur.the declaration of F in Derived causes a warning to be reported. Temel sınıflar ayrı evrimi engelleyen, devralınan bir adı gizleyerek bir hata değildir özellikle.Hiding an inherited name is specifically not an error, since that would preclude separate evolution of base classes. Örneğin, yukarıdaki durumda çünkü gelmiş olabilir daha sonraki bir sürümünü Base sunulan bir F sınıfı önceki bir sürümde bulunmamıştır yöntemi.For example, the above situation might have come about because a later version of Base introduced an F method that wasn't present in an earlier version of the class. Yukarıdaki durumu hata olsaydı, sonra ayrı ayrı tutulan Sınıf Kitaplığı'nda bir temel sınıf için yapılan herhangi bir değişiklik potansiyel olarak türetilmiş sınıfları geçersiz olmasına neden olabilir.Had the above situation been an error, then any change made to a base class in a separately versioned class library could potentially cause derived classes to become invalid.

Devralınan bir adı gizleyerek neden uyarı aracılığıyla kaldırılabilir new değiştiricisi:The warning caused by hiding an inherited name can be eliminated through use of the new modifier:

class Base
{
    public void F() {}
}

class Derived: Base
{
    new public void F() {}
}

new Değiştiricisi gösterir F içinde Derived "Yeni" ve bu gerçekten de devralınan bir üyeyi gizlemek üzere tasarlanmış olduğunu.The new modifier indicates that the F in Derived is "new", and that it is indeed intended to hide the inherited member.

Yeni üye bildirimi yalnızca yeni üye kapsamında devralınmış bir üyeyi gizler.A declaration of a new member hides an inherited member only within the scope of the new member.

class Base
{
    public static void F() {}
}

class Derived: Base
{
    new private static void F() {}    // Hides Base.F in Derived only
}

class MoreDerived: Derived
{
    static void G() { F(); }          // Invokes Base.F
}

Bildirimi yukarıdaki örnekte F içinde Derived gizler F , öğesinden devralınan Base, ancak bu yana yeni F içinde Derived özel erişimi olduğunu kapsamı kapsamaz MoreDerived .In the example above, the declaration of F in Derived hides the F that was inherited from Base, but since the new F in Derived has private access, its scope does not extend to MoreDerived. Bu nedenle, arama F() içinde MoreDerived.G geçerli olduğundan ve çağıracağı Base.F.Thus, the call F() in MoreDerived.G is valid and will invoke Base.F.

Namespace ve tür adlarıNamespace and type names

Çeşitli bağlamlarda bir C# programını gerektiren bir namespace_name veya type_name belirtilmelidir.Several contexts in a C# program require a namespace_name or a type_name to be specified.

namespace_name
    : namespace_or_type_name
    ;

type_name
    : namespace_or_type_name
    ;

namespace_or_type_name
    : identifier type_argument_list?
    | namespace_or_type_name '.' identifier type_argument_list?
    | qualified_alias_member
    ;

A namespace_name olduğu bir namespace_or_type_name ad alanına başvuruyor.A namespace_name is a namespace_or_type_name that refers to a namespace. Çözüm, aşağıda açıklandığı gibi aşağıdaki namespace_or_type_name , bir namespace_name bir ad alanına başvurmalıdır veya aksi halde bir derleme zamanı hatası oluşur.Following resolution as described below, the namespace_or_type_name of a namespace_name must refer to a namespace, or otherwise a compile-time error occurs. Hiçbir tür bağımsız değişkenleri (tür bağımsız değişkenleri) içinde mevcut olabilen bir namespace_name (türler tür bağımsız değişkenleri olabilir yalnızca).No type arguments (Type arguments) can be present in a namespace_name (only types can have type arguments).

A type_name olduğu bir namespace_or_type_name bir türe başvuruyor.A type_name is a namespace_or_type_name that refers to a type. Çözüm, aşağıda açıklandığı gibi aşağıdaki namespace_or_type_name , bir type_name bir türe başvurmalıdır veya aksi halde bir derleme zamanı hatası oluşur.Following resolution as described below, the namespace_or_type_name of a type_name must refer to a type, or otherwise a compile-time error occurs.

Varsa namespace_or_type_name tam-diğer ad-anlamını olan açıklandığı gibi üye Namespace diğer adı niteleyicileri.If the namespace_or_type_name is a qualified-alias-member its meaning is as described in Namespace alias qualifiers. Aksi takdirde, bir namespace_or_type_name dört forms birine sahiptir:Otherwise, a namespace_or_type_name has one of four forms:

  • I
  • I<A1, ..., Ak>
  • N.I
  • N.I<A1, ..., Ak>

Burada I tek bir tanımlayıcı N olduğu bir namespace_or_type_name ve <A1, ..., Ak> isteğe bağlıdır type_argument_list.where I is a single identifier, N is a namespace_or_type_name and <A1, ..., Ak> is an optional type_argument_list. Hiçbir type_argument_list olduğundan belirtilen göz önünde bulundurun k sıfır olmalıdır.When no type_argument_list is specified, consider k to be zero.

Anlamı bir namespace_or_type_name şu şekilde belirlenir:The meaning of a namespace_or_type_name is determined as follows:

  • Varsa namespace_or_type_name biçimindedir I veya formun I<A1, ..., Ak>:If the namespace_or_type_name is of the form I or of the form I<A1, ..., Ak>:
    • Varsa K sıfırdır ve namespace_or_type_name genel yöntem bildiriminde içinde görünür (yöntemleri) ve bu bildirimi bir tür parametresi içeriyorsa (türü parametreleri) adıyla I, ardından namespace_or_type_name bu tür parametresine başvuruyor.If K is zero and the namespace_or_type_name appears within a generic method declaration (Methods) and if that declaration includes a type parameter (Type parameters) with name I, then the namespace_or_type_name refers to that type parameter.
    • Aksi takdirde namespace_or_type_name türü bildiriminden sonra her örnek türü için görüntülenen T (örnek türü) itibaren bu türdeki örnek türü bildirim ve (varsa) her kapsayan bir class veya struct bildiriminde örneği türü ile devam etmeden:Otherwise, if the namespace_or_type_name appears within a type declaration, then for each instance type T (The instance type), starting with the instance type of that type declaration and continuing with the instance type of each enclosing class or struct declaration (if any):
      • Varsa K sıfır ve bildirimi T ada sahip bir tür parametresi içeren I, ardından namespace_or_type_name bu tür parametresine başvuran.If K is zero and the declaration of T includes a type parameter with name I, then the namespace_or_type_name refers to that type parameter.
      • Aksi takdirde namespace_or_type_name türü bildirimi gövdesi içinde görünür ve T veya temel türlerinden birinin adına sahip iç içe erişilebilir türü içeren I ve K  tür parametrelerindeki, ardından namespace_or_type_name belirli tür bağımsız değişkenleri ile oluşturulan türü ifade eder.Otherwise, if the namespace_or_type_name appears within the body of the type declaration, and T or any of its base types contain a nested accessible type having name I and K type parameters, then the namespace_or_type_name refers to that type constructed with the given type arguments. Birden fazla tür ise daha türetilmiş türde bildirilen türü seçilir.If there is more than one such type, the type declared within the more derived type is selected. Tür olmayan üyeler (sabitleri, alanları, yöntemleri, özellikleri, Dizinleyicileri, işleçleri, örnek oluşturucuları, yok ediciler ve statik oluşturucular) ve tür üyelerinin farklı sayıda tür parametreleri ile anlamını belirlenirken yoksayılacak olduğunu unutmayın. namespace_or_type_name.Note that non-type members (constants, fields, methods, properties, indexers, operators, instance constructors, destructors, and static constructors) and type members with a different number of type parameters are ignored when determining the meaning of the namespace_or_type_name.
    • Önceki adımları her ad alanı için daha sonra başarısız olursa N, ad alanı ile başlayan namespace_or_type_name her kapsayan ad uzayı ile (eğer varsa) devam etmeden ve ile biten gerçekleşir Genel ad alanı, aşağıdaki adımları bir varlığı bulunana kadar değerlendirilir:If the previous steps were unsuccessful then, for each namespace N, starting with the namespace in which the namespace_or_type_name occurs, continuing with each enclosing namespace (if any), and ending with the global namespace, the following steps are evaluated until an entity is located:
      • Varsa K sıfırdır ve I bir ad alanındaki adı N, ardından:If K is zero and I is the name of a namespace in N, then:
        • Varsa konumu burada namespace_or_type_name gerçekleşir için bir ad alanı bildirimi kapsadığı N ve ad alanı bildirimi içeren bir extern_alias_directive veya using_alias_directive , ad ilişkilendirir I ad alanı veya tür, ardından namespace_or_type_name belirsiz ve bir derleme zamanı hatası oluşur.If the location where the namespace_or_type_name occurs is enclosed by a namespace declaration for N and the namespace declaration contains an extern_alias_directive or using_alias_directive that associates the name I with a namespace or type, then the namespace_or_type_name is ambiguous and a compile-time error occurs.
        • Aksi takdirde, namespace_or_type_name adlı isim uzayına başvuruyor I içinde N.Otherwise, the namespace_or_type_name refers to the namespace named I in N.
      • Aksi takdirde N adına sahip bir erişilebilir türü içeren I ve K  tür parametreleri:Otherwise, if N contains an accessible type having name I and K type parameters, then:
        • Varsa K sıfır ve konumun burada namespace_or_type_name gerçekleşir için bir ad alanı bildirimi kapsadığı N ve ad alanı bildirimi içeren bir extern_alias_directive veya using_alias_directive , ad ilişkilendirir I ad alanı veya tür, ardından namespace_or_type_name belirsiz ve derleme zamanı hata oluşur.If K is zero and the location where the namespace_or_type_name occurs is enclosed by a namespace declaration for N and the namespace declaration contains an extern_alias_directive or using_alias_directive that associates the name I with a namespace or type, then the namespace_or_type_name is ambiguous and a compile-time error occurs.
        • Aksi takdirde, namespace_or_type_name belirli tür bağımsız değişkenleri ile oluşturulan türü ifade eder.Otherwise, the namespace_or_type_name refers to the type constructed with the given type arguments.
      • Aksi halde, konum burada namespace_or_type_name gerçekleşir için bir ad alanı bildirimi kapsadığı N:Otherwise, if the location where the namespace_or_type_name occurs is enclosed by a namespace declaration for N:
        • Varsa K sıfırdır ve ad alanı bildirimi içeren bir extern_alias_directive veya using_alias_directive , ad ilişkilendirir I bir içeri aktarılan ad alanıyla veya tür, ardından namespace_or_type_name bu ad alanı veya tür ifade eder.If K is zero and the namespace declaration contains an extern_alias_directive or using_alias_directive that associates the name I with an imported namespace or type, then the namespace_or_type_name refers to that namespace or type.
        • Aksi takdirde, ad alanları ve tür bildirimleri tarafından aldıysanız using_namespace_directives ve using_alias_directivead alanı bildiriminin bir s içeren tam olarak bir erişilebilir türü adına sahip I ve K  tür parametrelerindeki, ardından namespace_or_type_name belirli tür bağımsız değişkenleri ile oluşturulan türü ifade eder.Otherwise, if the namespaces and type declarations imported by the using_namespace_directives and using_alias_directives of the namespace declaration contain exactly one accessible type having name I and K type parameters, then the namespace_or_type_name refers to that type constructed with the given type arguments.
        • Aksi takdirde, ad alanları ve tür bildirimleri tarafından aldıysanız using_namespace_directives ve using_alias_directivead alanı bildiriminin bir s erişilebilir birden fazla tür içeriyor adına sahip I ve K  tür parametrelerindeki, ardından namespace_or_type_name belirsiz ve hata oluşur.Otherwise, if the namespaces and type declarations imported by the using_namespace_directives and using_alias_directives of the namespace declaration contain more than one accessible type having name I and K type parameters, then the namespace_or_type_name is ambiguous and an error occurs.
    • Aksi takdirde, namespace_or_type_name olup tanımsız ve bir derleme zamanı hatası oluşur.Otherwise, the namespace_or_type_name is undefined and a compile-time error occurs.
  • Aksi takdirde, namespace_or_type_name biçimindedir N.I veya formun N.I<A1, ..., Ak>.Otherwise, the namespace_or_type_name is of the form N.I or of the form N.I<A1, ..., Ak>. N ilk olarak çözümlenen bir namespace_or_type_name.N is first resolved as a namespace_or_type_name. Varsa çözünürlüğünü N bir derleme zamanı hatası oluşur başarılı değil.If the resolution of N is not successful, a compile-time error occurs. Aksi takdirde, N.I veya N.I<A1, ..., Ak> gibi çözümlenir:Otherwise, N.I or N.I<A1, ..., Ak> is resolved as follows:
    • Varsa K sıfır ve N bir isim uzayına başvuruyor ve N ada sahip iç içe geçmiş bir ad alanı içeren I, ardından namespace_or_type_name , iç içe geçmiş ad alanına başvuruyor.If K is zero and N refers to a namespace and N contains a nested namespace with name I, then the namespace_or_type_name refers to that nested namespace.
    • Aksi takdirde N bir isim uzayına başvuruyor ve N adına sahip bir erişilebilir türü içeren I ve K  tür parametrelerindeki, ardından namespace_or_type_name başvurur Bu türe belirli tür bağımsız değişkenleri ile oluşturulmuş.Otherwise, if N refers to a namespace and N contains an accessible type having name I and K type parameters, then the namespace_or_type_name refers to that type constructed with the given type arguments.
    • Aksi takdirde N (büyük olasılıkla yapılandırılmış) bir sınıf veya yapı türe başvuruyor ve N veya iç içe bir erişilebilir tür adına sahip tüm temel sınıflarını içeren I ve K  parametreleri, ardından yazınnamespace_or_type_name belirli tür bağımsız değişkenleri ile oluşturulan türü ifade eder.Otherwise, if N refers to a (possibly constructed) class or struct type and N or any of its base classes contain a nested accessible type having name I and K type parameters, then the namespace_or_type_name refers to that type constructed with the given type arguments. Birden fazla tür ise daha türetilmiş türde bildirilen türü seçilir.If there is more than one such type, the type declared within the more derived type is selected. Anlamını unutmayın N.I temel sınıf belirtimi çözümünün bir parçası belirlenen N sonra doğrudan temel sınıfını N nesne olarak kabul edilir (temel sınıflar).Note that if the meaning of N.I is being determined as part of resolving the base class specification of N then the direct base class of N is considered to be object (Base classes).
    • Aksi takdirde, N.I geçersiz bir namespace_or_type_name, ve bir derleme zamanı hatası oluşur.Otherwise, N.I is an invalid namespace_or_type_name, and a compile-time error occurs.

A namespace_or_type_name statik sınıf başvurmak için izin verilir (statik sınıflar) yalnızcaA namespace_or_type_name is permitted to reference a static class (Static classes) only if

  • Namespace_or_type_name olduğu T içinde bir namespace_or_type_name formun T.I, veyaThe namespace_or_type_name is the T in a namespace_or_type_name of the form T.I, or
  • Namespace_or_type_name olduğu T içinde bir typeof_expression (bağımsız değişken listeleri1) biçiminde typeof(T).The namespace_or_type_name is the T in a typeof_expression (Argument lists1) of the form typeof(T).

Tam olarak nitelenmiş adlarFully qualified names

Her ad alanı ve türü olan bir tam nitelikli ad, hangi benzersiz olarak tanımlayan ad alanı veya tür diğerleri arasından.Every namespace and type has a fully qualified name, which uniquely identifies the namespace or type amongst all others. Tam adı ad alanı veya tür N şu şekilde belirlenir:The fully qualified name of a namespace or type N is determined as follows:

  • Varsa N üye tam adı genel ad alanı olan N.If N is a member of the global namespace, its fully qualified name is N.
  • Aksi halde, tam adı olduğunu S.Nburada S tam adı ad alanı veya tür, N bildirilir.Otherwise, its fully qualified name is S.N, where S is the fully qualified name of the namespace or type in which N is declared.

Diğer bir deyişle, tam olarak nitelenmiş adını N neden tanımlayıcıları tam hiyerarşik yolu Ngenel ad alanından başlayan.In other words, the fully qualified name of N is the complete hierarchical path of identifiers that lead to N, starting from the global namespace. Her bir ad alanı veya tür üyesinin benzersiz bir adı olması gerektiğinden tam adı ad alanı veya tür her zaman benzersiz olduğunu izler.Because every member of a namespace or type must have a unique name, it follows that the fully qualified name of a namespace or type is always unique.

Aşağıdaki örnekte, birden fazla ad alanı ve tür bildirimleri ilişkili tam adları ile birlikte gösterilir.The example below shows several namespace and type declarations along with their associated fully qualified names.

class A {}                // A

namespace X               // X
{
    class B               // X.B
    {
        class C {}        // X.B.C
    }

    namespace Y           // X.Y
    {
        class D {}        // X.Y.D
    }
}

namespace X.Y             // X.Y
{
    class E {}            // X.Y.E
}

Otomatik bellek yönetimiAutomatic memory management

C# geliştiricilerin el ile ayırarak ve nesnelerin kapladığı bellek serbest bırakma döngüsünü boşaltır otomatik bellek yönetimi kullanır.C# employs automatic memory management, which frees developers from manually allocating and freeing the memory occupied by objects. Otomatik bellek yönetimi ilkeleri tarafından uygulanır bir çöp toplayıcı.Automatic memory management policies are implemented by a garbage collector. Bir nesnenin bellek yönetimi yaşam döngüsü aşağıdaki gibidir:The memory management life cycle of an object is as follows:

  1. Nesne oluşturulduğunda bellek de ayrılır, oluşturucu çalıştırın ve nesne canlı olarak kabul edilir.When the object is created, memory is allocated for it, the constructor is run, and the object is considered live.
  2. Nesne veya herhangi bir bölümünü tüm olası yürütme devamını tarafından erişilemez, Yıkıcılar çalışması dışında nesne artık kullanımda olarak kabul edilir ve yok etme için uygun hale gelir.If the object, or any part of it, cannot be accessed by any possible continuation of execution, other than the running of destructors, the object is considered no longer in use, and it becomes eligible for destruction. C# derleyicisi ve atık toplayıcı bir nesneye başvuran gelecekte kullanılabilir belirlemek için kod çözümleme tercih edebilirsiniz.The C# compiler and the garbage collector may choose to analyze code to determine which references to an object may be used in the future. Örneği için kapsamda olan yerel bir değişken yalnızca var olan bir nesneye başvuru olduğu halde bu yerel değişkeni hiçbir zaman tüm olası devamı olarak, geçerli yürütme yürütme yordamda işaret edecek şekilde adlandırılır, çöp toplayıcı olabilir (ancak değil için gerekli) nesne olarak artık kullanımda değerlendir.For instance, if a local variable that is in scope is the only existing reference to an object, but that local variable is never referred to in any possible continuation of execution from the current execution point in the procedure, the garbage collector may (but is not required to) treat the object as no longer in use.
  3. Nesne yok etme için uygun olduğunda, daha sonra belirtilmeyen bir saat yok Edicisi (yok ediciler) (varsa) nesne çalıştırın.Once the object is eligible for destruction, at some unspecified later time the destructor (Destructors) (if any) for the object is run. Normal koşullar altında nesnenin yok Edicisi, uygulamaya özel API'leri bu davranışı geçersiz kılınmasına izin verebilir ancak yalnızca bir kez çalıştırılır.Under normal circumstances the destructor for the object is run once only, though implementation-specific APIs may allow this behavior to be overridden.
  4. Nesnenin yok Edicisi çalıştırıldığında, nesne veya herhangi bir bölümünü tarafından yürütme yıkıcı, çalıştırılmasını da dahil olmak üzere, tüm olası devamlılık erişilemiyorsa nesne erişilemez olarak kabul edilir ve nesne koleksiyonu için uygun hale gelir.Once the destructor for an object is run, if that object, or any part of it, cannot be accessed by any possible continuation of execution, including the running of destructors, the object is considered inaccessible and the object becomes eligible for collection.
  5. Son olarak, nesne koleksiyonu için uygun hale geldikten sonra bir süre sonra atık toplayıcı o nesne ile ilişkili bellek kazandırır.Finally, at some time after the object becomes eligible for collection, the garbage collector frees the memory associated with that object.

Atık toplayıcı nesne kullanımı hakkında bilgi tutar ve bellek yönetimi ve bir nesneye bir nesne dışında yeniden konumlandırmakta artık kullanımda veya erişilemez durumda olduğunda, yeni oluşturulan bir nesne bulmak için bellek nerede gibi kararları almak için bu bilgileri kullanır.The garbage collector maintains information about object usage, and uses this information to make memory management decisions, such as where in memory to locate a newly created object, when to relocate an object, and when an object is no longer in use or inaccessible.

Çöp toplayıcı var olup olmadığını varsayar gibi diğer diller, C# atık toplayıcı çok çeşitli bellek yönetimi ilkeleri uygulayabilir şekilde tasarlanmıştır.Like other languages that assume the existence of a garbage collector, C# is designed so that the garbage collector may implement a wide range of memory management policies. Örneğin, C# yok ediciler çalıştırılması veya uygun oldukları hemen sonra nesnelerin toplandığını veya yıkıcıları herhangi belirli bir iş parçacığı veya herhangi bir sırada çalıştırılması gerektirmez.For instance, C# does not require that destructors be run or that objects be collected as soon as they are eligible, or that destructors be run in any particular order, or on any particular thread.

Atık toplayıcının davranışı, sınıfında statik yöntemler aracılığıyla belirli bir ölçüde denetlenebilir System.GC.The behavior of the garbage collector can be controlled, to some degree, via static methods on the class System.GC. Bu sınıf, bir koleksiyon gerçekleşmesi için çalıştırın (veya çalıştırma için), Yıkıcılar istemek için kullanılan ve VS.This class can be used to request a collection to occur, destructors to be run (or not run), and so forth.

Çöp Toplayıcısı nesneleri toplar ve Yıkıcılar çalıştırmak ne zaman karar içinde geniş enlem izin verildiğinden, uyumlu bir uygulaması aşağıdaki kodda gösterilen farklıdır çıktıları üretebilir.Since the garbage collector is allowed wide latitude in deciding when to collect objects and run destructors, a conforming implementation may produce output that differs from that shown by the following code. ProgramThe program

using System;

class A
{
    ~A() {
        Console.WriteLine("Destruct instance of A");
    }
}

class B
{
    object Ref;

    public B(object o) {
        Ref = o;
    }

    ~B() {
        Console.WriteLine("Destruct instance of B");
    }
}

class Test
{
    static void Main() {
        B b = new B(new A());
        b = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}

sınıfının bir örneğini oluşturur A ve sınıf örneği B.creates an instance of class A and an instance of class B. Bu nesneler çöp toplama işlemi için uygun hale olduğunda değişkeni b değeri atanır null, bu yana bu tarihten sonra bunlara erişmek kullanıcı tarafından yazılan kodlar için mümkün değildir.These objects become eligible for garbage collection when the variable b is assigned the value null, since after this time it is impossible for any user-written code to access them. Çıkış şunlardan biri olabilir.The output could be either

Destruct instance of A
Destruct instance of B

veyaor

Destruct instance of B
Destruct instance of A

hangi nesneler çöp olarak toplanacak olduklarından dil hiçbir sırası kısıtlamaları getirir.because the language imposes no constraints on the order in which objects are garbage collected.

Zarif durumda "yok etme için uygun" ve "koleksiyonu için uygun" arasındaki fark önemli olabilir.In subtle cases, the distinction between "eligible for destruction" and "eligible for collection" can be important. Örneğin,For example,

using System;

class A
{
    ~A() {
        Console.WriteLine("Destruct instance of A");
    }

    public void F() {
        Console.WriteLine("A.F");
        Test.RefA = this;
    }
}

class B
{
    public A Ref;

    ~B() {
        Console.WriteLine("Destruct instance of B");
        Ref.F();
    }
}

class Test
{
    public static A RefA;
    public static B RefB;

    static void Main() {
        RefB = new B();
        RefA = new A();
        RefB.Ref = RefA;
        RefB = null;
        RefA = null;

        // A and B now eligible for destruction
        GC.Collect();
        GC.WaitForPendingFinalizers();

        // B now eligible for collection, but A is not
        if (RefA != null)
            Console.WriteLine("RefA is not null");
    }
}

Yukarıdaki programında çöp toplayıcı yok edicisinde seçerse A yıkıcısı önce B, bu programın çıkışı gelebilir:In the above program, if the garbage collector chooses to run the destructor of A before the destructor of B, then the output of this program might be:

Destruct instance of A
Destruct instance of B
A.F
RefA is not null

Olsa da unutmayın örneğini A kullanımda olmadığı ve A's yok Edicisi çalıştırıldığı, yöntemleri için yine de mümkündür A (Bu durumda, F) başka bir yok ediciden çağrılabilir.Note that although the instance of A was not in use and A's destructor was run, it is still possible for methods of A (in this case, F) to be called from another destructor. Ayrıca, yok edicinin çalışan bir nesneyi yeniden ana hat programından kullanılabilir duruma neden olabileceğini unutmayın.Also, note that running of a destructor may cause an object to become usable from the mainline program again. Bu durumda, çalışmasını Byok Edicisi örneğini neden kullanıcının A olduğu daha önce de kullanan dinamik başvuru tarafından erişilebilir duruma gelmesi Test.RefA.In this case, the running of B's destructor caused an instance of A that was previously not in use to become accessible from the live reference Test.RefA. Çağrısından sonra WaitForPendingFinalizers, örneğini B koleksiyonu, ancak örneği için uygun A başvurusu nedeniyle değil, Test.RefA.After the call to WaitForPendingFinalizers, the instance of B is eligible for collection, but the instance of A is not, because of the reference Test.RefA.

Karışıklık ve beklenmeyen davranışları önlemek için genellikle bir yok ediciler için yalnızca kendi nesnenin kendi alanlarında depolanan veriler üzerinde temizleme işlemini yapmak için ve tüm Eylemler, başvurulan nesneler veya static alanlar gerçekleştirmemeye fikirdir.To avoid confusion and unexpected behavior, it is generally a good idea for destructors to only perform cleanup on data stored in their object's own fields, and not to perform any actions on referenced objects or static fields.

Yıkıcıları kullanma uygulayan bir sınıf olanak alternatiftir System.IDisposable arabirimi.An alternative to using destructors is to let a class implement the System.IDisposable interface. Böylece, bir kaynak olarak nesne erişerek nesne kaynaklarını genellikle serbest bırakmak ne zaman belirlemek istemci nesne bir using deyimi (using deyimi).This allows the client of the object to determine when to release the resources of the object, typically by accessing the object as a resource in a using statement (The using statement).

Yürütme sırasıExecution order

Yan etkilerini çalışan her bir iş parçacığı, kritik yürütme noktalarda korunur, C# programının yürütme devam eder.Execution of a C# program proceeds such that the side effects of each executing thread are preserved at critical execution points. A yan etkisi bir okuma veya yazma geçici bir alan, geçici olmayan değişkenine yazma, yazma için bir dış kaynağa ve bir özel durum olarak tanımlanır.A side effect is defined as a read or write of a volatile field, a write to a non-volatile variable, a write to an external resource, and the throwing of an exception. Volatile alanlara başvurular, bu yan etkileri sırasını gerekir muhafaza edilir kritik yürütme noktaları olan (geçici alanları), lock deyimleri (lock deyiminin), ve iş parçacığı oluşturma ve sonlandırma.The critical execution points at which the order of these side effects must be preserved are references to volatile fields (Volatile fields), lock statements (The lock statement), and thread creation and termination. C# programının, aşağıdaki kısıtlamalara tabi yürütme sırasını değiştirmek yürütme ortamı ücretsizdir:The execution environment is free to change the order of execution of a C# program, subject to the following constraints:

  • Veri bağımlılığı yürütme iş parçacığının içinden korunur.Data dependence is preserved within a thread of execution. Diğer bir deyişle, tüm iş parçacığı deyimlerinde özgün program sırasıyla yürütüldü gibi her değişkenin değeri olarak hesaplanır.That is, the value of each variable is computed as if all statements in the thread were executed in original program order.
  • Kuralları korunur başlatma sıralaması (alan başlatma ve değişken başlatıcılar).Initialization ordering rules are preserved (Field initialization and Variable initializers).
  • Geçici okuma ve yazma işlemleri göre sıralama yan etkilerini korunur (geçici alanları).The ordering of side effects is preserved with respect to volatile reads and writes (Volatile fields). Bu ifadenin değeri kullanılmaz ve gerekli yan etkileri (herhangi bir yöntemi çağırmak veya geçici bir alan erişerek neden dahil) üretilir çıkarabilir ek olarak, yürütme ortamı bir ifade parçası değerlendirme değil.Additionally, the execution environment need not evaluate part of an expression if it can deduce that that expression's value is not used and that no needed side effects are produced (including any caused by calling a method or accessing a volatile field). Program yürütme (örneğin, başka bir iş parçacığı tarafından oluşturulan bir özel) zaman uyumsuz bir olay tarafından kesildiğinde, gözlemlenebilir bir yan etkileri özgün program sırasıyla görünür olduğunu garanti edilmez.When program execution is interrupted by an asynchronous event (such as an exception thrown by another thread), it is not guaranteed that the observable side effects are visible in the original program order.