c # içinde dahili ve genel


92

publicVe internalgörünürlük değiştiricileri arasındaki farkı bilmek istiyorum .

Bir internalsınıfta ne zaman ve ne zaman kullanmalıyız public? Bir yöntem olmalıdır zaman ile karıştı publicya internal.

Montajdan internalerişilebileceğini okudum , aynı publiczamanda farkın yattığı montaj aracılığıyla da kullanılabilir.

Yanıtlar:


102

public her yerden görülebilir.

internal yalnızca bir montaj içinde görülebilir

Dahili API'leri korumak için yalnızca dahili kullanma eğilimindesiniz. Örneğin, bir yöntemin birkaç aşırı yüklemesini açığa çıkarabilirsiniz:

public int Add(int x, int y)
public int Add(int x,int y, int z)

Her ikisi de dahili yöntemi çağırır

internal int Add(int[] numbers)

Daha sonra bir yönteme çok fazla karmaşıklık katabilirsiniz, ancak programcının yöntemi doğru bir şekilde çağırmasına yardımcı olabilecek cephe yöntemlerini kullanarak onu "koruyun". (Dizi parametresine sahip uygulama yöntemi, örneğin keyfi bir değer sınırına sahip olabilir.)

Ayrıca, Reflection'ı kullanarak, görünürlüklerine bakılmaksızın tüm yöntemlerin çağrılabilir olduğunu belirtmek gerekir. Dahili olarak gizlenmiş API'leri kontrol etmek / bunlara erişim sağlamak için başka bir "hack".


5
dahili bir sınıfta public metotları bildirebilir miyim ..?
NoviceToDotNet

Hayır, çünkü bu bir çatışmaya neden olur. Derleyici size bunu söyleyecek ve derleme yapamayacaktır.
Program. X

14
@ Program.X: Aslında yapabilirsiniz ve derleyici size hiçbir şey söylemiyor.
OR Mapper

Aslında bu bir özellik olup olmadığına bakılmaksızın buraya geldim. Sınıfı internalve tüm yöntemleri yaptığınızı hayal edin public. Daha yüksek görünürlük istiyorsanız, tüm sınıfı publicyeniden ayarlayabilirsiniz . Ama bu şekilde kullanılması gerekip gerekmediğinden emin değilim. Bu yüzden googling yapmaya devam ediyorum ... Et
voilà'yı

31

internalbir üye bildirmek istediğinizde veya bir DLL'nin içine yazmak istediğinizde, bunun dışında değil ...
normalde, Publicdiğer DLL'lerden erişebileceğiniz gibi bir üye bildirdiğinizde kullanışlıdır . ancak, bir şeyi sınıf kitaplığınızın içinde herkese açık olarak ilan etmeniz gerekirse, olarak ilan edebilirsiniz Internal.
resmi savunmada: iç üyeler sadece mevcut meclisin içinde görülebilir ...


11

internalbirim testleri yazarken de kullanışlıdır. InternalsVisibleToÖzellik montaj Kodunuzdaki en senin testi düzeneği erişim iç yöntemler sağlar. Yani, dış dünyaya özel görünen yöntemleri yansıma kullanmadan test edebilirsiniz.


6

Halka, meclisin dışından da erişilebilir. Dolayısıyla, erişilmemesi gereken bir sınıfa sahip olduğunuzda, derlemedeki her sınıfa erişebilmeli, o zaman iç doğru olan şeydir. Dışarıdan erişime ihtiyacınız varsa, genel kullanın.


4

Ayrıca, olarak işaretlenen özellikler WPF'de DataBinding için kullanılırsa internalbir atar BindingExpression path error. Bu nedenle public, DataBinding aynı derlemede yer aldığında bile bunların düzgün çalışması için olması gerekir.


1

Genel olarak, publicyöntemler, sağlamlık (kötü giriş nedeniyle verilerin çökmemesi veya bozulmaması) ve güvenlik bilinci (beklenmedik girdinin bir istismarı tetiklemesine izin vermemesi) için çok yüksek standartları karşılamalıdır. Ancak yöntemler ve yöntemler için internal, daha esnek standartların izlenmesi genellikle mantıklı olacaktır, çünkü kişi her yöntemin hangi girdileri alabileceği üzerinde tam kontrole sahiptir.protectedprivate

Bir publicyönteme (muhtemelen harici bir kaynaktan) aktarılan parametreler, kişinin kendi derlemesinden alınan parametrelerden daha az güvenilir olarak kabul edildiğinden public, olarak işaretlenen yöntemler , kod çözümleyicileri tarafından , aksi takdirde olarak işaretlenen aynı yöntemlerden farklı şekilde ele alınır internal. Örnek olarak, bir publicyöntemle, analizör sizi yöntemin parametrelerinin boş olmadığını kontrol etmeniz için uyarabilir. İle internalyöntemlerde, konuda daha az sıkı olmasını analizörü yapılandırmak mümkün olabilir nullkontrol. Veya analizör, montaj için tüm kaynak dosyalarının akış analizini yaparak kendi başına belirleyebilir.nullhiçbir zaman belirli bir yönteme bağımsız değişken olarak aktarılmayacaktır ve böylece parametrenin olup olmadığını kontrol etmeye gerek olmadığını belirler null. Farklı şekilde tedavi eden publicve internalyöntemler kullanan birçok başka analizör örneği vardır .

Doğru erişim değiştiricileriyle sınıfları, yöntemleri, özellikleri, alanları, arayüzleri vb. Doğru şekilde işaretleyerek, kod analizcilere amacınızı doğru şekilde işaretlersiniz ve ardından analizör size daha uygun uyarı mesajları ve tavsiyeler verebilir.


-3

Derlemeye dışarıdan Referans verebilirseniz, Dahili ve genel sınıfların kapsamına sahipsiniz

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.