2012-01-18 39 views
23

I (modifiye kodu) bu yöntemi vardır:Geçersiz bir yöntemden kurtulun mu?

public static void PublishXmlForCustomTypes(MyOwnClass DefaultOutputInformation) 
{ 
    if (DefaultOutputInformation != null) 
    { 
     ///lot of code 
    } 
} 

ve benim bütün kod eğer deyimi içinde oldu ve bu konuda düşünme sonra, bunu şu şekilde değiştirildi: ben test kadarıyla

public static void PublishXmlForCustomTypes(MyOwnClass DefaultOutputInformation) 
{ 
    if (DefaultOutputInformation == null) 
    { 
     return; 
    } 
    ///lot of code 
} 

Bu, kesinlikle eşdeğer gibi görünüyor, ama gerçekten böyle mi? Yani, "dönüş" ifadesi bizi yöntemden çıkarır mı?

cevap

36

Bu kesinlikle eşdeğerdir ve ikinci versiyon :)

+0

Bunun eşdeğer olmayacağı gizli bir durum yok mu? –

+0

kabul edildi ve geri çekiliyor. IF bloğunuzun kapsamı mümkün olduğu kadar küçükse, kendiniz ve daha sonra bunu sürdürecek olan diğer kişiler için daha kolay, işlevsel olmasa da bir fark yaratmaz. –

+0

@ Jérémy Talio: Hayır, yok. – BoltClock

1

Evet, varsayımlar doğru olup gitmek yoludur.

Bazı arka plan için, duality hakkında bilgi edinin. nasıl çalıştığını

+0

Vikipedi'yi seçtiğiniz tüm sitelerden. –

+0

@AshBurlaczenko: Yarın bu cevap yararlı olacaktır :) – leppie

1

Evet, tam olarak aynı olduğunu, tam anlamak için anahtar kelime iadesi konusunda MSDN belgeleri okuyabilir: http://msdn.microsoft.com/en-us/library/1h3swy84.aspx

iyidir hangi yöne karar vermek gibi: hem iyi, ama ikinci versiyonu daha okunabilir hale getirir çünkü tüm kodunuz bir blok içinde değil. Bu şekilde, yöntemin bütün kodunu okumak yerine durumun gerçekten ne yaptığını görebilirsiniz.

4

evet return yöntemin dışına alır; Bir finally bloğunuz varsa ve try satırından geri dönerseniz, finally bloğu yine de yürütülür.

7

Evet, bu kesinlikle sorun değil. Örneğin, bazı kişiler, her bir yöntem için "bir çıkış noktası" na dogmatik olarak yapışırlar - bu, örneğin C'deki bir fonksiyonun sonunda her zaman doğru miktarda temizlemeyi yaptığınızdan emin olmak için oldukça zor olduğunda uygundur. .. ama C# 'da gerçekten gerekli değil.

Şahsen size bir yöntemde için gerçekten istiyor tüm çalışmaları yaptık biliyorum en kısa sürede dönmek için uygun olduğunu düşünüyorum. Ekstra "temizle ben çıkıyorum" çalışmasını gerçekleştirmek için try/finally veya using ifadelerini kullanın.

+0

Tek-çıkış-noktası-yöntem savunucuları karşı geldim. Sebeplerini anlıyorum, ama bazı ciddi çirkin kodlarla sonuçlanabilir. – ColinE

+0

Şu ana kadar dogmatik insanlardan biriydim, sanırım bir alışkanlık meselesiydi. – ThePower

+0

@ThePower alışkanlığı, hepimize doğal olarak gelen bir şeydir. Onu kırmak için Kudos size ;-) – ColinE

1

Nitekim return yöntemin dışarı alır, bu nedenle kullandığınız ilk yol eşdeğerdir. Genelde ikinci versiyonu tercih etsem de, hangi yol daha iyi kodunuza bağlıdır.

2

Evet, dönüş deyim yöntemi biter.

2

Evet, dönüş sizi kodun dışına çıkaracaktır. Geçilen parametrelerin, olduklarını ve çıktıklarını (geri dönüş veya bir istisna atarak) olduğunu doğrulamak için bir işlevdeki ilk adım olarak genellikle iyi bir uygulamadır, böylece yalnızca gereksiz işlem yapmazsınız. Daha sonra fonksiyonu iptal etmek zorunda.

1

Gözden geçirilmiş kodlara baktığınızda, ikincisi gitmek için bir yoldur. İşlevsel olarak eşdeğer olmakla birlikte, kontrol etmek istediğiniz bir işleve 4 farklı değişkende geçtiğiniz durumu düşünün. Her yerde {'nin bulunduğu 4 seviyeli bir yanlış ifade yapmak yerine, ikinci yöntem kodun görünümünü temizlemenize ve gereksiz parantez seviyeleri eklemenize izin vermez. C/C++ 'da yazıyorsanız, bunu VERYIFY_NOT_NULL (x) gibi bir makro haline getirebilir ve kodu güzel ve düzgün hale getirebilirsiniz.

Okunabilir/sürdürülebilir kod, performansın nano saniyelik zamanının% 99'unu verir.

İlgili konular