2011-02-09 18 views
18

C#, statik üyelere 'örnek üyelermiş gibi' erişmenize izin vermediğine sevindim. o Eğer türetilmiş türleri 'üzerinden' statik üyeleri erişmesine izin yapar Öte yandanKalıtsal üyelere "yoluyla" miras alınan türlere erişmek neden yararlıdır?

Thread t = new Thread(..); 
t.sleep(..); //Probably doesn't do what the programmer intended. 

: Bu Java yaygın hata önler. Operatörler dışında (sizi yazım dosyalarından kurtarır), bunun gerçekten yararlı olduğu durumlar hakkında hiçbir fikrini düşünemiyorum. Aslında, bu aktif gibi hatalar teşvik:

// Nasty surprises ahead - won't throw; does something unintended: 
// Creates a HttpWebRequest instead. 
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com"); 

// Something seriously wrong here. 
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2); 
Şahsen ben bilmediğiniz API'leri (ı ifade ağaçları ile kapalı başlayarak hatırlıyorum Yolumu arıyorum ne zaman tekrar tekrar benzer hataları işlemekle tutmak

; editör BinaryExpression. vurmak ve neden IntelliSense'in bana bir seçenek olarak MakeUnary teklif ettiğini merak ediyordum. Benim (miyop) Sizce

bu özellik:

  1. ayrıntı azaltmaz mı; Programcı, bir tür adı veya başka bir yol belirtmelidir (geçerli türün devralınan statik üyelerine erişirken, operatörler ve durumlar hariç).
  2. Yukarıdaki gibi hata/yanıltıcı kodları teşvik eder.
  3. Programlayıcıya, C# 'daki statik yöntemlerin, kullanmadıklarında bir çeşit' polimorfizm 'sergilediğini önerir.
  4. (Minör) Yeniden silmede olasılıkla kasıtsız olarak yeniden ortaya çıkma olasılıklarını 'sessiz' olarak verir.

(IMO, operatörler kendi tartışma garanti özel bir durum vardır.)

C# normalde dil bir "başarı çukur" olduğunu göz önüne alındığında, neden bu özellik vardır? Avantajlarını (IDE'de her zaman çözülebilen 'keşfedilebilirlik' dışında) göremiyorum, ancak birçok sorun görüyorum.

+3

Veya daha kötüsü, 'UTF8Encoding.ASCII'. – SLaks

+1

Biraz yanıltıcı olabileceğini kabul ediyorum, ancak * kalıtsal üyelerin türetilmiş tip * üyeleri olarak ele alındığı ilkesiyle tutarlıdır.Açıkçası, bu kalıbın kısıtlı tip parametrelerine izin vermediğini, çünkü gerçekten potansiyel olarak oldukça yanıltıcı olduğunu unutmayın. Ayrıntılar için http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx adresine bakın. –

cevap

7

Bunun bir yanlış anlaşılma olduğunu kabul ediyorum.

ASCIIEncoding.ASCII 

vs ... infaz açısından zararsız iken kod okuma açısından yanıltıcı olduğu,: ı Yığın taşması birisi kodunu gönderdi ne sıklıkta bilmiyorum.

C# takımının bu ve diğer stil sorunları için süper-ayrıntılı bir uyarı modu oluşturabileceğini tahmin etsem de, şimdi bu "özelliği" kaldırmak için artık çok geç.

Belki C# 'ın halefi ...

+0

Aslında, sadece [bir kez] (http://stackoverflow.com/questions/4252426/webclient-unicode-which-utf8) SO üzerinde gördüm. – SLaks

+0

StyleCop bunları yakalamaya çalışabilir. – SLaks

+3

Beğen @SLaks, 'UTF8Encoding.ASCII' bile daha kötü – digEmAll

2

Bu WinForms yararlıdır şeyler artıracaktır.

herhangi bir kontrol veya formda

, sen MousePosition, MouseButtons veya ModifierKeysstatic üye Control miras kullanmayı yazabilir.

İyi bir karar olup olmadığı hala tartışmalıdır.

+1

Bir sınıf yazmak için örtük bir bağlam bağlamında "devralınan" statik üyelere erişiminiz olabilir, ancak bir tür adı belirlerken * onlara erişemezsiniz * Doğru olandan başka. –

+0

Doğru. Bunun için herhangi bir kullanım düşünebileceğime emin değilim. – SLaks

+0

Jon'a katılıyorum, bu iki şey biraz ortogonal. Sessiz yeniden bağlama sorunu hala var olsa da, bu WinForms'ta küçük ve olası bir olasılıkla olmasa da. – Ani

İlgili konular