C # 'daki varsayılan erişim değiştiricileri nelerdir?


384

Sınıflar, yöntemler, üyeler, yapıcılar, temsilciler ve arabirimler için varsayılan erişim değiştiricisi nedir?

Yanıtlar:


486

C # 'daki her şey için varsayılan erişim "o üye için bildirebileceğiniz en kısıtlı erişim" dir .

Yani mesela:

namespace MyCompany
{
    class Outer
    {
        void Foo() {}
        class Inner {}
    }
}

eşittir

namespace MyCompany
{
    internal class Outer
    {
        private void Foo() {}
        private class Inner {}
    }
}

Bunun bir istisnası, bir mülkün bir kısmını (genellikle ayarlayıcı) mülkün bildirilen erişilebilirliğinden daha kısıtlı hale getirmektir:

public string Name
{
    get { ... }
    private set { ... } // This isn't the default, have to do it explicitly
}

C # 3.0 spesifikasyonunun söylediği şey budur (bölüm 3.5.1):

Üye bildiriminin yapıldığı bağlama bağlı olarak, yalnızca belirli bildirilmiş erişilebilirlik türlerine izin verilir. Ayrıca, bir üye bildirimi erişim değiştiricileri içermiyorsa, bildirimin yapıldığı bağlam bildirilen varsayılan erişilebilirliği belirler.

  • Ad alanlarında dolaylı olarak herkesin bildirdiği erişilebilirlik vardır. Ad alanı bildirimlerinde erişim değiştiricilerine izin verilmez.
  • Derleme birimlerinde veya ad alanlarında bildirilen türler, genel veya dahili olarak bildirilmiş erişilebilirliğe ve varsayılan olarak dahili olarak bildirilmiş erişilebilirliğe sahip olabilir.
  • Sınıf üyeleri bildirilen beş erişilebilirlik türünden herhangi birine sahip olabilir ve varsayılan olarak özel bildirilen erişilebilirlik seçeneğine sahip olabilir. (Bir sınıfın üyesi olarak bildirilen bir tür, bildirilen beş erişilebilirlik türünden herhangi birine sahip olabilir, oysa bir ad alanının üyesi olarak bildirilen bir tür yalnızca genel veya dahili olarak bildirilen erişilebilirliğe sahip olabilir.)
  • Yapılar dolaylı olarak mühürlendiğinden, yapı üyeleri genel, dahili veya özel olarak bildirilmiş erişilebilirliğe ve varsayılan olarak özel olarak bildirilmiş erişilebilirliğe sahip olabilir. Bir yapıda tanıtılan yapı üyeleri (yani, bu yapı tarafından miras alınmamış), bildirilmiş dahili erişilebilirliğe sahip olamaz. (Bir yapının üyesi olarak bildirilen bir türün genel, dahili veya özel olarak bildirilen erişilebilirliği olabileceğini, ancak bir ad alanının üyesi olarak bildirilen bir türün yalnızca genel veya dahili olarak bildirilen erişilebilirliği olabileceğini unutmayın.)
  • Arabirim üyeleri dolaylı olarak kamuya açıklanmış erişilebilirliğe sahiptir. Arabirim üye bildirimlerinde erişim değiştiricilerine izin verilmez.
  • Numaralandırma üyelerinin zımni olarak kamuya açıklanmış erişilebilirlikleri vardır. Numaralandırma üyesi bildirimlerinde erişim değiştiricilerine izin verilmez.

(Yuvalanmış türlerin "sınıf üyeleri" veya "yapı üyeleri" bölümleri altında olacağını ve bu nedenle varsayılan olarak özel görünürlük olacağını unutmayın.)


154
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!

13
Bu, bir sınıfın da bir üye olması durumunda (iç içe türden dolayı) varsayılan olarak özel olarak ayarlandığını göstermez. Ayrıca, bir arayüz ve enum üyeleri her zaman herkese açıktır.
Jon Skeet

1
@niry Hayır, özel değil. Herkese açık. Bu sadece eğer öyleyse, uygulayan tip bir yuva almaz class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();sen erişemiyor, Mile a.M()ancak sağlayarak erişebilirsiniz, (a as IFoo).M(). (Özellikler hakkında daha fazla bilgi için spesifikasyona bakın)
M.Stramm

130

Kısa cevap: minimum erişim (Jon Skeet'in cevabı).

Uzun cevap:

Yuvalanmamış türler, numaralandırma ve delege erişilebilirlikleri ( yalnızca dahili veya genel erişilebilirlik olabilir )

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | internal  | public, internal

class                | internal  | public, internal

struct               | internal  | public, internal

delegate             | internal  | public, internal

Yuvalanmış tür ve üye erişilebilirlikleri

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | public    | none

class                | private   | All¹

struct               | private   | public, internal, private²

delegate             | private   | All¹

constructor          | private   | All¹

interface member     | public    | none (always implicitly public)

method               | private   | All¹

field                | private   | All¹

user-defined operator| none      | public (must be declared public)

¹ Tümü === herkese açık, korumalı, dahili, özel, korumalı dahili

² yapılar yapılardan veya sınıflardan miras alamazlar (her ne kadar arayüzler de olsa), korunan geçerli bir değiştirici değildir

Yuvalanmış bir türün erişilebilirliği, hem üyenin bildirilen erişilebilirliği hem de hemen içeren türün erişilebilirlik etki alanı tarafından belirlenen erişilebilirlik etki alanına bağlıdır. Ancak, iç içe bir türün erişilebilirlik etki alanı, içerdiği türün etki alanını aşamaz.

Not: CIL'in ayrıca (mevcut korumalı "veya" dahili "nin aksine korumalı ve dahili , ancak bildiklerime göre bu şu anda C # 'da kullanılamamaktadır.


Görmek:

http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en- us / library / cx03xt0t.aspx
(Microsoft URI'ları seviyorum ...)


12

Erişim Değiştiricilere bir göz atın (C # Programlama Kılavuzu)

Sınıf ve Yapı Erişilebilirliği

Doğrudan bir ad alanı içinde bildirilen sınıflar ve yapılar (diğer bir deyişle, diğer sınıflar veya yapılar içinde yuvalanmayan) genel veya dahili olabilir. Herhangi bir erişim değiştirici belirtilmemişse, varsayılan değer Dahili'dir.

İç içe sınıflar ve yapılar da dahil olmak üzere yapı üyeleri, genel, dahili veya özel olarak bildirilebilir. İç içe sınıflar ve yapılar dahil olmak üzere sınıf üyeleri herkese açık, korumalı iç, korumalı, iç, özel korumalı veya özel olabilir. İç içe sınıflar ve yapılar dahil olmak üzere sınıf üyeleri ve yapı üyeleri için erişim düzeyi varsayılan olarak gizlidir. Özel iç içe türlere, içerilen türün dışından erişilemez.

Türetilmiş sınıfların temel türlerinden daha fazla erişilebilirliği olamaz. Başka bir deyişle, bir iç sınıf A'dan türeyen bir genel B sınıfına sahip olamazsınız. Buna izin verilirse, A'yı genelleştirme etkisi olacaktır, çünkü A'nın tüm korumalı veya iç üyelerine türetilmiş sınıftan erişilebilir.

Kullanarak diğer tür montajların dahili türlerinize erişmesini sağlayabilirsiniz InternalsVisibleToAttribute. Daha fazla bilgi için, bkz. Arkadaş Montajları.

Sınıf ve Yapı Üyesi Erişilebilirliği

Sınıf üyeleri (iç içe sınıflar ve yapılar dahil) altı erişim türünden herhangi biri ile bildirilebilir. Yapılar devralmayı desteklemediğinden, yapı üyeleri korumalı olarak ilan edilemez.

Normalde, bir üyenin erişilebilirliği, onu içeren türün erişilebilirliğinden fazla değildir. Ancak, üye arabirim yöntemlerini uygular veya ortak temel sınıfta tanımlanan sanal yöntemleri geçersiz kılarsa, bir iç sınıfın genel üyesine derleme dışından erişilebilir.

Alan, mülk veya olay olan herhangi bir üyenin türü en azından üyenin kendisi kadar erişilebilir olmalıdır. Benzer şekilde, bir yöntem, dizinleyici veya temsilci olan herhangi bir üyenin dönüş türü ve parametre türlerine en azından üyenin kendisi kadar erişilebilir olmalıdır. Örneğin, C de herkese açık olmadığı sürece C sınıfını döndüren genel bir M yönteminiz olamaz. Benzer şekilde, A özel olarak bildirilirse, A tipi korumalı bir özelliğiniz olamaz.

Kullanıcı tanımlı işleçler her zaman genel ve statik olarak bildirilmelidir. Daha fazla bilgi için, bkz.

Sonlandırıcıların erişilebilirlik değiştiricileri olamaz.

Diğer çeşitler

Doğrudan bir ad alanı içinde bildirilen arabirimler, genel veya dahili olarak ve sınıflar ve yapılar gibi, iç erişim varsayılan olarak arabirimler olarak bildirilebilir. Bir arabirimin amacı, diğer türlerin bir sınıfa veya yapıya erişmesini sağlamak olduğundan, arabirim üyeleri her zaman herkese açıktır. Arabirim üyelerine hiçbir erişim değiştiricisi uygulanamaz.

Numaralandırma üyeleri her zaman herkese açıktır ve erişim değiştiricileri uygulanamaz.

Delegeler sınıflar ve yapılar gibi davranırlar. Varsayılan olarak, doğrudan bir ad alanı içinde bildirildiğinde dahili erişime ve iç içe yerleştirildiğinde özel erişime sahiptirler.


8

Sınıf ise İç varsayılan olarak.

  • Sınıf üyeleri varsayılan olarak gizlidir .

Arayüz ise İç varsayılan olarak.

  • Arayüz üyeleri varsayılan olarak herkese açıktır . (Arayüzler, üyelerine herhangi bir erişilebilirlik belirtmemize izin vermez.)

    Not: Arabirim üyelerine herhangi bir erişim belirteci belirtmeye çalışırsanız, derleme hatası gösterir.

Struct olan İç varsayılan olarak.

  • Yapı üyeleri varsayılan olarak gizlidir .

5

Bazı dokümantasyon bağlantısı eklemek istiyorum. Daha fazla ayrıntıya buradan göz atın .

resim açıklamasını buraya girin


1
sınıf varsayılan olarak içseldir ve özel değildir.
Baahubali

1
Nerede yazdım sınıf özel mi?
Asif Mushtaq

Bu tablo yalnızca iç içe tipler için geçerlidir.
BlueSilver

sınıf varsayılan olarak dahili olup ad alanının içindeki sınıf özel olamaz. ancak bir sınıf içindeki sınıf (iç içe sınıf) özel olabilir
Arun

Arabirimin erişim değiştirici İç varsayılan olarak.
Kamala Hanchinal

4

En basit cevap şudur .....

C # 'daki tüm üyeler her zaman varsayılan olarak mümkün olan LEAST erişilebilir değiştiricisini alır.

Bu nedenle, bir derlemedeki tüm üst düzey sınıflar varsayılan olarak "dahili" dir; bu, bulundukları derleme için herkese açık, ancak özel veya dış derlemelere erişimin dışında olduğu anlamına gelir. Üst düzey bir sınıf için tek seçenek halka açıktır ve bu daha erişilebilirdir. Yuvalanmış türler için, yalnızca herkese açık olabilecek numaralandırma ve arabirim üyeleri gibi birkaç nadir istisna dışında tümü özeldir. Bazı örnekler. Üst düzey sınıflar ve arabirimler durumunda, varsayılanlar şunlardır:

sınıf Hayvan iç sınıf Hayvan ile aynı

arayüz Hayvan genel arayüz Hayvan ile aynı

İç içe sınıflar ve arabirimler (iç tipler) durumunda, varsayılan değerler şunlardır:

class Animal özel sınıf Animal ile aynı

arayüz Hayvan ile aynı özel arayüz Hayvan ile

Varsayılanın her zaman en özel olduğunu varsayarsanız, varsayılanı değiştirmeniz gerekene kadar bir erişimci kullanmanız gerekmez. Kolay.



0

Ad alanı seviyesi: internal

Tip seviyesi: private

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.