2009-03-09 28 views
13

birisi kodlama düşünün şunlardır:C# derleyicisi Geliştirme Öneri

string s = "SomeString"; 
s.ToUpper(); 

Hepimiz dönen dize hiç ele çünkü yukarıdaki örnekte, yöntem “ToUpper()” çağrısı anlamsız olduğunu biliyoruz . Ama yine de, birçok kişi bu hatayı yapıyor ve problemin ne olduğunu sormaya çalışırken, “Neden benim‘ ’değişkenimdeki karakterler neden büyük harfle yazılmıyor” diye soruyor.

Geri dönüş nesnesi ele alınmazsa bir derleyici hatası verecek “ToUpper()” yöntemine uygulanabilecek bir özellik varsa, bu harika olmaz mıydı? Doğru kullanıcı derlemek için bu kodu için sipariş böyle dönüş değeri işlemek zorunda kalacak olursa

[MustHandleReturnValueAttribute] 
public string ToUpper() 
{ 
… 
} 

: aşağıdaki gibi bir şey

string s = "SomeString"; 
string uppers = s.ToUpper(); 

Bence bu kristal berraklığında yapmanız gerekir olduğunu yapacak dönüş değerini işlemek, aksi takdirde bu işlevi çağırmak için yoktur.

Dize örneği söz konusu olduğunda, bu büyük bir sorun olmayabilir, ancak bunun neden daha kullanışlı olacağını düşünmek için başka geçerli nedenleri düşünebilirim.

Siz ne düşünüyorsunuz?

Teşekkürler.

+0

Bunu daha önce yaptım, +1 –

+0

@Rene: geçerli point, +1 – Codex

cevap

8

Yan etkileri, dönüş değeri veya her ikisi için bir yöntem mi deniyor? “Saf” işlevler (hiçbir etkisi olmayan ve yalnızca bir dönüş değeri hesaplamaya hizmet eden), hem tanımladığınız hatanın türünü ortadan kaldırmak hem de bazı potansiyel optimizasyonları/analizleri mümkün kılmak için, böyle bir açıklama ekleyebilir. Belki bir 5 yıl sonra bunu göreceğiz.

(F # derleyici örtük bir dönüş değeri görmezden her zaman uyaracaktır unutmayın. Açıkça bunu görmezden istediğinizde 'görmezden' işlevi kullanılabilir.)

+0

'Saflık' açıklamaları kavramının genelleştirilmesi iyi olurdu, çünkü derleyici daha fazla optimize edebilir. C++ const anahtar kelimesine benzer şekilde, gerçekten. – Thomas

+0

Ayrıca, bir [Pure] notu eklemek, insanların aşağıdaki işlevleri hakkında konuştukları ve yan etkilere önem vermedikleri sorunları çözecektir. Sanırım, yazarın gerçekten böyle geçtiği şey buydu. – Mason

0

En azından bir derleyici uyarısı yardımcı olabilir. Belki de C# 4.0 (Design-By-Contract) için benzer bir şey eklerler.

+0

Bir hata hakkında uyarı almak isterim. Kodu birlikte atacak olursanız, örneğin kodu çalıştırmanızı engellemek istemezsiniz. – Andy

+0

Sözleşmeye göre tasarım, önkoşullar, posta koşulları ve değişmezlerle ilgilidir. Döndürülen değerlerin nasıl kullanılabileceği/kullanılması gerektiği ile ilgili terimleri ayarlama hakkında değil. –

0

Bu uyarı için garanti etmez veya pragma. Sonucun atılması amaçlanan çok fazla yer var ve yöntem bir kaç dodge özniteliği ile süslendiği için derleyiciden bir uyarı/hata almaktan oldukça rahatsız olurdum.

Bu tür bir 'uyarı', IDE Düzenleyicisi'nde, "Uyarı: Geri dönüş değeri atılıyor" veya benzeri gibi küçük bir simge gibi açıklamalıdır.

2

Bundan hoşlandığımdan emin değilim. Pek çoğunu yakalamamayı seçtiğim bir değeri veren bir yöntem çağırdım. Bir tür varsayılanın eklenmesi (derleyici bir iade değeri ele alınmadığında bir uyarı üretir) sadece bana yanlış görünüyor.

Önerilen satırlardaki bir şeyin yeni programcılara yardımcı olabileceğine katılıyorum, ancak oyunda bu noktada bir özellik eklemenin yalnızca mevcut olan büyük gövdeye göre çok az sayıda yöntemi etkileyeceğine katılıyorum. Aynı küçük programcı, işlenmemiş geri dönüş değerlerinin çoğunun derleyici tarafından işaretlenmediği zaman, başını konuya hiçbir zaman sokmayacaktır.

Atlar ahırdan çıktığında ne zaman iyi bir yol olabilirdi.

+0

Bir özellik eklemek biraz fazla olabilir, ancak derleyicinin neden "Kodun etkisi yoktur" uyarısını veremeyeceğini anlamıyorum. –

+0

Benim için sorun geçerli bir yapıya sahip olduğunuzu ve bir uyarı oluşturduğunuzu gösteriyor. Evet, kafa karıştırıcı olabilir, ancak geri döndürülen değeri yakalamadan değerleri her zaman döndüren yöntemleri kullanırım. – andleer

+0

bool DoStuff() {doStuff(); eğer (başarı) doğruysa; yanlış dönüş; } DoStuff() öğesini çağırırken, başarı veya başarısızlık umurumda olmadığı zamanlar olabilir. Sonuçları kontrol etmeye gerek yok, hatta geri döndüklerini düşündüler. Diğer zamanlarda, emin olabilirim. – andleer

6

Eğer Resharper varsa sizin için bu gibi şeyler vurgulayacaktır. Yeniden paylaşmayı yeterince yüksek tavsiye edersiniz, özellikle refactoring etrafında birçok yararlı IDE eklemesi var.

http://www.jetbrains.com/resharper/

1

Aslında bayrağa [Immutable] gibi bir yapı veya sınıf bir yolunu tercih ve bu değişmez nesneler üzerinde dönüş değerlerini kullanmadan denilen yöntemleri için (bir uyarı ile) otomatik olarak işlenir olurdu. Bu, aynı zamanda, nesnenin oluşturulduktan sonra değişiklikten derleyiciyi de koruyabilir. Nesne gerçekten değişmez bir nesneyse, bunun üstesinden gelmenin hiçbir yolu yoktur. Ayrıca diğer yaygın hataları yakalamak için derleyiciler tarafından kullanılabilir. yöntemini kendisi etiketlenmesi

olsa, bana pek kullanışlı görünüyor. Bununla ilgili diğer yorumların çoğuna katılıyorum. Nesnenin değişebilir olması durumunda, bir yöntemin çağrılması diğer yan etkilere sahip olabilir, bu nedenle yukarıdaki kod tam olarak geçerli olabilir.

1

Tüm printf() çağrılarında (void) yayınlama için flashback'ler yapıyorum çünkü Lint'in göz ardı edilen geri dönüş değeri hakkında kapanmasını sağlayamadım.

Bu işlevsellik, derleyicinin kendisinden ziyade bir kod denetleyici aracında olması gerektiği gibi görünüyor.