Mengapa / kapan saat yang tepat untuk mengganti ToString?

103

Saya sedang mempelajari C # dan saya ingin tahu apa gunanya dan manfaat dari override ToString, seperti yang ditunjukkan pada contoh di bawah ini.

Bisakah ini dilakukan dengan cara yang lebih sederhana, menggunakan metode umum tanpa timpaan?

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;
}
3D-kreativ
sumber
4
Tergantung jika Anda benar-benar ingin menggunakannya untuk menampilkan objek di UI di mana saja, selain itu biasanya hanya untuk debugging - Anda akan melihat output ToString di jendela jam VS. (Tapi Anda juga bisa mencapainya dengan atribut di kelas.) Mengingat Anda memiliki judul dan keluaran, sepertinya program ini menggunakannya untuk membuang objek menggunakan Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);atau serupa.
Rup
2
Saya tidak begitu mengerti pertanyaannya. Bisakah itu dilakukan secara berbeda? Iya. Tetapi mengapa Anda ingin melakukannya secara berbeda.
Konrad Rudolph
5
Saya benar-benar akan melewatkan GetToStringnama properti ... Kemudian Anda akan mendapatkan misalnyaConsole.WriteLine(obj.ItemHeadings)
Svish
dan ubah properti ItemHeadings menjadi statis karena tidak memerlukan "ini".
eFloh
Anda mungkin ingin memeriksa pertanyaan ini: stackoverflow.com/questions/7906828/oo-design-advice-tostring
Yuri Ghensev

Jawaban:

127
  • Apakah Anda perlu mengganti ToString? Tidak.

  • Bisakah Anda mendapatkan representasi string dari objek Anda dengan cara lain? Iya.

Tetapi dengan menggunakan ToStringAnda menggunakan metode yang umum untuk semua objek dan dengan demikian kelas lain tahu tentang metode ini. Misalnya, setiap kali kerangka .NET ingin mengubah objek menjadi representasi string, itu ToStringadalah kandidat utama (ada yang lain, jika Anda ingin memberikan opsi pemformatan yang lebih rumit).

Secara konkret,

Console.WriteLine(yourObject);

akan memanggil yourObject.ToString().

Konrad Rudolph
sumber
13
Iya. Juga ini sangat berguna dalam pengembangan MVC atau ASP.Net di mana @yourObjectdan <%=yourObject%>akan menjadi "ToString-ed".
Ben Lesh
4
Juga saat mengisi kotak kombo, ToString adalah panggilan default untuk mendapatkan teks item
Davi Fiamenghi
3
Waspadalah terhadap praktik seperti itu. Kisah nyata: seorang siswa mengganti ToString dengan metode yang selain mengembalikan string, mengubah datanya. Dia sedang men-debug program tetapi ketika program berdiri di titik jeda, nilainya terus berubah. Rupanya - setiap kali dia memeriksa nilai ToString dijalankan - jadi nilainya berubah meskipun program tidak berjalan.
JNF
3
@JNF Apa itu "praktik seperti itu"? ToStringseharusnya tidak benar-benar mengubah status suatu objek. Tapi bukan ini yang saya anjurkan.
Konrad Rudolph
8
@JNF Saya tidak menerima itu. ToStringadalah dimaksudkan untuk menjadi ditimpa. Titik. Menaruh peringatan pada pernyataan ini tidak produktif. Jika Anda melakukan kesalahan - kesalahan Anda sendiri. Faktanya, siswa Anda melanggar poin 4 dalam daftar resmi pedoman untuk menimpa ToStringyang diposting dalam jawaban David Anderson.
Konrad Rudolph
129

Saya hanya akan memberi Anda jawaban langsung dari Pedoman Desain Kerangka dari Seri Pengembangan .NET.

HINDARI melempar pengecualian dariToString

CONSIDER mengembalikan string unik yang terkait dengan instance.

PERTIMBANGKAN memiliki keluaran ToStringberupa masukan yang valid untuk metode parsing apa pun pada jenis ini.

LAKUKAN pastikan ToStringtidak ada efek samping yang terlihat.

LAKUKAN laporkan informasi sensitif keamanan melalui penggantian ToStringhanya setelah meminta izin yang sesuai. Jika permintaan izin gagal, kembalikan string yang tidak termasuk informasi sensitif keamanan.

The Object.ToStringMetode ini dimaksudkan untuk digunakan untuk tampilan umum dan tujuan debugging. Implementasi default hanya menyediakan nama tipe objek. Implementasi default tidak terlalu berguna, dan metode ini direkomendasikan untuk diganti.

LAKUKAN menimpa ToStringsetiap kali string menarik yang dapat dibaca manusia dapat dikembalikan. Implementasi default tidak terlalu berguna, dan implementasi kustom hampir selalu dapat memberikan nilai lebih.

JANGAN lebih suka nama yang bersahabat daripada ID yang unik tetapi tidak dapat dibaca.

Ini juga layak disebutkan karena Chris Sells juga menjelaskan dalam pedoman yang ToStringseringkali berbahaya bagi antarmuka pengguna. Umumnya aturan praktis saya adalah mengekspos properti yang akan digunakan untuk mengikat informasi ke UI, dan membiarkan ToStringtimpaan untuk menampilkan informasi diagnostik kepada pengembang. Anda juga bisa mendekorasi tipe Anda dengan DebuggerDisplayAttribute.

LAKUKAN usahakan agar senar yang dikembalikan ToStringpendek. Debugger menggunakan ToStringuntuk mendapatkan representasi tekstual dari suatu objek untuk ditampilkan kepada pengembang. Jika string lebih panjang dari yang dapat ditampilkan debugger, pengalaman debugging akan terhalang.

LAKUKAN pemformatan string berdasarkan budaya utas saat ini ketika mengembalikan informasi yang bergantung pada budaya.

DO berikan kelebihan beban ToString(string format), atau implementasikan IFormattable, jika string yang dikembalikan dari ToStringpeka budaya atau ada berbagai cara untuk memformat string. Misalnya, DateTimemenyediakan overload dan implement IFormattable.

JANGAN mengembalikan string kosong atau null dariToString

Saya bersumpah dengan pedoman ini, dan Anda harus melakukannya. Saya tidak dapat memberi tahu Anda bagaimana kode saya meningkat hanya dengan satu pedoman ini ToString. Hal yang sama berlaku untuk hal-hal seperti IEquatable(Of T)dan IComparable(Of T). Hal-hal ini membuat kode Anda sangat berfungsi, dan Anda tidak akan menyesal meluangkan waktu ekstra untuk menerapkannya.

Secara pribadi, saya tidak pernah benar-benar menggunakan ToString banyak untuk antarmuka pengguna, saya selalu mengekspos properti atau metode semacam itu. Sebagian besar waktu harus Anda gunakan ToStringuntuk tujuan debugging dan pengembang. Gunakan untuk menampilkan informasi diagnostik penting.

David Anderson
sumber
6
Jawaban bagus, apakah ini pedoman yang Anda rujuk msdn.microsoft.com/en-us/library/ms229042.aspx ?
Jodrell
2
@Jodrell Saya yakin ini diambil dari Framework Design Guidelines
Jim Schubert
6
Kutipan yang lebih baik dibutuhkan.
Ben Voigt
13
Saya tidak tahu SO berubah menjadi Wikipedia.
David Anderson
14
Tidak, tetapi ketika Anda mengutip pedoman, memberikan sumber adalah nilai tambah yang tak terbantahkan.
Falanwe
39

Mengganti ToString()memungkinkan Anda memberikan representasi string kelas yang dapat dibaca manusia.

Ini berarti bahwa keluaran dapat mengungkapkan informasi yang berguna tentang kelas Anda. Misalnya, jika Anda memiliki kelas Person, Anda mungkin memilih untuk ToString()menampilkan id orang tersebut, nama depan mereka, nama belakang mereka, dll. Ini sangat berguna saat debugging atau logging.

Berkenaan dengan contoh Anda - sulit untuk mengetahui apakah penggantian Anda berguna tanpa mengetahui apa kelas ini - tetapi implementasinya sendiri baik-baik saja.

Rob Levine
sumber
13

Itu selalu tepat tetapi pertimbangkan dengan hati-hati maksud di balik apa yang Anda tunjukkan

Pertanyaan yang lebih baik adalah bertanya:

Mengapa seseorang mengganti ToString ()?

ToString () adalah jendela menuju status objek. Penekanan pada negara sebagai persyaratan. Bahasa OOP yang kuat seperti Java / C # menyalahgunakan model OOP dengan merangkum semua yang ada di kelas. Bayangkan Anda membuat kode dalam bahasa yang tidak mengikuti model OOP yang kuat; pertimbangkan apakah Anda akan menggunakan kelas atau fungsi. Jika Anda akan menggunakannya sebagai fungsi (yaitu kata kerja, tindakan) dan status internal hanya dipertahankan sementara antara input / output, ToString () tidak akan menambah nilai.

Seperti yang telah disebutkan orang lain, penting untuk mempertimbangkan apa yang Anda keluaran dengan ToString () karena ini dapat digunakan oleh debugger atau sistem lain.

Saya suka membayangkan metode ToString sebagai parameter --help dari sebuah objek. Ini harus pendek, mudah dibaca, jelas, dan mudah untuk ditampilkan. Harus menampilkan apa benda itu adalah bukan apa yang dilakukannya . Dengan semua itu, mari pertimbangkan ...

Kasus Penggunaan - Parsing paket TCP:

Bukan tangkapan jaringan khusus tingkat aplikasi tetapi sesuatu dengan lebih banyak daging seperti tangkapan pcap.

Anda ingin membebani ToString () hanya untuk lapisan TCP sehingga Anda dapat mencetak data ke konsol. Apa yang termasuk di dalamnya? Anda dapat menjadi gila dan mengurai semua detail TCP (yaitu TCP rumit) ...

Yang meliputi:

  • Port Sumber
  • Pelabuhan Tujuan
  • Nomor Urutan
  • Nomor pengakuan
  • Offset data
  • Bendera
  • Offset Jendela
  • Checksum
  • Pointer Mendesak
  • Pilihan (saya bahkan tidak akan pergi ke sana)

Tetapi apakah Anda ingin menerima semua sampah itu jika Anda memanggil TCP.ToString () pada 100 paket? Tentu tidak, ini akan menjadi informasi yang berlebihan. Pilihan yang mudah dan jelas juga yang paling masuk akal ...

Ekspos apa yang orang ingin lihat:

  • Port Sumber
  • Pelabuhan Tujuan

Saya lebih suka output yang masuk akal yang mudah diurai oleh manusia selain YMMV .

TCP:[destination:000, source:000]

Tidak ada yang rumit, keluarannya bukan untuk diurai oleh mesin (kecuali orang-orang menyalahgunakan kode Anda), tujuan yang dimaksudkan adalah agar dapat dibaca oleh manusia.

Tapi bagaimana dengan semua info menarik yang saya bicarakan sebelumnya, bukankah itu berguna juga? Aku akan membahasnya tapi pertama-tama ...


ToString () salah satu metode paling berharga dan jarang digunakan sepanjang masa

Karena dua alasan:

  1. Orang tidak mengerti untuk apa ToString ()
  2. Kelas dasar 'Objek' kehilangan metode string lain yang sama pentingnya.

Alasan 1 - Jangan menyalahgunakan kegunaan ToString ():

Banyak orang menggunakan ToString () untuk menarik representasi string sederhana dari suatu objek. Manual C # bahkan menyatakan:

ToString adalah metode pemformatan utama di .NET Framework. Ini mengubah objek menjadi representasi stringnya sehingga cocok untuk ditampilkan.

Tampilan, bukan pemrosesan lebih lanjut. Itu tidak berarti, ambil representasi string saya yang bagus dari paket TCP di atas dan tarik port sumber menggunakan regex :: cringe ::.

Cara yang benar untuk melakukan sesuatu adalah, panggil ToString () langsung pada properti SourcePort (yang BTW adalah ushort sehingga ToString () seharusnya sudah tersedia).

Jika Anda memerlukan sesuatu yang lebih kuat untuk memaketkan status objek kompleks untuk penguraian mesin, Anda akan lebih baik menggunakan strategi serialisasi terstruktur.

Untungnya, strategi seperti itu sangat umum:

  • Dapat diserialisasi (C #)
  • Acar (Python)
  • JSON (Javascript atau bahasa apapun yang mengimplementasikannya)
  • SABUN MANDI
  • dll ...

Catatan: Kecuali Anda menggunakan PHP karena, herp-derp, ada fungsi untuk itu :: snicker ::

Alasan 2 - ToString () tidak cukup:

Saya belum melihat bahasa yang menerapkan ini pada intinya, tetapi saya telah melihat dan menggunakan variasi pendekatan ini di alam liar.

Beberapa diantaranya adalah:

  • ToVerboseString ()
  • ToString (verbose = true)

Pada dasarnya, kekacauan berbulu dari status Paket TCP harus dijelaskan agar dapat dibaca manusia. Untuk menghindari 'mengalahkan kuda mati' berbicara tentang TCP, saya akan 'menunjukkan jari' pada kasus # 1 di mana menurut saya ToString () dan ToVerboseString () kurang dimanfaatkan ...

Kasus Penggunaan - Array:

Jika Anda terutama menggunakan satu bahasa, Anda mungkin merasa nyaman dengan pendekatan bahasa itu. Untuk orang-orang seperti saya yang beralih di antara bahasa yang berbeda, banyaknya pendekatan yang bervariasi bisa menjengkelkan.

Yaitu, berapa kali hal ini membuat saya kesal lebih besar dari jumlah gabungan semua jari dari setiap dewa Hindu.

Ada berbagai kasus di mana bahasa menggunakan peretasan umum dan beberapa yang melakukannya dengan benar . Beberapa membutuhkan penemuan roda kembali, beberapa melakukan pembuangan dangkal, yang lain melakukan pembuangan yang dalam, tidak satupun dari mereka bekerja seperti yang saya inginkan ...

Yang saya minta adalah pendekatan yang sangat sederhana:

print(array.ToString());

Output: 'Array [x]' atau 'Array [x] [y]'

Di mana x adalah jumlah item di dimensi pertama dan y adalah jumlah item di dimensi kedua atau beberapa nilai yang menunjukkan bahwa dimensi ke-2 tidak rata (kisaran min / maks mungkin?).

Dan:

print(array.ToVerboseString());

Menghasilkan keseluruhan she-bang dalam cetakan cantik karena saya menghargai hal-hal cantik.

Mudah-mudahan, ini menjelaskan topik yang telah membuat saya kesal sejak lama. Setidaknya saya menaburkan sedikit troll-umpan untuk para PHPers untuk meremehkan jawaban ini.

Evan Plaice
sumber
Anda menulis, "Saya belum melihat bahasa yang menerapkan ini pada intinya". Bagi saya, Python hampir mendekati ini; misalnya mencetak larik memberikan semua datanya secara ringkas. Itu satu hal yang saya rindukan di C # / Java, meskipun saya suka ketelitiannya. Dan ketika Anda perlu sedikit lebih jauh dari ToString (), alangkah baiknya memiliki sesuatu seperti sintaks pemahaman daftar Python; Saya kira string.Join () serupa, meski kurang fleksibel.
Jon Coombs
1
@JCoombs Saya tidak setuju, pemahaman itu bagus. Melintasi struktur data dengan Python melalui pemahaman membuat hidup jauh lebih mudah tetapi pendekatan itu masih membutuhkan pengetahuan mendalam tentang struktur internal objek. Sesuatu yang tidak selalu jelas dengan kelas yang telah diimpor dari perpustakaan eksternal. Merupakan praktik yang baik bagi penulis pustaka untuk mengganti ToString () dan memberikan representasi yang dapat dibaca manusia yang berguna, tetapi sebaiknya juga memiliki metode dump umum yang mengeluarkan struktur objek dalam format terstruktur umum yang dapat dibaca manusia (ex JSON).
Evan Plaice
Poin yang bagus. Jadi, alih-alih menampilkan tidak lebih dari satu jenis, itu mungkin men-serialisasi secara otomatis ke sesuatu seperti JSON. (Sejauh ini, saya hanya melihat objek .NET diserialkan ke XML, tapi saya baru mengenal .NET) Tapi bahayanya mungkin godaan untuk memperlakukan ToString () sebagai dapat dibaca mesin? (Misalnya berharap dapat menghilangkannya.)
Jon Coombs
1
@JCoombs Ya, pada tingkat fungsional JSON dan XML memiliki tujuan yang sama. Banyak orang menggunakan ToString sebagai output yang dapat dibaca mesin; apakah itu buruk atau tidak masih bisa diperdebatkan. Daging sapi terbesar saya - sering kali - sangat merepotkan untuk menampilkan keadaan objek dalam format yang dapat dibaca manusia. Implementasi ToString () sering kali kurang dimanfaatkan dan membaca status objek di luar daftar pantauan debugger sangat merepotkan. Representasi berseri baik sebagai cadangan untuk menampilkan objek dalam keadaan utuh tetapi implementasi ToString yang lebih baik adalah pilihan terbaik.
Evan Plaice
Jika ToString()dimaksudkan untuk debugging, lalu mengapa ini satu-satunya cara untuk mengekstrak seluruh teks dari StringBuilder - sebuah fungsi penting?
Dan W
9

Ini tentang latihan yang baik sebanyak apapun, sungguh.

ToString()digunakan di banyak tempat untuk mengembalikan representasi string dari suatu objek, umumnya untuk dikonsumsi oleh manusia. Seringkali string yang sama dapat digunakan untuk rehidrasi objek (pikirkan intatau DateTimemisalnya), tetapi itu tidak selalu diberikan (pohon misalnya, mungkin memiliki representasi string yang berguna yang hanya menampilkan Hitungan, tetapi jelas Anda tidak dapat menggunakan itu untuk membangunnya kembali).

Secara khusus debugger akan menggunakan ini untuk menampilkan variabel di jendela arloji, jendela langsung dll, oleh karena ToStringitu sebenarnya sangat berharga untuk debugging.

Secara umum, juga, tipe seperti itu akan sering memiliki anggota eksplisit yang juga mengembalikan string. Misalnya, pasangan Lintang / Bujur mungkin memiliki ToDecimalDegreesyang mengembalikan "-10, 50"misalnya, tetapi mungkin juga memiliki ToDegreesMinutesSeconds, karena itu adalah format lain untuk pasangan Lintang / Bujur. Jenis yang sama itu mungkin juga akan menimpa ToStringdengan salah satu yang menyediakan 'default' untuk hal-hal seperti debugging, atau bahkan berpotensi untuk hal-hal seperti rendering halaman web (misalnya, @konstruksi di Razor menulis ToString()hasil ekspresi non-string ke aliran keluaran).

Andras Zoltan
sumber
6

object.ToString()mengubah objek menjadi representasi stringnya. Jika Anda ingin mengubah apa yang dikembalikan saat pengguna memanggil ToString()kelas yang telah Anda buat, maka Anda perlu mengganti ToString()di kelas itu.

Robbie
sumber
6

Meskipun menurut saya informasi yang paling berguna telah diberikan, saya akan menambahkan dua sen saya:

  • ToString()dimaksudkan untuk diganti. Implementasi defaultnya mengembalikan nama tipe yang, meskipun mungkin berguna pada waktu tertentu (terutama saat bekerja dengan banyak objek), tidak mencukupi di sebagian besar waktu.

  • Ingatlah bahwa, untuk tujuan debugging, Anda dapat mengandalkan DebuggerDisplayAttribute. Anda dapat membaca lebih lanjut di sini .

  • Sebagai aturan, di POCO Anda selalu dapat menggantinya ToString(). POCO adalah representasi data terstruktur, yang biasanya dapat menjadi string.

  • Rancang ToString untuk menjadi representasi tekstual dari objek Anda. Mungkin bidang dan datanya utama, mungkin deskripsi tentang berapa banyak item yang ada dalam koleksi, dll.

  • Usahakan selalu untuk memasukkan string itu ke dalam satu baris dan hanya memiliki informasi penting. Jika Anda memiliki Personkelas dengan properti Nama, Alamat, Nomor, dll., Kembalikan hanya data utama (Beri nama beberapa nomor ID).

  • Berhati-hatilah untuk tidak menimpa implementasi yang baik dari ToString(). Beberapa kelas framework sudah diimplementasikan ToString(). Mengesampingkan implementasi default itu adalah hal yang buruk: orang akan mengharapkan hasil tertentu dari ToString()dan mendapatkan hasil lain.

Jangan terlalu takut menggunakan ToString(). Satu-satunya hal yang harus saya perhatikan adalah mengembalikan informasi sensitif. Selain itu, risikonya pun minimal. Tentu, seperti yang ditunjukkan beberapa orang, kelas lain akan menggunakan ToString Anda setiap kali mencari informasi. Tapi sih, kapan mengembalikan nama tipe akan dianggap lebih baik daripada mendapatkan beberapa informasi aktual?

Bruno Brant
sumber
5

Jika Anda tidak menimpa ToStringmaka Anda akan mendapatkan implementasi kelas dasar yang, for Objecthanyalah nama tipe pendek dari kelas tersebut.

Jika Anda menginginkan implementasi lain yang lebih bermakna atau berguna, ToStringmaka timpalah.


Hal ini dapat berguna ketika menggunakan daftar jenis Anda sebagai sumber data untuk ListBoxsebagai ToStringakan secara otomatis ditampilkan.

Situtasi lain terjadi ketika Anda ingin meneruskan tipe Anda String.Formatyang dipanggil ToStringuntuk mendapatkan representasi dari tipe Anda.

Jodrell
sumber
4

Sesuatu yang belum disebutkan orang lain: Dengan menimpa ToString(), Anda juga dapat mempertimbangkan untuk menerapkan IFormattablesehingga Anda dapat melakukan hal berikut:

 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;
}

Yang bisa bermanfaat.

Zhaph - Ben Duguid
sumber
Bisakah Anda memberikan contoh kelas kerangka kerja yang menyediakan metode penggantian? Satu-satunya hal terkait yang saya ketahui dalam kerangka kerja adalah IFormattibleantarmuka.
tm1
@ tm1 Objek apa pun yang diwarisi dari System.Objectakan memiliki ToString()metode yang dapat diganti , tetapi Anda benar bahwa metode pemformat tidak boleh overridedan harus benar-benar mereferensikan IFormattibleantarmuka untuk kesesuaian lengkap.
Zhaph - Ben Duguid
Hampir - IFormattablemengambil IFormatProviderparameter. Terima kasih telah mengedit postingan Anda.
tm1
Memang, ini memiliki dua metode, nilai yang saya ungkapkan dalam yang ditunjukkan;)
Zhaph - Ben Duguid
3

Salah satu manfaat dari mengganti ToString () adalah dukungan perkakas Resharper: Alt + Ins -> "Memformat anggota" dan ToString () akan dituliskan untuk Anda.

Daniel James Bryars
sumber
2

Dalam beberapa kasus, ini membuatnya lebih mudah untuk membaca nilai kelas kustom di jendela tonton debugger. Jika saya tahu persis apa yang ingin saya lihat di jendela arloji, ketika saya mengganti ToString dengan informasi itu, saya akan melihatnya.

filologon
sumber
1

Ketika mendefinisikan struct (secara efektif pengguna-primitif) saya menemukan itu praktik yang baik untuk memiliki pencocokan ToString, Parsedan TryParsemetode, terutama untuk serialisasi XML. Dalam hal ini Anda akan mengubah seluruh status menjadi string, sehingga dapat dibaca nanti.

Kelas bagaimanapun adalah struktur yang lebih majemuk yang biasanya akan terlalu kompleks untuk digunakan ToStringdan Parse. Mereka ToStringmetode, bukan menyimpan seluruh negara, bisa menjadi gambaran sederhana yang membantu Anda mengidentifikasi negara mereka, seperti pengenal unik seperti nama atau ID, atau mungkin kuantitas untuk daftar.

Selain itu, seperti yang dikatakan Robbie, overriding ToStringmemungkinkan Anda memanggil ToStringreferensi sebagai basic as type object.

Dave Cousineau
sumber
1

Anda dapat menggunakannya ketika Anda memiliki objek dengan makna representasi string yang tidak intuitif, seperti orang. Jadi jika Anda perlu misalnya untuk mencetak orang ini, Anda dapat menggunakan override ini untuk menyiapkan formatnya.

NickF
sumber
1

The Object.ToStringmetode harus digunakan untuk tujuan hanya debugging. Implementasi default menunjukkan nama tipe objek yang tidak terlalu berguna. Pertimbangkan untuk mengganti metode ini guna memberikan informasi yang lebih baik untuk diagnostik dan debugging. Harap pertimbangkan bahwa infrastruktur logging sering juga menggunakan metode ToString sehingga Anda akan menemukan fragmen teks ini di file log Anda.

Jangan mengembalikan sumber teks yang dilokalkan dalam Object.ToStringmetode ini. Alasannya adalah metode ToString harus selalu mengembalikan sesuatu yang dapat dipahami oleh pengembang. Pengembang mungkin tidak berbicara semua bahasa yang didukung aplikasi.

Mengimplementasikan yang IFormattableantarmuka ketika Anda ingin mengembalikan teks lokal user-friendly. Antarmuka ini mendefinisikan kelebihan ToString dengan parameter formatdan formatProvider. FormatProvider membantu Anda memformat teks dengan cara yang sadar budaya.

Lihat juga: Object.ToString dan IFormattable

jbe
sumber
0

Lebih sederhana tergantung pada bagaimana properti Anda akan digunakan. Jika Anda hanya perlu memformat string satu kali maka tidak masuk akal untuk menimpanya.

Namun, tampaknya Anda mengganti metode ToString agar tidak mengembalikan data string normal untuk properti Anda, tetapi untuk melakukan pola pemformatan standar. Karena Anda menggunakan string.format dengan padding.

Karena Anda berkata bahwa Anda sedang belajar, latihan tersebut tampaknya juga mengenai prinsip-prinsip inti dalam pemrograman berorientasi objek yang berkaitan dengan enkapsulasi dan penggunaan ulang kode.

String.format yang mengambil argumen yang telah Anda setel untuk pengisi memastikan bahwa properti akan diformat dengan cara yang sama setiap kali untuk kode apa pun yang memanggilnya. Selain itu, ke depannya Anda hanya perlu mengubahnya di satu tempat, bukan di banyak tempat.

Pertanyaan bagus dan juga beberapa jawaban bagus!

SoftwareCarpenter
sumber
0

Saya merasa berguna untuk mengganti metode ToString pada kelas entitas karena membantu dengan cepat mengidentifikasi masalah dalam pengujian terutama ketika pernyataan gagal konsol pengujian akan memanggil metode ToString pada objek.

Tetapi sesuai dengan apa yang telah dikatakan sebelumnya untuk memberikan representasi yang dapat dibaca manusia dari objek yang dimaksud.

pertemuan
sumber
0

Saya senang dengan Panduan Kerangka yang dirujuk dalam jawaban lain. Namun, saya ingin menekankan tampilan dan tujuan debugging.

Berhati-hatilah dengan cara Anda menggunakan ToStringkode Anda. Kode Anda tidak boleh bergantung pada representasi string dari suatu objek. Jika ya, Anda harus benar-benar memberikan Parsemetode masing-masing .

Karena ToStringdapat digunakan di mana-mana, ini bisa menjadi titik nyeri pemeliharaan jika Anda ingin mengubah representasi string suatu objek di lain waktu. Anda tidak bisa begitu saja memeriksa hierarki panggilan dalam kasus ini untuk mempelajari apakah beberapa kode akan rusak.

tm1
sumber