เป็นสิ่งที่เหมาะสมเสมอ แต่ควรพิจารณาเจตนาที่อยู่เบื้องหลังสิ่งที่คุณกำลังแสดงอย่างรอบคอบ
คำถามที่ดีกว่าคือการถาม:
ทำไมถึงแทนที่ ToString ()
ToString () คือหน้าต่างเข้าสู่สถานะของวัตถุ เน้นรัฐเป็นข้อกำหนด ภาษา OOP อย่างยิ่งเช่น Java / C # ละเมิดโมเดล OOP โดยการห่อหุ้มทุกอย่างในคลาส ลองนึกภาพคุณกำลังเขียนโค้ดในภาษาที่ไม่เป็นไปตามรูปแบบ OOP ที่ชัดเจน พิจารณาว่าคุณจะใช้คลาสหรือฟังก์ชัน หากคุณจะใช้เป็นฟังก์ชัน (เช่นคำกริยาการกระทำ) และสถานะภายในจะคงไว้เพียงชั่วคราวระหว่างอินพุต / เอาต์พุต ToString () จะไม่เพิ่มค่า
เช่นเดียวกับคนอื่น ๆ ที่กล่าวถึงสิ่งสำคัญคือต้องพิจารณาสิ่งที่คุณส่งออกด้วย ToString () เนื่องจากตัวดีบักเกอร์หรือระบบอื่น ๆ สามารถใช้งานได้
ฉันชอบจินตนาการถึงเมธอด ToString เป็นพารามิเตอร์ --help ของออบเจ็กต์ ควรสั้นอ่านได้ชัดเจนและแสดงง่าย มันควรจะแสดงสิ่งที่วัตถุที่เป็นไม่ได้สิ่งที่มันไม่ ลองพิจารณาดู ...
Use Case - การแยกวิเคราะห์แพ็กเก็ต TCP:
ไม่ใช่การจับภาพเครือข่ายระดับแอปพลิเคชันเท่านั้น แต่มีบางอย่างที่มีเนื้อมากขึ้นเช่นการจับ PCap
คุณต้องการโอเวอร์โหลด ToString () สำหรับเลเยอร์ TCP เพื่อให้คุณสามารถพิมพ์ข้อมูลไปยังคอนโซลได้ มันจะรวมอะไร? คุณอาจคลั่งไคล้และแยกวิเคราะห์รายละเอียด TCP ทั้งหมด (เช่น TCP ซับซ้อน) ...
ซึ่งรวมถึง:
- พอร์ตต้นทาง
- พอร์ตปลายทาง
- ลำดับหมายเลข
- เลขที่รับทราบ
- การชดเชยข้อมูล
- ธง
- หน้าต่างออฟเซ็ต
- เช็คซัม
- ตัวชี้ด่วน
- ตัวเลือก (ฉันจะไม่ไปที่นั่นด้วยซ้ำ )
แต่คุณต้องการรับขยะทั้งหมดนั้นหรือไม่ถ้าคุณเรียกใช้ TCP ToString () ใน 100 แพ็คเก็ต? ไม่แน่นอนมันจะเกินข้อมูล ทางเลือกที่ง่ายและชัดเจนก็เหมาะสมที่สุด ...
เปิดเผยสิ่งที่ผู้คนคาดหวังว่าจะได้เห็น:
ฉันชอบการส่งออกที่เหมาะสมที่ง่ายสำหรับมนุษย์ที่จะแยก แต่YMMV
TCP:[destination:000, source:000]
ไม่มีอะไรซับซ้อนผลลัพธ์ไม่ได้มีไว้สำหรับให้เครื่องแยกวิเคราะห์ (เช่นเว้นแต่ว่ามีคนใช้รหัสของคุณในทางที่ผิด) จุดประสงค์คือเพื่อให้มนุษย์สามารถอ่านได้
แต่ข้อมูลที่เหลือทั้งหมดที่ฉันพูดถึงก่อนหน้านี้ไม่มีประโยชน์เช่นกัน? ฉันจะไปที่นั่น แต่ก่อนอื่น ...
ToString () หนึ่งในวิธีการที่มีคุณค่าและใช้ไม่ได้ผลตลอดกาล
ด้วยเหตุผลสองประการ:
- ผู้คนไม่เข้าใจว่า ToString () มีไว้เพื่ออะไร
- คลาส 'Object' พื้นฐานไม่มีเมธอดสตริงอื่นที่สำคัญไม่แพ้กัน
เหตุผลที่ 1 - อย่าละเมิดประโยชน์ของ ToString ():
ผู้คนจำนวนมากใช้ ToString () เพื่อดึงการแสดงสตริงอย่างง่ายของวัตถุ คู่มือ C # ยังระบุ:
ToString เป็นวิธีการจัดรูปแบบหลักใน. NET Framework จะแปลงวัตถุเป็นการแสดงสตริงเพื่อให้เหมาะสำหรับการแสดงผล
แสดง,ไม่ใช่การประมวลผลเพิ่มเติม ไม่ได้หมายความว่าใช้การแสดงสตริงที่ดีของฉันของแพ็คเก็ต TCP ด้านบนและดึงพอร์ตต้นทางโดยใช้ regex :: cringe ::
ขวาวิธีที่จะทำสิ่งที่เป็น ToString โทร () โดยตรงในทรัพย์สิน SourcePort (ซึ่ง BTW เป็น ushort เพื่อ ToString () แล้วควรจะมี)
หากคุณต้องการสิ่งที่มีประสิทธิภาพมากขึ้นในการจัดแพคเกจสถานะของวัตถุที่ซับซ้อนสำหรับการแยกวิเคราะห์เครื่องคุณจะดีกว่าโดยใช้กลยุทธ์การจัดลำดับแบบโครงสร้าง
โชคดีที่กลยุทธ์ดังกล่าวเป็นเรื่องธรรมดามาก:
- ปรับเปลี่ยนได้ (C #)
- ดอง (Python)
- JSON (Javascript หรือภาษาใด ๆ ที่ใช้)
- สบู่
- ฯลฯ ...
หมายเหตุ: เว้นแต่คุณจะใช้ PHP เพราะ herp-derp มีฟังก์ชันสำหรับสิ่งนั้น :: snicker ::
เหตุผลที่ 2 - ToString () ไม่เพียงพอ:
ฉันยังไม่เห็นภาษาที่ใช้สิ่งนี้เป็นหลัก แต่ฉันได้เห็นและใช้วิธีการนี้ในรูปแบบต่างๆ
บางส่วน ได้แก่ :
- ToVerboseString ()
- ToString (verbose = จริง)
โดยพื้นฐานแล้วความยุ่งเหยิงของสถานะของ TCP Packet ควรได้รับการอธิบายเพื่อให้มนุษย์สามารถอ่านได้ เพื่อหลีกเลี่ยงการ 'ตีม้าตาย' เมื่อพูดถึง TCP ฉันจะ 'ชี้นิ้ว' ในกรณี # 1 ที่ฉันคิดว่า ToString () และ ToVerboseString () ไม่ได้ใช้ประโยชน์ ...
ใช้กรณี - อาร์เรย์:
หากคุณใช้ภาษาเดียวเป็นหลักคุณอาจคุ้นเคยกับแนวทางของภาษานั้น สำหรับคนอย่างฉันที่กระโดดไปมาระหว่างภาษาต่างๆจำนวนวิธีที่หลากหลายอาจทำให้รำคาญ
กล่าวคือจำนวนครั้งที่ทำให้ฉันหงุดหงิดนั้นมากกว่าผลรวมของนิ้วทั้งหมดของเทพเจ้าในศาสนาฮินดูทุกองค์รวมกัน
มีต่าง ๆกรณีที่ใช้ภาษาทั่วไปแฮ็กและไม่กี่ที่จะได้รับมันขวา บางคนต้องการการประดิษฐ์ล้อขึ้นมาใหม่บางคนก็ทิ้งน้ำตื้น ๆ บางคนก็ทิ้งแบบลึก ๆ แต่ก็ไม่มีอะไรทำได้อย่างที่ฉันต้องการ ...
สิ่งที่ฉันขอเป็นแนวทางง่ายๆ:
print(array.ToString());
เอาต์พุต: 'Array [x]' หรือ 'Array [x] [y]'
โดยที่ x คือจำนวนรายการในมิติแรกและ y คือจำนวนรายการในมิติที่สองหรือค่าบางค่าที่บ่งชี้ว่ามิติที่ 2 มีรอยหยัก (อาจจะมีช่วงต่ำสุด / สูงสุด?)
และ:
print(array.ToVerboseString());
แสดงผลงานของเธอทั้งหมดในรูปแบบที่สวยงามเพราะฉันชอบสิ่งที่สวยงาม
หวังว่าสิ่งนี้จะช่วยให้เข้าใจหัวข้อที่สร้างความรำคาญให้กับฉันมาเป็นเวลานาน อย่างน้อยที่สุดฉันก็โปรยเหยื่อหมุนรอบตัวเล็กน้อยเพื่อให้ PHPers ลงคะแนนคำตอบนี้
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
หรือคล้ายกัน