C # yöntemlerinde döndürülen değişkenleri bildirme ve değeri doğrudan döndürme


17

Dönüş değişkenleri ile ilgili bir tartışmada, ekibin bazı üyeleri sonucu doğrudan arayana döndürmek için bir yöntem tercih ederken, diğerleri daha sonra arayana döndürülen bir dönüş değişkeni bildirmeyi tercih eder (aşağıdaki kod örneklerine bakın)

İkincisi için argüman, kod hatalarını ayıklayan bir geliştiricinin yöntemin arayana dönmeden önce dönüş değerini bulmasına ve böylece kodun anlaşılmasını kolaylaştırmasına izin vermesidir: Bu özellikle yöntem çağrılarının zincirleme bağlandığı yerlerde geçerlidir.

En etkili olan ve / veya bir stili diğerine göre benimsememizin başka nedenleri var mı?

Teşekkürler

    private bool Is2(int a)
    {
        return a == 2;
    }

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }

11
Her iki örnek de aynı IL'yi derleyecektir. İkinci örneği istemenizin tek nedeni hata ayıklama amacıyla veya resultgeri göndermeden önce kullanmanız gerekip gerekmediğidir .
ChrisF

1
Başka bir neden, sonucu hesaplamak ve geri döndürmek arasında başka bir şey yapmanız gerektiğidir.
tdammers

1
@ChrisF, aslında benim için aynı IL'ye derlemiyorlar (ek stloc.0ve ldloc.0ikinci versiyonda var). Ama bunun sadece Hata Ayıklama modunda olduğunu düşünüyorum. Zaten burada gerçekten önemli değil.
svick

@svick - Tamam - "yayınlama modunda"
eklemeliydim

1
Eğer görünüyor gibi olması gereken (kısa olması için) yazma şey bazen can ve yana: a = b = c;ve a == b == c, bir şey yazmaya önleyeceğini görünüyor gibi a = b == ceğer yapabilirsen. Böyle bir kod satırı ilk gördüğümde, neler olduğunu anlamak birkaç saniyemi aldı. Bu kod göze çarpıyordu. Parantezin etrafında tokat atmak isterdim a == 3, ancak StyleCop hoşlanmıyor - bir numaralı sürümü kullanmak için iyi bir neden. Başka bir şey: bu aslında bir lambda gibi a => (a == 3). Neden zaten şişirilmiş önemsiz bir işleve bir kod satırı eklemelisiniz?
İş

Yanıtlar:


7

Resharper'ı Visual Studio ile kullandığım için, Ctrl-RV (Resharper / IntelliJ anahtar bağlamaları kullanıyorsanız Ctrl-Alt-V) ilk örneğinizi ikinci örneğinize dönüştürür. Bu yüzden hata ayıklamak istediğimde bunu kolayca yapabilirim. Ve eğer geri koymayı unutursam, o zaman kötü hissetmeyeceğim, çünkü Ctrl-RI okumayı kolaylaştırmak için tekrar geri koyacaktır.

Cidden, daha önemli şeyler hakkında tartışarak zaman kaybet. Önde gelen parantezlerinizi veya boşluklarınızı sekmelere vs nereye koyacağınız gibi.


5
Tartışmalarımın görünmez karakterler hakkında olmasını tercih ediyorum ...
ChaosPandion

Harika bir ipucu, çocuklar! Artık birbirimizin kodunu daha önce olduğundan çok daha hızlı bir şekilde yeniden çarpanlarına ayırabiliriz. Muhtemelen tartışmaktan daha fazla zaman kazanacaktır! :)
pb01

@pdr bu ctrl + RV sadece yeniden paylaşıcı ile çalışır mı? ya da bir çeşit özel tuş takımı mı? benim için çalışmıyor.
Jane Doe

@ JaneDoe: Ben bir Resharper refactoring olduğunu ve VS eşdeğeri olmadığını bulmak için şaşırdım. Yanıt düzeltildi. Bunun için üzgünüm.
pdr

@ChaosPandion U + 200B kazanmak için!
Jesse C. Slicer

20

Şahsen ben ilk örneği okumayı daha kolay buluyorum. Geri dönüş ifadesinde bir kırılma noktası ayarlayıp a == 2izleme penceresine ekleyerek veya hızlı izleme kullanarak hata ayıklayabilirsiniz .

Ama bu gerçekten kişisel bir tercih meselesi. Her iki sürüm de uygundur.


8
+1, kesme noktalarını yerleştirmeyi kolaylaştırmak için kodu okumakta zorlanıyor, imho
jk'de

İzleme penceresi veya ara pencere her zaman bu sorunun çözümü değildir, çünkü bazen ifade iş parçacığının çalışmasını gerektirir.
JustAnotherUserYouMayKnowOr

@JustAnotherUserYouMayKnowOrNot: Evet. Ayrıca, bir kesme noktasından hata ayıklama penceresine bir ileti yazdırma olanağı da vardır. Kesme noktasını sağ tıklayın ve "Vurulduğunda ..." seçeneğini seçin.
Olivier Jacot-Descombes

Ayrıca ifadenin yan etkileri olabilir, tekrar çalıştırılması sorunlara neden olabilir. Sonuç var ile daha iyi sopa var.
JustAnotherUserYouMayKnowOrNot

1
Hata ayıklayıcılar, neden zaten getirinin üzerine geldiğinizde bir değer görmenize izin vermiyor? Sanki yığının üstünde.
candied_orange

10

Kod örneğiniz kadar kolay okunabilir olduğunda, gibi bir mantıksal işlemin sonucunu döndürmekle ilgili bir sorun yoktur return a == 2. Ancak, dönüş değeri daha karmaşık bir ifadeyse veya

return a > 2? doOptionA().getResult() > makeDecision("greaterThan2") : doOptionB().getResult() == makeDecision("lessThan2");

daha sonra okunabilirlik amacıyla değişkenleri önce bunları saklamak ve dönüş ifadesini basitleştirmek için değişkenler kullanmak istersiniz.


2

Bunun gibi basit bir örnekte, her ikisi de tamamdır.

Daha karmaşık örnekler için ikinci yolu tercih ederim. Bu sadece daha okunabilir olduğundan ve diğerleri muhtemelen kodu korumak zorunda kalacaktır.


Sadece resultkendisinden tamamen açıklayıcı olmayan ve işe yaramaz bir tanımlayıcı olan daha iyi bir değişken adı varsa .
Alexander - Monica'yı eski
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.