dahili bir sınıfta genel ve dahili yöntemler


82
internal class Foo
{
  public void Fee()
  {
    Debug.WriteLine("Fee");
  }

  internal void Fi()
  {
    Debug.WriteLine("Fi");
  }
}

Tüm sınıf zaten dahili olduğundan, Fee () ve Fi () eşit derecede erişilebilir olduğunu düşünüyorum. Bir şeyi gözden mi kaçırıyorum? Böyle bir durumda yöntemler için genel veya iç tercih yapmak için herhangi bir sebep var mı?


2
@EricLippert bugün fikrini yazdı. ericlippert.com/2014/09/15/internal-or-public/#more-2353
ScottS

Yanıtlar:


97

internal class FooDeklarasyon erişilebilirliğini geçersiz kılar public void Fee()etkin bir iç yapım yönteminin.

Bu durumda, yöntemlerde iç ve genel kullanılması aynı etkiye sahip olacaktır. Böyle bir durumda dahili yöntemleri yerine genel yöntemleri seçmemin tek nedeni, bunu seçerseniz, gelecekteki bir sürümde genel bir sınıfa geçişi kolaylaştırmak olacaktır.


36

Burada cevapta eksik olan tek şey, bunu neden yaptın?

Bazı kütüphanelerde, kütüphanenin tüketicisinin dokunması amaçlanmayan birçok sınıf vardır, ancak genel olarak işaretlenmiş arayüzleri miras almaları gerekir. Örneğin, IComparer arabirimini miras alan bir sınıfa sahip bir kitaplığım var, ancak bu yalnızca dahili olarak kullanılıyor ve kitaplığımın genel yönünü karıştırmak istemiyorum. Uygulanan Karşılaştırma işlevini dahili olarak işaretlersem, derleyici IComparer arabirimini uygulamadığımdan şikayet eder.

Öyleyse arayüzü başarılı bir şekilde nasıl uygulayabilirim ve aynı zamanda kütüphanemin genel görünümünde erişilebilir olmasını nasıl önleyebilirim? Sınıfı dahili, ancak uygulanan işlevi genel olarak işaretleyin.


30

Aslında - yansıma kullanıyorsanız büyük bir fark var; Özellikle, erişiminiz olsa bile, yansıtma yoluyla dahili yöntemlere erişmeye çalışırsanız Silverlight çok üzülebilir. Normal .NET üzerinde çalışmasına rağmen, kodun Silverlight üzerinde çalışmasını sağlamak için bir yöntemi herkese açık hale getirmek zorunda kaldığım durumlar gördüm.

Normal .NET'e kısmen güven duyduğunuzda da aynısını bulabilirsiniz.


3
Bunlar her zaman ilgilendiğim türden kirli ayrıntılar. Yine de, genellikle birisi sınıflarımdaki gizli üyelere erişmek için yansıma kullanıyorsa, onlar için zor olup olmadığını merak etmeyeceğim.
ScottS

1
@ScottS - bazen kendi türleriniz üzerinde düşünürsünüz - yani, normalde nerede iç yönteme erişiminiz olur, ancak birdenbire erişemezsiniz.
Marc Gravell

9

Dahili sınıfınızın bir arabirim uygulamasını istediğinizde fark yaratır. Bazı arayüzlerin uygulaması olan yöntemin Public olması gerekir.


7

Haklısınız, hem Ücret hem de Fi eşit olarak erişilebilir olacak.

3.5.2 altında CSharp Language Specification 3.0'dan:

Bir P programında bir T tipinde beyan edilen iç içe geçmiş bir M üyesinin erişilebilirlik alanı aşağıdaki gibi tanımlanır (M'nin kendisinin muhtemelen bir tip olabileceğine dikkat çekilir):

• M'nin beyan edilen erişilebilirliği herkese açıksa, M'nin erişilebilirlik alanı T'nin erişilebilirlik alanıdır.

Dolayısıyla, Ücret kamuya açık olsa bile, Foo kadar erişilebilir olacaktır (yani dahili).


3

Göre msdn belgelerinde iç veya kamu gibi yöntemleri işaretlemek için herhangi bir fark yapmaz böylece Foo sınıfı, senin montaj erişilebilir dışında olmayacaktır; Attribute InternalsVisibleTo kullanarak bile fark yaratmaz


1

Bir sınıf dahili ise sadece dahili yöntemlerle giderdim. Fikrinizi değiştirirseniz ve sınıfı herkese açık hale getirirseniz, sadece bir metin değişikliği yapabilirsiniz ve bitirdiniz.

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.