2016-04-01 25 views
3

parametreleri geçmiyorsa, bunun basit bir soru olduğunu umuyorum ve sadece bu son bağlantıyı eksik olan beynim. Ve başka bir yerde & varsa, lütfen beni oraya yönlendir ve kapat ... ama hiçbir yerde bulamadım. Ben çok iyi, bugüne kadarC# bu parametreler isteğe bağlı

public class Test 
{ 
    public void Method(string required, string someoptionalparameter="sometext", string anotheroptionalparameter="someothertext") 
    { 
     // do something here with the parameters 
    } 
} 

çizgisinde bir isteğe bağlı parametreleri ile yöntemle, bir şey ile bir sınıf var

: Burada

özü buydu.

... 
Test.Method("RequiredString"); 

ve bu çalışacaktır:

Şimdi, sınıf örneğini ve benim kodda yöntemi çağırmak için gidiyorum. İsteğe bağlı parametreler sağlarsam, yine de çalışır.

Ancak, isteğe bağlı bir değerin gerçekte sağlanmış olup olmadığını bilmediğim bir senaryoyu nasıl ele alırım. Yani örneğin:

... 
Test.Method(requiredString,optionalString1,optionalString2); 
... 

Ne optionalString1 ve optionalString2 bir değere sahip olmadığını ben bilmiyor yaparsanız? Sonra ... çizgisinde her senaryo için geçersiz kılma yazmak için

if (optionalString1.isEmpty() && optionalString2.isEmpty()) 
{ 
    Test.Method(requiredString); 
} 
else if ((!optionalString1.isEmpty() && optionalString2.isEmpty()) 
{ 
    Test.Method(requiredString, optionalString1); 
} 
else if... 

ihtiyaç mı var başka bir yolu olmalı ve bunu basit bahis ve ben sadece bu Cuma birini yaşıyorum .. ...

+0

[Bu] bakınız (http://stackoverflow.com/questions/199761/how-can-you-use-optional-parameters-in- c) sorgunuza benzer gibi görünüyor. – fujiFX

+0

Teşekkür ederiz, @fujiFX. Bunu daha önce okumuştum, ama o kadar da değil. Düşündüğüm, isteğe bağlı bir formda bir tedarikçi alanı vardı, ancak "MySupplier" varsayılan değerine sahip. Dolayısıyla, tedarikçi değişkeni olmadan yöntemi çağırırsam, bu alanı "MySupplier" ile veritabanında çalışır ve doldurur. Ancak, eğer tedarikçi doldurulmazsa ve yöntemime "" geçerse. Ardından alanı "" ile doldurmak yanlış olur. "MySupplier" olmalı ... bu mantıklı mı? – ToshiBoy

+0

IMO, varsayılan değerin geçip geçmediğini (çağrıdaki değer atlandı) bilmeniz gerekiyorsa, isteğe bağlı parametreler kullanmamalısınız - anlamlı bir varsayılan değer olduğunda bunlar içindir. –

cevap

4

Mantığı tersine çevirmelisiniz - bu isteğe bağlı parametrelerin boş olması ve sonra da yöntemde denetimler yapması gerekir. gibi bir şey olmalı davanız yönteminde Yani:

public void Method(string required, string opt1 = null, string opt2 = null) 
{ 
    opt1 = opt1 ?? "some default non-null value if you need it"; 
    opt2 = opt2 ?? "another default value, this one for opt2"; 

    // for those not knowing what it does ?? is basically 
    // if (opt1 == null) { opt1 = "value"; } 

    //... rest of method 
} 

Sonra bu yöntemi çağırmak dışında kodunda daha kolay olacak ve yöntemi içinde mantık boş davalarını mümkün olacak. Yöntemin Dışında sen gibi yöntemini istediğiniz şekilde çağırabilir yani, bu ekstra parametreler hakkında endişelenmenize gerek yoktur:

Ayrıca
Test.Method(requiredString); 
Test.Method(requiredString, "something"); 
Test.Method(requiredString, null, "something else"); 

@Setsu yorumunda söylediği gibi sen null adlı geçirmeden önlemek için bu yapabilirdi ikinci parametre olarak:

Test.Method("required", opt2: "thanks @Setsu"); 
+1

Arama kodu – Setsu

+0

Awesome, @ kape123 ve @Setsu! 'Da ikinci null parametresinden kaçınmak için adlandırılmış argümanları kullanabilirsiniz. Bu benim düşüncemde düğümdü. – ToshiBoy

-2

İsteğe bağlı parametreler, isteğe bağlı. Bir yöntem için sahip olduğunuz aşırı yükleme sayısını azaltmanın bir yolu gibi görünüyor. Her üç parametreyi de alırsanız, ikinci veya üçüncü parametrelerin boş olup olmadığına ve "varsayılan" değerlerine ayarlanmasına gerek olup olmadığına karar vermelisiniz.

Benim önerim, üç dizeyle yönteminizi çağırır ve iki ve üçlü dize için değerleri değiştirmeniz gerekiyorsa yönteme karar vermenizdir. Muhtemelen bir const veya varsayılan değerler yerine salt okunur kullanırdım.

+0

Öneriniz yanlış olur ve isteğe bağlı parametrelerin tüm nedenini alt eder. Eğer *, üç dizeyle * aramak için * seçeneğiniz varsa ve değiştirilmeleri gerekip gerekmediğine karar verirseniz, isteğe bağlı parametreler kullanmıyorsunuz, çünkü hala üç dizeyi de geçmek zorundasınız. –

+0

Belki de, sizin düşünceniz. Ancak, bağımlılık enjeksiyonu kavramını izlemeyi denerseniz, çağrı yöntemi, alma yönteminin aldığı verilerle ne yapacağına karar vermemelidir. İsteğe bağlı parametreler, yöntemin arabirimini de değiştirir. yöntem (param1) metottan farklı bir imzası vardır (param1, param2 = null, param3 = null), bu yüzden benim için bir kullanım durumunuz olmadığı sürece sınırlı bir değere sahiptir. OP'nin bunun için geçerli bir kullanım durumu olduğuna inanmıyorum. – Doug

+0

Kesinlikle haklısınız. Benim düşüncem% 100 yanlış ve bu yüzden cevabını düşürdüm. Bu sitenin tam olarak nasıl çalıştığını; Yanlış olduğunda, reddedilirsin. Bunu yapmak için hiçbir yükümlülüğüm olmamasına rağmen neden böyle yaptığımı açıklamak için kibar davrandım. –

-1

Kullanım yerine boğan, bu size daha iyi semantiğini verir ve durumda kullanmak aşırı emin olmak istediğiniz müşteri kodu beri parametrelerini tahmin yanında, tüm makine gerekecek tek bir yerde, bu tekniği kontrol edin, umarım bu yardımcı olur.

sınıf Programı {

static void Main(string[] args) { 
    Work("Hi!"); 
    } 

    private static void Work(String p1) { 
    Work(p1, null, null); 
    } 

    private static void Work(String p1, String p2) { 
    Work(p1, p2, null); 
    } 

    private static void Work(String p1, String p2, String p3) {   
    if (String.IsNullOrWhiteSpace(p2)) p2 = String.Empty; 
    if (String.IsNullOrWhiteSpace(p3)) p3 = String.Empty; 

    Console.WriteLine(String.Concat(p1, p2, p3));   
    } 

}

+0

Arayan sadece "p3" tedarik etmek istiyorsa ne olur? Eğer işlevi yeni bir opsiyonel parametre olan 'p4' ile genişletmek istersek? Yaklaşımınız hızlı bir şekilde kod bloğuna yol açıyor ve C# 'da aşırı yüklenmenin ne kadar kullanılması gerektiği değil. – Setsu

+0

Yukarıdaki örnekte, son argüman, ilk argümana yapılan çağrıyı üstlenme olasılığı olmadan gösterilir, eğer sonsuz parametreler göz önüne alındığında, eğer ilk parametreye bağlı kalmak istersem, kesinlikle farklı bir çözüm sağlayabilirdim. tekniği. –

+0

Aşırı yükler olarak kabul ettim, ama 80 parametreye kadar olan yöntemlerim var, bu yüzden her bir parametrenin mevcut her bir kombinasyonu için aşırı yüklenmeler yazmak zorundayım ... o da işe yarayacaktı, ama pratik değildi. CarlosAlbertoFloresOnofre – ToshiBoy

İlgili konular