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;
}
c#
overriding
3D-kreativ
sumber
sumber
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
atau serupa.GetToString
nama properti ... Kemudian Anda akan mendapatkan misalnyaConsole.WriteLine(obj.ItemHeadings)
Jawaban:
Apakah Anda perlu mengganti
ToString
? Tidak.Bisakah Anda mendapatkan representasi string dari objek Anda dengan cara lain? Iya.
Tetapi dengan menggunakan
ToString
Anda 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, ituToString
adalah kandidat utama (ada yang lain, jika Anda ingin memberikan opsi pemformatan yang lebih rumit).Secara konkret,
akan memanggil
yourObject.ToString()
.sumber
@yourObject
dan<%=yourObject%>
akan menjadi "ToString-ed".ToString
seharusnya tidak benar-benar mengubah status suatu objek. Tapi bukan ini yang saya anjurkan.ToString
adalah 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 menimpaToString
yang diposting dalam jawaban David Anderson.Saya hanya akan memberi Anda jawaban langsung dari Pedoman Desain Kerangka dari Seri Pengembangan .NET.
HINDARI melempar pengecualian dari
ToString
CONSIDER mengembalikan string unik yang terkait dengan instance.
PERTIMBANGKAN memiliki keluaran
ToString
berupa masukan yang valid untuk metode parsing apa pun pada jenis ini.LAKUKAN pastikan
ToString
tidak ada efek samping yang terlihat.LAKUKAN laporkan informasi sensitif keamanan melalui penggantian
ToString
hanya setelah meminta izin yang sesuai. Jika permintaan izin gagal, kembalikan string yang tidak termasuk informasi sensitif keamanan.The
Object.ToString
Metode 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
ToString
setiap 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
ToString
seringkali berbahaya bagi antarmuka pengguna. Umumnya aturan praktis saya adalah mengekspos properti yang akan digunakan untuk mengikat informasi ke UI, dan membiarkanToString
timpaan untuk menampilkan informasi diagnostik kepada pengembang. Anda juga bisa mendekorasi tipe Anda denganDebuggerDisplayAttribute
.LAKUKAN usahakan agar senar yang dikembalikan
ToString
pendek. Debugger menggunakanToString
untuk 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 implementasikanIFormattable
, jika string yang dikembalikan dariToString
peka budaya atau ada berbagai cara untuk memformat string. Misalnya,DateTime
menyediakan overload dan implementIFormattable
.JANGAN mengembalikan string kosong atau null dari
ToString
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 sepertiIEquatable(Of T)
danIComparable(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 gunakanToString
untuk tujuan debugging dan pengembang. Gunakan untuk menampilkan informasi diagnostik penting.sumber
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.
sumber
Itu selalu tepat tetapi pertimbangkan dengan hati-hati maksud di balik apa yang Anda tunjukkan
Pertanyaan yang lebih baik adalah bertanya:
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:
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:
Saya lebih suka output yang masuk akal yang mudah diurai oleh manusia selain YMMV .
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:
Alasan 1 - Jangan menyalahgunakan kegunaan ToString ():
Banyak orang menggunakan ToString () untuk menarik representasi string sederhana dari suatu objek. Manual C # bahkan menyatakan:
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:
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:
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:
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:
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.
sumber
ToString()
dimaksudkan untuk debugging, lalu mengapa ini satu-satunya cara untuk mengekstrak seluruh teks dari StringBuilder - sebuah fungsi penting?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 (pikirkanint
atauDateTime
misalnya), 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
ToString
itu 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
ToDecimalDegrees
yang mengembalikan"-10, 50"
misalnya, tetapi mungkin juga memilikiToDegreesMinutesSeconds
, karena itu adalah format lain untuk pasangan Lintang / Bujur. Jenis yang sama itu mungkin juga akan menimpaToString
dengan salah satu yang menyediakan 'default' untuk hal-hal seperti debugging, atau bahkan berpotensi untuk hal-hal seperti rendering halaman web (misalnya,@
konstruksi di Razor menulisToString()
hasil ekspresi non-string ke aliran keluaran).sumber
object.ToString()
mengubah objek menjadi representasi stringnya. Jika Anda ingin mengubah apa yang dikembalikan saat pengguna memanggilToString()
kelas yang telah Anda buat, maka Anda perlu menggantiToString()
di kelas itu.sumber
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
Person
kelas 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 diimplementasikanToString()
. Mengesampingkan implementasi default itu adalah hal yang buruk: orang akan mengharapkan hasil tertentu dariToString()
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?sumber
Jika Anda tidak menimpa
ToString
maka Anda akan mendapatkan implementasi kelas dasar yang, forObject
hanyalah nama tipe pendek dari kelas tersebut.Jika Anda menginginkan implementasi lain yang lebih bermakna atau berguna,
ToString
maka timpalah.Hal ini dapat berguna ketika menggunakan daftar jenis Anda sebagai sumber data untuk
ListBox
sebagaiToString
akan secara otomatis ditampilkan.Situtasi lain terjadi ketika Anda ingin meneruskan tipe Anda
String.Format
yang dipanggilToString
untuk mendapatkan representasi dari tipe Anda.sumber
Sesuatu yang belum disebutkan orang lain: Dengan menimpa
ToString()
, Anda juga dapat mempertimbangkan untuk menerapkanIFormattable
sehingga Anda dapat melakukan hal berikut:Yang bisa bermanfaat.
sumber
IFormattible
antarmuka.System.Object
akan memilikiToString()
metode yang dapat diganti , tetapi Anda benar bahwa metode pemformat tidak bolehoverride
dan harus benar-benar mereferensikanIFormattible
antarmuka untuk kesesuaian lengkap.IFormattable
mengambilIFormatProvider
parameter. Terima kasih telah mengedit postingan Anda.Salah satu manfaat dari mengganti ToString () adalah dukungan perkakas Resharper: Alt + Ins -> "Memformat anggota" dan ToString () akan dituliskan untuk Anda.
sumber
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.
sumber
Ketika mendefinisikan struct (secara efektif pengguna-primitif) saya menemukan itu praktik yang baik untuk memiliki pencocokan
ToString
,Parse
danTryParse
metode, 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
ToString
danParse
. MerekaToString
metode, 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
ToString
memungkinkan Anda memanggilToString
referensi sebagai basic as typeobject
.sumber
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.
sumber
The
Object.ToString
metode 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.ToString
metode 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
IFormattable
antarmuka ketika Anda ingin mengembalikan teks lokal user-friendly. Antarmuka ini mendefinisikan kelebihan ToString dengan parameterformat
danformatProvider
. FormatProvider membantu Anda memformat teks dengan cara yang sadar budaya.Lihat juga: Object.ToString dan IFormattable
sumber
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!
sumber
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.
sumber
Saya senang dengan Panduan Kerangka yang dirujuk dalam jawaban lain. Namun, saya ingin menekankan tampilan dan tujuan debugging.
Berhati-hatilah dengan cara Anda menggunakan
ToString
kode Anda. Kode Anda tidak boleh bergantung pada representasi string dari suatu objek. Jika ya, Anda harus benar-benar memberikanParse
metode masing-masing .Karena
ToString
dapat 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.sumber