ToString'i geçersiz kılmak neden / ne zaman uygun olur?


103

C # üzerinde çalışıyorum ve geçersiz kılmanın ne anlamı ve faydası olduğunu merak ediyorum ToString aşağıdaki örnekte gösterildiği gibi olabileceğini .

Bu, geçersiz kılma olmadan ortak bir yöntem kullanılarak daha basit bir şekilde yapılabilir mi?

public string GetToStringItemsHeadings
{
    get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); }
}


public override string ToString()
{
    string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal);
    return strOut;
}

4
Nesneyi kullanıcı arabiriminde herhangi bir yerde görüntülemek için gerçekten kullanmak isteyip istemediğinize bağlıdır, aksi takdirde genellikle yalnızca hata ayıklama içindir - VS'nin izleme penceresinde ToString çıktısını görürsünüz. (Ama bunu sınıftaki özniteliklerle de elde edebilirsiniz.) Başlıklarınız ve çıktınız olduğu için, bu program onu ​​kullanarak nesneyi Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);veya benzerini kullanarak dışarı atmak için kullanıyor gibi görünüyor .
Rup

2
Soruyu gerçekten anlamıyorum. Farklı bir şekilde yapılabilir mi? Evet. Ama neden farklı yapmak istiyorsun ?
Konrad Rudolph

5
Gerçekten GetToStringmülk adını Console.WriteLine(obj.ItemHeadings)
atlardım

ve ItemHeadings özelliğini herhangi bir "this" e ihtiyaç duymadığından statik olacak şekilde değiştirin.
eFloh

Yanıtlar:


127
  • Geçersiz kılmanız gerekiyor ToStringmu? Hayır.

  • Nesnenizin dize temsilini başka bir şekilde elde edebilir misiniz? Evet.

Ancak ToStringsizi kullanarak tüm nesnelerde ortak olan bir yöntemi kullanıyorsunuz ve bu nedenle diğer sınıflar bu yöntemi biliyor. Örneğin, .NET çerçevesi bir nesneyi bir dizgi gösterimine dönüştürmek istediğinde, ToStringbirincil adaydır (daha ayrıntılı biçimlendirme seçenekleri sağlamak istiyorsanız başkaları da vardır).

Somut olarak,

Console.WriteLine(yourObject);

çağırırdı yourObject.ToString().


13
Evet. Nerede Ayrıca, bu MVC veya ASP.Net gelişiminde çok faydalıdır @yourObjectve <%=yourObject%>"ToString-ed" olacak.
Ben Lesh


3
Böyle uygulamalara dikkat edin. Gerçek hikaye: bir öğrenci, bir dizge döndürmenin yanı sıra verileri değiştiren bir yöntemle ToString'i geçersiz kılar. Programın hatalarını ayıklıyordu, ancak program bir kesme noktasında dururken değer değişmeye devam etti. Görünüşe göre - ToString değerinin çalıştırıldığını her kontrol ettiğinde - bu nedenle program çalışmasa bile değer değişti.
JNF

3
@JNF “Böyle bir uygulama” nedir? ToStringaslında bir nesnenin durumunu değiştirmemelidir. Ama savunduğum şey bu değil.
Konrad Rudolph

8
@JNF Bunu kabul etmiyorum. ToStringolduğu anlamına geçersiz kılınan olmak. Dönem. Bu ifadeye bir uyarı koymak verimli değildir. Yanlış yaparsanız - kendi hatanız. Aslında, öğrenciniz ToStringDavid Anderson'ın cevabında yayınlanan resmi yönergeler listesindeki 4. maddeyi ihlal etti .
Konrad Rudolph

129

Size yanıtı doğrudan .NET Geliştirme Serisindeki Çerçeve Tasarım Yönergelerinden vereceğim .

AVOID istisnalarıToString

CONSIDER , örnekle ilişkili benzersiz bir dize döndürür.

ToStringBu türdeki herhangi bir ayrıştırma yöntemi için geçerli bir girdi çıktısına sahip OLMAYI DÜŞÜN .

GözleToString görülür hiçbir yan etkisi olmadığından emin olun .

DO raporu geçersiz kılma yoluyla güvenlik duyarlı bilgiler ToString, uygun bir izni verilmesi talebiyle sonra sadece. İzin talebi başarısız olursa, güvenlik açısından hassas bilgiler hariç bir dize döndürün.

Object.ToStringYöntem, genel olarak görüntülenmesi ve ayıklama amacıyla kullanılması amaçlanmıştır. Varsayılan uygulama basitçe nesne türü adını sağlar. Varsayılan uygulama pek kullanışlı değildir ve yöntemin geçersiz kılınması önerilir.

DO geçersiz ToStringilginç bir insan tarafından okunabilir dize iade edilebilir zaman. Varsayılan uygulama çok kullanışlı değildir ve özel bir uygulama neredeyse her zaman daha fazla değer sağlayabilir.

DO benzersiz ancak okunabilir kimliği üzerine kolay bir ad tercih ederim.

Ayrıca Chris Sells'in ToStringkullanıcı arayüzleri için genellikle tehlikeli olan yönergelerde de açıkladığı için bahsetmeye değer . Genel olarak benim temel kuralım, bilgileri kullanıcı arayüzüne bağlamak için kullanılacak bir özelliği açığa çıkarmak ve ToStringtanı bilgisini geliştiriciye görüntülemek için geçersiz kılmayı bırakmaktır . Ayrıca türünüzü ile de dekore edebilirsiniz DebuggerDisplayAttribute.

DO dönen dize tutmaya çalışın ToStringkısa. Hata ayıklayıcı ToString, geliştiriciye gösterilecek bir nesnenin metinsel temsilini almak için kullanır . Dize, hata ayıklayıcının görüntüleyebileceğinden daha uzunsa, hata ayıklama deneyimi engellenir.

DO kültür-bağımlı bilgiyi iade ederken dize geçerli iş parçacığı kültürü dayanarak biçimlendirme.

DO aşırı yük sağlamak ToString(string format)veya uygulamak IFormattabledize dönüş eğer, ToStringkültür duyarlıdır veya dize biçimlendirmek için çeşitli yollar vardır. Örneğin DateTime, aşırı yüklemeyi ve uygulamaları sağlar IFormattable.

YAPMAYIN gelen boş bir dize veya return nullToString

Bu kurallara yemin ederim ve yapmalısın. Kodumun sadece bu kılavuza göre nasıl geliştiğini anlatamam ToString. Aynı şey IEquatable(Of T)ve gibi şeyler için de geçerli IComparable(Of T). Bunlar kodunuzu çok işlevsel kılar ve herhangi birini uygulamak için fazladan zaman ayırdığınız için pişman olmayacaksınız.

Kişisel olarak, kullanıcı arayüzleri için asla çok ToString fazla kullanmadım, her zaman bir tür özelliği veya yöntemi açığa çıkardım. Çoğu zaman ToStringhata ayıklama ve geliştirici amaçları için kullanmanız gerekir . Önemli tanı bilgilerini görüntülemek için kullanın.


6
Güzel cevap, bunlar msdn.microsoft.com/en-us/library/ms229042.aspx'e başvurduğunuz yönergeler mi?
Jodrell


6
Daha iyi alıntı gerekli.
Ben Voigt

13
SO'nun Wikipedia'ya dönüştüğünü bilmiyordum.
David Anderson

14
Değil, ancak yönergelerden alıntı yaptığınızda, kaynağı sağlamak inkar edilemez bir artı.
Falanwe

39

Geçersiz kılma ToString(), bir sınıfın kullanışlı bir insan tarafından okunabilir dize gösterimini vermenize olanak sağlar.

Bu, çıktının sınıfınız hakkında yararlı bilgileri ortaya çıkarabileceği anlamına gelir. Örneğin, bir Kişi sınıfınız varsa ToString(), kişinin kimliğini, adını, soyadını vb. Çıktısını almayı seçebilirsiniz . Bu, hata ayıklama veya günlükleme sırasında son derece yararlıdır.

Örneğinizle ilgili olarak - bu sınıfın ne olduğunu bilmeden geçersiz kılmanızın yararlı olup olmadığını söylemek zordur - ancak uygulamanın kendisi iyidir.


13

Her zaman uygundur ancak sergilediklerinizin ardındaki niyetleri dikkatlice değerlendirin

Daha iyi bir soru sormak olacaktır:

ToString () neden geçersiz kılınsın?

ToString (), bir nesnenin durumuna açılan penceredir. Bir gereklilik olarak devlete vurgu . Java / C # gibi güçlü OOP dilleri, bir sınıftaki her şeyi kapsayarak OOP modelini kötüye kullanır. Güçlü OOP modelini takip etmeyen bir dilde kodladığınızı hayal edin; Bir sınıf mı yoksa bir işlev mi kullanacağınızı düşünün. Bunu bir işlev (yani fiil, eylem) olarak kullanırsanız ve dahili durum yalnızca giriş / çıkış arasında geçici olarak korunursa, ToString () değer katmaz.

Diğerleri de söylediğim gibi, dikkate almak önemlidir ne hata ayıklayıcı veya diğer sistemler tarafından kullanılabilir çünkü () ToString ile çıkış.

ToString yöntemini bir nesnenin --help parametresi olarak hayal etmeyi seviyorum. Kısa, okunabilir, açık ve gösterimi kolay olmalıdır. Nesnenin yaptığı şey olmadığını göstermelidir . Tüm bunları akılda tutarak düşünelim ...

Kullanım Örneği - Bir TCP paketini ayrıştırma:

Yalnızca uygulama düzeyinde bir ağ yakalama değil, pcap yakalama gibi daha fazla et içeren bir şey.

Yalnızca TCP katmanı için ToString () 'i aşırı yüklemek istiyorsunuz, böylece verileri konsola yazdırabilirsiniz. Neleri içerir? Delirebilir ve tüm TCP ayrıntılarını ayrıştırabilirsiniz (yani TCP karmaşıktır) ...

Aşağıdakileri içerir:

  • Kaynak bağlantı noktası
  • Hedef Bağlantı Noktası
  • Sıra numarası
  • Onay numarası
  • Veri ofseti
  • Bayraklar
  • Pencere Uzaklığı
  • Sağlama toplamı
  • Acil İşaretçi
  • Seçenekler ( oraya bile gitmiyorum)

Ancak, TCP.ToString () 'i 100 paket üzerinde ararsanız, tüm bu gereksiz dosyaları almak ister miydiniz? Tabii ki hayır, bilgi aşırı yüklemesi olur. Kolay ve açık seçim aynı zamanda en mantıklı olanıdır ...

İnsanların görmeyi bekleyeceği şeyleri ortaya çıkarın:

  • Kaynak bağlantı noktası
  • Hedef Bağlantı Noktası

İnsanların çözümlemesi kolay, ancak YMMV olan mantıklı bir çıktıyı tercih ederim .

TCP:[destination:000, source:000]

Karmaşık bir şey değil, çıktı makinelerin ayrıştırması için değildir (yani, insanlar kodunuzu kötüye kullanmadıkça), amaçlanan amaç insanın okunabilirliği içindir.

Peki ya daha önce bahsettiğim tüm bu sulu bilgilerin geri kalanı, bu da yararlı değil mi? Buna ulaşacağım ama önce ...


ToString () tüm zamanların en değerli ve az kullanılan yöntemlerinden biri

İki nedenden dolayı:

  1. İnsanlar ToString () 'in ne için olduğunu anlamıyor
  2. Temel 'Object' sınıfında aynı derecede önemli başka bir dize yöntemi eksik.

Sebep 1 - ToString'in () faydasını kötüye kullanmayın:

Pek çok kişi, bir nesnenin basit bir dizgi temsilini çekmek için ToString () kullanır. C # kılavuzu bile şunu belirtir:

ToString, .NET Framework'teki ana biçimlendirme yöntemidir. Bir nesneyi gösterime uygun olacak şekilde dizgi temsiline dönüştürür.

Daha fazla işleme değil , görüntüleyin . Bu, yukarıdaki TCP paketinin güzel dize temsilini alıp bir regex :: cringe :: kullanarak kaynak bağlantı noktasını çekin anlamına gelmez.

Doğru şeyleri yapmanın yolu, SourcePort mülkiyet doğrudan çağrı ToString () (BTW ToString böylece ushort () zaten mevcut olmalıdır) 'dir.

Makine ayrıştırması için karmaşık bir nesnenin durumunu paketlemek için daha sağlam bir şeye ihtiyacınız varsa, yapılandırılmış bir serileştirme stratejisi kullanmanız daha iyi olacaktır.

Neyse ki, bu tür stratejiler çok yaygındır:

  • ISerializable (C #)
  • Turşu (Python)
  • JSON (Javascript veya onu uygulayan herhangi bir dil)
  • SABUN
  • vb...

Not: PHP'yi kullanmıyorsanız, çünkü herp-derp, bunun için bir işlev vardır :: snicker ::

Neden 2 - ToString () yeterli değil:

Henüz bunu özünde uygulayan bir dil görmedim, ancak bu yaklaşımın varyasyonlarını vahşi doğada gördüm ve kullandım.

Bunlardan bazıları şunları içerir:

  • ToVerboseString ()
  • ToString (ayrıntılı = doğru)

Temel olarak, bir TCP paketinin en durumunun o kıllı karışıklık gerektiğini insan okunabilmesi için tarif edilebilir. TCP hakkında konuşurken 'ölü bir atı dövmekten' kaçınmak için, ToString () ve ToVerboseString () 'nin yetersiz kullanıldığını düşündüğüm 1 numaralı duruma' parmağımı göstereceğim '...

Kullanım Örneği - Diziler:

Öncelikle bir dil kullanıyorsanız, muhtemelen o dilin yaklaşımından memnunsunuzdur. Benim gibi farklı diller arasında geçiş yapan insanlar için çeşitli yaklaşımların sayısı rahatsız edici olabilir.

Yani, bunun beni kaç kez sinirlendirdiği, her Hindu tanrısının tüm parmaklarının toplamından daha fazla.

Orada çeşitli diller ortak kullanım durumları kesmek ve bir kaç olduğunu olsun onu doğru . Bazıları tekerleği yeniden icat etmeyi gerektirir, bazıları sığ bir çöplük yapar, diğerleri derin bir çöplük yapar, hiçbiri benim istediğim gibi çalışmaz ...

İstediğim şey çok basit bir yaklaşım:

print(array.ToString());

Çıktılar: 'Dizi [x]' veya 'Dizi [x] [y]'

Burada x, birinci boyuttaki öğe sayısı ve y, ikinci boyuttaki öğe sayısı veya 2. boyutun pürüzlü olduğunu gösteren bir değerdir (min / maks aralık olabilir mi?).

Ve:

print(array.ToVerboseString());

Güzel şeyleri takdir ettiğim için tüm o-patlamasını güzel baskılı çıktılar.

Umarım bu beni uzun zamandır rahatsız eden bir konuya biraz ışık tutar. En azından PHP'çıların bu yanıta olumsuz oy vermeleri için küçük bir trol yemi serptim.


"Bunu özünde uygulayan bir dil henüz görmedim" yazdınız. Bana öyle geliyor ki Python buna oldukça yaklaşıyor; Örneğin, bir diziyi yazdırmak tüm verilerini kısaca verir. C # / Java'da özlediğim tek şey, titizliklerini sevmeme rağmen. Ve ToString () 'in biraz ötesine gitmeniz gerektiğinde, Python'un liste anlama sözdizimi gibi bir şeye sahip olmak güzel olurdu; Sanırım string.Join () benzer, ancak daha az esnek.
Jon Coombs

1
@JCoombs Katılmıyorum, anlayışlar harika. Python'daki veri yapılarını kavrayış yoluyla geçmek hayatı çok daha kolaylaştırır, ancak bu yaklaşım yine de nesnenin iç yapısı hakkında derinlemesine bilgi gerektirir. Harici bir kitaplıktan içe aktarılan sınıflarda her zaman açık olmayan bir şey. Kütüphane yazarları için ToString () 'i geçersiz kılmak ve kullanışlı bir insan tarafından okunabilir gösterim sağlamak iyi bir uygulamadır, ancak nesnenin yapısını genel yapılandırılmış bir insan tarafından okunabilir formatta (ex JSON) çıkaran genel bir döküm yöntemine sahip olmak da iyi olacaktır.
Evan Plaice

Mükemmel nokta. Dolayısıyla, temelde bir typeof'tan başka bir şey göstermemek yerine, JSON gibi bir şeye otomatik olarak serileştirilebilir. (Şimdiye kadar, yalnızca XML'e serileştirilmiş .NET nesnelerini gördüm, ancak .NET'te yeniyim) Ama o zaman tehlike, ToString () 'i makine tarafından okunabilir olarak değerlendirmenin cazibesi olabilir mi? (Örneğin, seri halini kaldırabilmeyi bekleyin.)
Jon Coombs

1
@JCoombs Evet, işlevsel düzeyde JSON ve XML aynı amaca hizmet ediyor. ToString'i makine tarafından okunabilen bir çıktı olarak pek çok kişi kullanıyor; Bunun kötü olup olmadığı tartışılabilir. Benim en büyük etim - çoğu zaman - bir nesnenin durumunu insan tarafından okunabilir bir formatta çıkarmak acıdır. ToString () uygulaması genellikle yetersiz kullanılır ve hata ayıklayıcı izleme listelerinin dışında bir nesnenin durumunu okumak bir acıdır. Serileştirilmiş temsiller, bir nesnenin tüm durumunu görüntülemek için bir yedek olarak iyidir, ancak ToString'in daha iyi uygulamaları en iyi seçenektir.
Evan Plaice

Eğer ToString()önemli bir fonksiyon - ayıklama içindir, o zaman neden bir StringBuilder metinlerin tümünü ayıklamak için tek yoldur?
Dan W

9

Her şey kadar iyi uygulama ile ilgili, gerçekten.

ToString()birçok yerde, genellikle bir insan tarafından tüketilmek üzere, bir nesnenin dizgi temsilini döndürmek için kullanılır. Çoğunlukla aynı dizge nesneyi yeniden sulandırmak için kullanılabilir ( örneğin intveya düşünün DateTime), ancak bu her zaman verilen bir şey değildir (örneğin bir ağaç, basitçe bir Sayımı gösteren kullanışlı bir dizge temsiline sahip olabilir, ancak açıkça kullanamazsınız yeniden inşa etmek için).

Özellikle hata ayıklayıcı, değişkeni izleme pencerelerinde, anlık pencerelerde vb. Görüntülemek için kullanacaktır, bu nedenle ToStringhata ayıklama için gerçekten paha biçilmezdir.

Genel olarak, aynı zamanda, böyle bir tür genellikle bir dizge döndüren açık bir üyeye sahip olacaktır. Örneğin, bir Enlem / Boylam çifti , örneğin ToDecimalDegreeshangi dönenlere sahip olabilir "-10, 50", ancak aynı zamanda ToDegreesMinutesSecondsEnlem / Uzun çifti için başka bir format olduğu için sahip olabilir . Aynı tür daha sonra ToString, hata ayıklama gibi şeyler için veya hatta potansiyel olarak web sayfalarını oluşturma gibi şeyler için bir 'varsayılan' sağlamak için bunlardan biriyle geçersiz kılabilir (örneğin, @Razor'daki yapı, ToString()dize olmayan bir ifadenin sonucunu çıkış akışı).


6

object.ToString()bir nesneyi dizgi gösterimine dönüştürür. Bir kullanıcı ToString()oluşturduğunuz bir sınıfı aradığında döndürülen şeyi değiştirmek istiyorsanız ToString(), o sınıfta geçersiz kılmanız gerekir .


6

En yararlı bilginin zaten sağlandığını düşünmeme rağmen, iki sentimi ekleyeceğim:

  • ToString()geçersiz kılınması amaçlanmıştır. Öntanımlı uygulaması, bazen yararlı olsa da (özellikle birçok nesneyle çalışırken) çoğu zaman yeterli olmayan tür adını döndürür.

  • Hata ayıklama amacıyla güvenebileceğinizi unutmayın DebuggerDisplayAttribute. Bu konuda daha fazla bilgi bulabilirsiniz burada .

  • Kural olarak, POCO'larda her zaman geçersiz kılabilirsiniz ToString(). POCO'lar, genellikle bir dizge olabilen, verilerin yapılandırılmış bir temsilidir.

  • ToString'i nesnenizin metinsel bir temsili olacak şekilde tasarlayın. Belki ana alanları ve verileri, belki koleksiyonda kaç tane öğe olduğuna dair bir açıklama vb.

  • Her zaman bu dizeyi tek bir satıra sığdırmaya çalışın ve yalnızca gerekli bilgilere sahip olun. PersonAd, Adres, Numara vb. Özelliklere sahip bir sınıfınız varsa , yalnızca ana verileri döndürün (Bir kimlik numarasını adlandırın).

  • Öğesinin iyi bir uygulamasını geçersiz kılmamaya dikkat edin ToString(). Bazı çerçeve sınıfları zaten uygulanmaktadır ToString(). Bu varsayılan uygulamayı geçersiz kılmak kötü bir şeydir: insanlar belirli bir sonuç bekleyecek ToString()ve başka bir sonuç alacak.

Kullanmaktan gerçekten korkmayın ToString(). Dikkatli olacağım tek şey hassas bilgileri geri vermektir. Bunun dışında risk minimumdur. Elbette, bazılarının da belirttiği gibi, diğer sınıflar bilgiye ulaştıklarında ToString'inizi kullanacaktır. Ama ne zaman tür adını döndürmek, bazı gerçek bilgileri almaktan daha iyi kabul edilecek?


5

Geçersiz kılmazsanız ToString, temel sınıf uygulamanızı elde edersiniz.Object için sınıfın kısa tip adıdır.

Başka, daha anlamlı veya yararlı bir uygulama istiyorsanız, ToStringonu geçersiz kılın.


Bu, türünüzün bir listesini bir veri kaynağı olarak bir veri kaynağı olarak kullanırken yararlı olabilir ListBox.ToString otomatik olarak görüntülenir.

Başka bir durum, türünüzün bir temsilini almak için String.Formatçağrıda ToStringbulunan türünüzü iletmek istediğinizde ortaya çıkar .


4

Henüz kimsenin bahsetmediği bir şey: Geçersiz kılarak ToString(), IFormattableaşağıdakileri yapabilmek için uygulamayı da düşünebilirsiniz :

 public override ToString() {
   return string.Format("{0,-20} {1, -20}", m_work, m_personal);
 }

 public ToString(string formatter) {
   string formattedEmail = this.ToString();
   switch (formatter.ToLower()) {
     case "w":
       formattedEmail = m_Work;
       break;
     case "p":
       formattedEmail = m_Personal;
       break;
     case "hw":
       formattedEmail = string.Format("mailto:{0}", m_Work);
       break;
   }
   return formattedEmail;
}

Hangisi faydalı olabilir.


Bu yöntemi geçersiz kılmak için sağlayan bir çerçeve sınıfı örneği verebilir misiniz? Çerçevede bildiğim tek ilgili şey IFormattiblearayüz.
tm1

@ tm1 Kaynaktan miras alınan herhangi bir nesnenin System.Objectgeçersiz kılınabilen bir ToString()yöntemi olacaktır, ancak tam uyumluluk için biçimlendirici yönteminin arayüze başvurmaması overrideve gerçekten referans göstermesi gerektiği konusunda haklısınız IFormattible.
Zhaph - Ben Duguid

Neredeyse - IFormattablebir IFormatProviderparametre alır . Yine de yayınınızı düzenlediğiniz için teşekkürler.
tm1

Aslında, iki yöntemi var, ifade ettiğim değer gösterilen
değerdeydi

3

ToString () 'i geçersiz kılmanın bir yararı, Resharper'ın araç desteği: Alt + Ins -> "Üyeleri biçimlendirmek" ve sizin için ToString () yazıyor.


2

Bazı durumlarda, hata ayıklayıcı izleme penceresinde özel sınıfların değerlerini okumayı kolaylaştırır. İzleme penceresinde tam olarak ne görmek istediğimi biliyorsam, ToString'i bu bilgilerle geçersiz kıldığımda görüyorum.


1

Yapıları tanımlarken (etkili kullanıcı ilkelleri) eşleştirmeye sahip olmanın iyi bir uygulama olduğunu düşünüyorum ToStringve ParseveTryParse , özellikle XML serileştirme için yöntemlerine . Bu durumda, tüm durumu daha sonra okunabilmesi için bir dizeye dönüştürürsünüz.

Sınıflar, ancak genellikle kullanılması için çok karmaşık olacak daha bileşiği yapılardır ToStringve Parse. Onların ToStringyöntemleri yerine tüm eyalet kaydetme, bir ada veya kimliğe ya da belki bir liste için bir miktar gibi benzersiz bir tanımlayıcı gibi, onların durumunu belirlemek yardımcı olan basit açıklama olabilir.

Ayrıca, Robbie'nin dediği gibi, geçersiz kılma, yazı kadar basit bir referansı ToStringçağırmanıza izin verir .ToStringobject


1

Kişi gibi, dizgi temsilinin sezgisel anlamı olmayan bir nesneye sahip olduğunuzda bunu kullanabilirsiniz. Dolayısıyla, örneğin bu kişiyi yazdırmanız gerekirse, biçimini hazırlamak için bu geçersiz kılmayı kullanabilirsiniz.


1

Object.ToStringYöntem, yalnızca hata ayıklama amacıyla kullanılmalıdır. Varsayılan uygulama, çok kullanışlı olmayan nesne türü adını gösterir. Tanılama ve hata ayıklama için daha iyi bilgi sağlamak için bu yöntemi geçersiz kılmayı düşünün. Lütfen günlükleme altyapılarının sıklıkla ToString yöntemini kullandığını ve bu metin parçalarını günlük dosyalarınızda bulacağınızı göz önünde bulundurun.

Yapmayın içinde lokalize metin kaynaklarını dönmek Object.ToStringyöntemle. Bunun nedeni, ToString yönteminin her zaman geliştiricinin anlayabileceği bir şey döndürmesidir. Geliştirici, uygulamanın desteklediği tüm dilleri konuşamayabilir.

UygulamakIFormattable Eğer kullanıcı dostu bir yerelleştirilmiş metinleri döndürmek istediğinizde arabirimi. Bu arayüz, ve parametreleriyle bir ToString aşırı yüklemesi tanımlar formatve formatProvider. FormatProvider, metni kültüre duyarlı bir şekilde biçimlendirmenize yardımcı olur.

Ayrıca bkz: Object.ToString ve IFormattable


0

Daha basit, mülkünüzün nasıl kullanılacağına bağlıdır. Dizeyi bir kez biçimlendirmeniz gerekiyorsa, onu geçersiz kılmak o kadar da mantıklı değil.

Ancak, ToString yöntemini mülkünüz için normal dize verilerini döndürmeyecek, ancak standart bir biçimlendirme deseni gerçekleştirecek şekilde geçersiz kılıyor gibi görünüyor. String.format'ı padding ile kullandığınızdan beri.

Öğrenmekte olduğunuzu söylediğiniz için, alıştırma aynı zamanda kapsülleme ve kod yeniden kullanımıyla ilgili nesne yönelimli programlamadaki temel ilkelere de bağlı görünüyor.

Doldurma için belirlediğiniz bağımsız değişkenleri alan string.format, özelliğin onu çağıran herhangi bir kod için her seferinde aynı şekilde biçimlendirilmesini sağlar. Ayrıca, ileriye giderken birçok yerine sadece tek bir yerde değiştirmeniz gerekir.

Harika bir soru ve ayrıca bazı harika cevaplar!


0

Varlık sınıflarında ToString yöntemini geçersiz kılmayı yararlı buluyorum, çünkü özellikle bir onaylama başarısız olduğunda testteki sorunları hızla belirlemeye yardımcı olur, test konsolu nesnede ToString yöntemini çağırır.

Ancak daha önce söylenenlere uygun olarak, söz konusu nesnenin insanlar tarafından okunabilir bir temsilini sağlamaktır.


0

Diğer yanıtlarda atıfta bulunulan Çerçeve Yönergelerinden memnunum. Bununla birlikte, görüntüleme ve hata ayıklama amaçlarını vurgulamak istiyorum.

ToStringKodunuzda nasıl kullandığınız konusunda dikkatli olun . Kodunuz, bir nesnenin dize temsiline dayanmamalıdır. Varsa, mutlaka ilgili Parseyöntemleri sağlamalısınız .

Yana ToStringher yerde kullanılabilir zaman içinde daha sonraki bir noktada bir nesnenin dize gösterimini değiştirmek istiyorsanız, bir idame acı noktası olabilir. Bazı kodların kırılıp kırılmayacağını incelemek için bu durumda arama hiyerarşisini inceleyemezsiniz.

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.