2012-12-11 22 views
31

Birisi bu kodun folye çıkışını nasıl ürettiğini açıklamaya çalışır mı? isteğe bağlı parametre ileYöntem Geçersiz Kılma ve İsteğe Bağlı Parametreler

using System; 

namespace ConsoleApplication1 
{ 
    class Test 
    { 
     public override string ToString() { return "ToString override"; } 
     public string ToString(string optional = "") 
      { return String.Format("ToString with optional parameter {0}", optional); } 
    } 

    class Test2 
    { 
     public new string ToString() { return "ToString new"; } 
     public string ToString(string optional = "") 
      { return String.Format("ToString with optional parameter {0}", optional); } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test one = new Test(); 
      Test2 two = new Test2(); 
      Console.WriteLine(one); 
      Console.WriteLine(one.ToString()); 
      Console.WriteLine(one.ToString("foo")); 
      Console.WriteLine("--"); 
      Console.WriteLine(two); 
      Console.WriteLine(two.ToString()); 
      Console.WriteLine(two.ToString("bar")); 
      Console.ReadKey(); 
     } 
    } 
} 

.ToString yüzdesel

.ToString isteğe bağlı bir parametre gıda v

.ToString

-

ConsoleApplication1.Test2

Console.WriteLine (bir)

Bu WriteLine(object) kullanacağız: genel ilgi var gibi burada hızlı bir versiyonu,

+3

Hangi satırı anlamıyorsunuz? (Tüm bunlar hakkında ayrıntıya girmek sıkıcı olurdu.) –

+0

Temel olarak, aynı imzaya sahip olduklarından, derleyicinin farklı yöntemler arasında nasıl seçtiği. – pneuma08

+1

Aynı imzalara sahip değiller ... ve tekrar söylediğinizde * hangilerine takıldığınızı söylerseniz yardımcı olur. Aşırı yük çözünürlüğünün nasıl çalıştığını anlamaya ne kadar var? Bu arada, C# 4.5 diye bir şey yok. –

cevap

49

Tamam isteğe bağlı parametre bar ile yeni

ToString ToString sırayla,sanal yöntemini yürütecek olan aşırı yükleme, One'da geçersiz kılınmış - dolayısıyla ToString override

çıktısı

Console.WriteLine (one.ToString())

Bu One bakmak ve yöntemler yeni ilan yöntemler var göreceksiniz - indirim geçersiz kılmaları. Uygulanabilir olan tam olarak böyle bir yöntem var - isteğe bağlı parametre olanı. Böylece, varsayılan değeri kullanarak, ToString with optional parameter çıktısına yol açıyor.

Console.WriteLine (one.ToString ("foo")) yine aynı

ancak derleyici varsayılan değeri kullanmak gerekmez bu sefer dolayısıyla ToString with optional parameter foo

Konsol. WriteLine (iki)

Yine, bu WriteLine(object) sanal object.ToString() yöntemi çağırır. Yöntem geçersiz kılınmamış, bu nedenle türün adını döndüren varsayılan uygulama kullanılır ve ConsoleApplication1.Test2 çıktısına yol açar.

Console.WriteLine (two.ToString())

derleyici değil ağır basan sanal yöntemlerdir hangi Two beyan tüm yönteme bakar. Bu durumda, iki tür yöntem vardır - parametresiz olan ve isteğe bağlı parametre olanı. Bir temel sınıf yöntemini geçersiz kılmak yerine, yeni olduğu için parametresiz bir eklenmiştir.

Parametre olmayan yöntem "daha iyi" bir aday olarak kabul edilir, çünkü derleyici, herhangi bir isteğe bağlı parametrenin doldurulmasını gerektirmeyen bir yöntemi çağırmayı tercih eder.Bu nedenle çıkış ToString new

Console.WriteLine (two.ToString ("çubuk"))

Yine derleyici Two bildirilen tüm yöntem bakar değildir üste sanal yöntemlerdir. Bu durumda, bu tür iki yöntem vardır - ancak parametresi olmayan, yalnızca isteğe bağlı parametreyle bırakılarak uygulanabilir değildir. o yine de bir argüman var olarak derleyici, kullanım burada isteğe bağlı parametre varsayılan değeri gerekmez ... yani çıkış çok daha bu konuda için ToString with optional parameter bar

, C# dili şartname okuma - ya Yarım yollu bir ev için, article on overloading numaralı telefonumdan bakın.

+3

sıkıcı gerçekten, ama bilgilendirici, teşekkürler açıklayan muhtemelen Jon Skeet gelen belirsiz çan çalıyor Jon (her zamanki gibi). Herşeyi halletmeye yavaş yavaş yaklaşıyordum. Ana potansiyel sürpriz noktaları, 'object.ToString()' nesnesini kullanması ve nesnede 'ToString'i kullanmaması ve yeni tanımlanmış yöntemleri kalıtsal olanlara tercih etmesidir. –

+0

İyi şeyler onları yazmak için önce bana ... – Chris

+71

İyi Guy Jon Skeet: "Onlarla ilgili ayrıntılara girmek çok yorucu olur" der, hepsi hakkında ayrıntılı bilgi alır. – Rawling

İlgili konular