"Özel" anahtar kelimesini C # ile yazmak için herhangi bir neden var mı?


109

Gibi bildiğim kadarıyla, privatevarsayılan her yerde C # (ı yazma yoksa yani public, protected, internalvb öyle olacak privatevarsayılan). (Yanlışım varsa lütfen düzelt.)

Öyleyse, bu anahtar kelimeyi yazmanın nedeni nedir veya üyeler için neden var?

Örneğin, bir olay işleyicisi otomatik olarak oluşturulduğunda şuna benzer:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Ama bu zımni ve varsayılansa neden özel bile yazıyor? Acemi geliştiricilerin (bunun C # varsayılanı olduğunu bilmeyen) özel olduğunu bilmeleri için mi? Veya derleyici için bir fark var mı?

Dahası, "özel" (tek başına) yazma bir durum söz konusudur olacak üyesinin erişilebilirliğini değiştirmek?


18
IIRC, internalvarsayılan olarak "üst düzey" bir tür olacaktır .
Jeff Mercado

4
Her şey için varsayılan, belirtildiği gibi özel değildir ve genel bir kural olarak açık olmak daha iyidir.
James Michael Hare


Her şey için varsayılan, "olabildiğince özel" dir. Açıkçası, iç içe olmayan bir sınıf özel olamaz veya hiçbir şey onu başlatamaz veya kullanamaz. Ancak üyeler varsayılan olarak özeldir ve yuvalanmış sınıflar varsayılan olarak özeldir. C #'daki her şey varsayılan olarak sahip olabileceği en kısıtlı görünürlük düzeyine sahiptir.
Ryan Lundy

Yanıtlar:


171

AFAIK, özel, C # 'da her yerde varsayılandır (yani, eğer genel, korumalı, dahili vb. Yazmazsam, varsayılan olarak özel olacaktır). (yanlışsa lütfen beni düzeltin).

Bu doğru değil. Bir ad alanı içinde tanımlanan türler (sınıflar, yapılar, arabirimler vb.) Varsayılan olarak dahili olacaktır . Ayrıca, farklı türlerdeki üyelerin farklı varsayılan erişimleri vardır (arabirim üyeleri için genel gibi). Ayrıntılar için MSDN'de Erişilebilirlik Düzeylerine bakın .

Ayrıca,

Öyleyse, bu anahtar kelimeyi yazmanın nedeni nedir veya neden var?

Bunu açıkça belirtmeniz, türü çok açık bir şekilde özel yapma niyetinizi belirtmenize yardımcı olur. Bu, kodunuzun zaman içinde korunmasına yardımcı olur. Bu, diğer geliştiricilere (veya kendinize) bir üyenin varsayılan olarak veya kasıtlı olarak özel olup olmadığını bilmenize yardımcı olabilir.


1
@Wayne: Jon Skeet'ten daha yüksek puanlı bir cevabı var ama bunu hak etmiyor ... Jon cevabı çok daha doğru.
aleroot

2
Bu anlamsız bir ayrımdır. Bir ad alanı içindeki türler varsayılan olarak dahilitir çünkü varsayılan olarak özel olamazlar ; aksi halde hiçbir şey onları kullanamaz. Varsayılan olarak hala mümkün olduğu kadar kısıtlıdırlar.
Ryan Lundy

1
İnisde sınıfları ve yapı için varsayılan üye erişilebilirliği özeldir. Burayı kontrol edin: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca

Ancak bir ad alanı içindeki öğeler olamaz private.
Shimmy Weitzhandler

Ayrıca, getve setmülk kendisinin erişilebilirlik varsayılan
AustinWBryan

119

AFAIK, özel, C # 'da her yerde varsayılandır

Tam olarak değil - varsayılan, "bu bildirim için mevcut en kısıtlı erişimdir". Örneğin, üst düzey bir türle varsayılan değer internal; yuvalanmış bir tür için varsayılan değerdir private.

Öyleyse, bu anahtar kelimeyi yazmanın nedeni nedir veya neden var?

Bunu açık hale getirir, bu da iki nedenden dolayı iyidir:

  • Sorunuza göre varsayılanları bilmeyenler için daha net hale getiriyor (kişisel olarak bu argümanı hiç sevmedim, ama bahsetmeye değer olduğunu düşündüm)
  • Bu ettik bir izlenim verir kasten sadece varsayılanlarla gitmiş yerine, özel yapmaya karar verdi.

Son bölümünüze gelince:

Ayrıca, "özel" (tek başına) yazmanın üyenin erişilebilirliğini değiştireceği bir durum var mı?

Evet, bir mülkün yarısını diğerinden daha kısıtlayıcı hale getirmek için:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

Ben kullanılan o bu konuda düşünce ve ettik temizlemek yapma her yerde yapabilirdim varsayılan ile gitmek, ama ben (kısmen Eric Lippert tarafından) ikna oldum karar şey gizli yapmayı iyi bir fikirdir.

Şahsen, bunu tip bildirimleri için mühürlü / mühürsüz için de yapmanın bir yolu olmasını isterdim - muhtemelen bir temerrüdü bile yok . Pek çok geliştiricinin (dikkatli olmazsam kendim de dahil) sınıfları mühürsüz bıraktığından şüpheleniyorum çünkü onları mühürlemek yerine daha az çaba gerektiriyor.


+1. Java geçmişim finaldaha tipik bir örnek kullansa da, anlamsal amaca işaret etmek için başka türlü alakasız anahtar sözcükler kullanmak yararlıdır .
jprete

1
@minitech: Tersi de işe yarıyor, ancak daha az kullanışlıdır. Bunların hepsi C # 2'de tanıtıldı.
Jon Skeet

20
Kesinlikle hiç varsayılan olmamasını ve erişim değiştiricisi eksikse derleyicinin bir hata vermesini isterdim. Çoğu insanın her durum için varsayılanların ne olduğunu bildiğini sanmıyorum, bu da istenmeyen hatalara yol açar.

+1 "iç içe geçmiş bir tür için varsayılan özeldir" - Bunu yalnızca cevabınızı okuduğumda biliyorum. Teşekkürler!
Nordin

5
@Phong, C # için tek bir kolay kural vardır: Varsayılan olarak, her şey olabildiğince özeldir . İç içe olmayan sınıflar gibi bir ad alanındaki öğeler özel olamaz çünkü bunları hiçbir şey kullanamaz. Yalnızca dahili veya halka açık olabilirler; bu nedenle varsayılan olarak dahilidirler. Diğer şeylerin içindeki şeyler (bir sınıf içindeki numaralandırmalar; yuvalanmış sınıflar; özellikler; alanlar; yöntemler ...) varsayılan olarak özeldir.
Ryan Lundy

11

privategörsel dağınıklık ekler. Bunun her şeyi açıklığa kavuşturması konusunda ısrar edenlere soracağım: Bunu matematikle de yapıyor musunuz? Örneğin:

var answer = a + b / c;

Gereksiz parantezler olmadan bunu belirsiz buluyor musunuz b / c?

C # 'daki kural çok basittir: Varsayılan olarak, her şey olabildiğince özele yakındır. Yani , varsayılandan daha görünür olması için bir şeye ihtiyacınız varsa , bir değiştirici ekleyin. Aksi takdirde, kodunuza gereksiz anahtar kelimeler eklemeyin.


1
Soruyu sormadan önce buna katılıyordum. Ancak, bazı insanlar VB, bazıları C ++, hatta bazıları F # (Haskell gibi diğer işlevsel dillerden geliyor olabilir mi?), C #'dakinden daha iyi yazarlar. Bu nedenle, onlar için (ve bizim için 2 yıl boyunca hiçbir bağlantı yapılmadan unutursak), erişimcilerin açık olması daha iyidir. Kolay öğrenmenin bir proje üzerindeki etkisinin değerini küçümsemeyin, pek çok geliştirici tercih edilen aracı yansıtmayabilecek arka plandan gelir ve üretim kodunda bile öğrenme yardımlarına ihtiyaçları vardır, bu hiç de fena değil (ve pek çok çok kötü C # kodu, bu nedenle birkaç yardım da bize yardımcı olur).
Camilo Martin

3
Elbette, VB'de varsayılanlar korkunç. FriendÖrneğin , varsayılan görünürlük üyeler içindir. C #, görünürlük varsayılanlarını doğru şekilde yapar: Öğeler, değiştirilmedikçe mümkün olan en az görünürlüğe ayarlanır. Bulabildiğim kadarıyla, C ++ için de aynı gibi görünüyor (yapılar hariç). (F # için doğru görünmüyor.)
Ryan Lundy

6
Bu kadar çok insanın taraftar olması bana garip geliyor varçünkü görsel dağınıklığı azaltıyor ve yine de pek çok insan anlamsız bir şekilde yazmayı destekliyor private.
Ryan Lundy

2
Hatta görsel karmaşanın okunabilirliği engellediğini iddia edecek kadar ileri gidebilirim !
binki

1
Ben rağmen upvoted do matematik örnek durumunda parantez kullanmayı tercih ediyorum.
Marc. 2377

7

Bildiğim kadarıyla, özel, C # 'da her yerde varsayılandır

Açıkça özel beyan etmek, bunun özel olduğunu bildiğiniz anlamına gelir . Öyle olduğunu düşünmekle kalmaz, çünkü bildiğiniz kadarıyla varsayılandır. Aynı zamanda koda bakan başka birinin onun ne olduğunu bildiği anlamına gelir.

"Öyle olduğunu düşünüyorum", "Eminim öyledir", vb. Yoktur . Ve herkes aynı sayfada.

Ben bir C # geliştiricisi değilim . Açıkça özel olarak beyan edilmeyen bir kodla çalışmak zorunda kalsaydım, muhtemelen dahili olduğunu varsayardım .

İşlerin dolaylı olarak ayarlanmasından hoşlanmam. Açıkça belirlendikleri zamanki kadar net değildir.


Kulağa mantıklı geliyor, bir zamanlar daha iyi bildiğim dillerin temellerini bile unutuyorum.
Camilo Martin

6

Okunabilirlik - Herkes özelin varsayılan davranış olduğunu bilmeyebilir.

Amaç - Mülkü özel olarak özel ilan ettiğinizi açıkça belirtir (herhangi bir nedenle).


5

Okunabilirlik, niyetin gösterilmesi aklıma gelen iki büyük sebep.


Kabul. Örneğin, bir parça kod üzerinde diğer geliştiricilerle çalışıyorsanız, bir şeyi özel olarak ayarlamak amacınızı belirtmenize yardımcı olur. Birkaç yıl sonra kodunuza geri döndüğünüzde de yararlıdır ve IDE'niz o sınıf için hangi yöntemlerin herkesin erişimine açık olması gerektiğini size söyleyebilir.
Aaron Newton

3

Görünürlüğü açıkça belirtmenin iyi bir nedeni, içinde bulunduğunuz bağlam için varsayılanın ne olduğu hakkında düşünmenize gerek kalmamasıdır.

Bir başka iyi neden de FxCop'un size bunu yapmanızı söylemesidir.


+1, FxCop'un değişiklik ile oluşturduğumda özel değiştiriciyi kaldırmamdan şikayet ettiğini fark ettim.
Camilo Martin

2

Pek çok insan (benim gibi insanlar!) Düzenli olarak bir avuç farklı dilde program yapıyor. Bu tür şeylerde açık olmak, programladığım tüm dillerin tüm gizli ayrıntılarını hatırlama ihtiyacımı engelliyor.


1
"Varsayılan erişim değiştiricinin private" gizli bir ayrıntı olduğunu söyleyemem ... Ama meseleyi anlıyorum. Geçen gün, geçen hafta kullandığım çerçevenin ( MEF ) nasıl çalıştığını hatırlamakta zorlandım .
Camilo Martin

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.