ทั้งหมดนี้เท่ากันหรือไม่ ภายใต้สถานการณ์ใดบ้างที่ฉันควรเลือกระหว่างกัน
var.ToString ()
CStr (var)
CType (var, String)
DirectCast (var, String)
แก้ไข: คำแนะนำจากNotMyself ...
- TryCast (var, String)
ทั้งหมดนี้เท่ากันหรือไม่ ภายใต้สถานการณ์ใดบ้างที่ฉันควรเลือกระหว่างกัน
var.ToString ()
CStr (var)
CType (var, String)
DirectCast (var, String)
แก้ไข: คำแนะนำจากNotMyself ...
คำตอบ:
สิ่งเหล่านี้ต่างกันเล็กน้อยและโดยทั่วไปมีการใช้งานที่ยอมรับได้
var.
ToString
()
จะให้คุณเป็นตัวแทนสตริงของวัตถุโดยไม่คำนึงถึงสิ่งที่มันเป็น ใช้สิ่งนี้ถ้าvar
ไม่ใช่สตริงอยู่แล้วCStr
(var)
เป็นตัวดำเนินการส่งสตริง VB ฉันไม่ใช่คน VB ดังนั้นฉันขอแนะนำให้หลีกเลี่ยง แต่จะไม่ทำร้ายอะไรจริงๆ CType
ฉันคิดว่ามันเป็นพื้นเดียวกับCType
(var, String)
จะแปลงประเภทที่กำหนดเป็นสตริงโดยใช้ตัวดำเนินการแปลงที่ให้มาDirectCast
(var, String)
ใช้ในการโยนวัตถุลงในสตริง ถ้าคุณรู้ว่าตัวแปรอ็อบเจกต์คือสตริงใช้สิ่งนี้ นี่เหมือนกับ(string)var
ใน C #TryCast
(ดังที่ได้กล่าวไว้โดย @ NotMyself ) เป็นเหมือนDirectCast
แต่มันจะกลับมาNothing
หากตัวแปรไม่สามารถแปลงเป็นสตริงได้แทนที่จะโยนข้อยกเว้น นี่เหมือนกับvar as string
ใน C # TryCast
หน้า MSDN มีการเปรียบเทียบที่ดีเกินไปTryCast
ใช้งานได้กับประเภทค่าเท่านั้นเนื่องจากต้องเป็นประเภทที่สามารถมีNothing
ค่าได้
CStr(var)
จะทำให้หายใจไม่ออกและเพิ่มข้อยกเว้นถ้า var เป็น DBNull.Value แต่ตัวเลือกอื่นConvert.ToString(var)
จะคืนค่าสตริงว่าง
Dim myList AS ArrayList=new ArrayList
เมื่อคุณเขียน(From e In myList select CType(e.Name,String)).ToArray()
มันไม่ทำงาน ฉันมาเขียน... select CType(e.Name.ToString,String)).ToArray()
และดึงรอยยิ้ม
Cstr()
รวบรวมแบบอินไลน์เพื่อประสิทธิภาพที่ดีขึ้น
CType
อนุญาตให้ร่ายระหว่างประเภทหากกำหนดตัวดำเนินการแปลง
ToString()
ระหว่างชนิดฐานและสตริงจะมีข้อยกเว้นถ้าไม่สามารถทำการแปลงได้
TryParse()
จาก String ไปที่ฐานที่typeif
เป็นไปได้มิฉะนั้นส่งคืน false
DirectCast
ใช้ถ้าประเภทที่เกี่ยวข้องผ่านการสืบทอดหรือแบ่งปันอินเทอร์เฟซทั่วไปจะโยนข้อยกเว้นหากการส่งไม่สามารถทำได้trycast
จะไม่ส่งคืนอะไรในอินสแตนซ์นี้
ดูเหมือนว่าMSDNจะระบุว่า Cxxx casts สำหรับประเภทที่เฉพาะเจาะจงสามารถปรับปรุงประสิทธิภาพใน VB .NET เพราะพวกเขาถูกแปลงเป็นรหัสแบบอินไลน์ ด้วยเหตุผลบางอย่างมันยังแนะนำDirectCastซึ่งตรงข้ามกับ CType ในบางกรณี (เอกสารระบุว่าเมื่อมีความสัมพันธ์ในการสืบทอดฉันเชื่อว่านี่หมายความว่าสติของนักแสดงจะถูกตรวจสอบในเวลาคอมไพล์และสามารถใช้การเพิ่มประสิทธิภาพได้ VB runtime.)
เมื่อฉันเขียนรหัส VB .NET สิ่งที่ฉันใช้ขึ้นอยู่กับสิ่งที่ฉันทำ หากเป็นรหัสต้นแบบที่ฉันจะทิ้งฉันจะใช้สิ่งที่ฉันพิมพ์ ถ้ามันเป็นรหัสที่ฉันจริงจังฉันพยายามใช้ Cxxx cast หากไม่มีอยู่ฉันใช้ DirectCast หากฉันมีความเชื่อตามสมควรว่ามีความสัมพันธ์ในการสืบทอด หากเป็นสถานการณ์ที่ฉันไม่รู้ว่าการส่งข้อมูลควรสำเร็จหรือไม่ (เช่นการป้อนข้อมูลผู้ใช้ -> จำนวนเต็ม) จากนั้นฉันใช้ TryCast เพื่อทำสิ่งที่เป็นมิตรมากกว่าการโยนข้อยกเว้นที่ผู้ใช้
สิ่งหนึ่งที่ฉันไม่สามารถสั่นได้คือฉันมักจะใช้ ToString แทนที่จะเป็น CStr แต่ Cstr น่าจะเร็วกว่า
ฉันชอบไวยากรณ์ต่อไปนี้:
Dim number As Integer = 1
Dim str As String = String.TryCast(number)
If str IsNot Nothing Then
ฮะคุณสามารถบอกได้ว่าฉันมักจะเขียนโค้ดใน C # 8)
เหตุผลที่ฉันชอบ TryCast คือคุณไม่ต้องยุ่งกับค่าใช้จ่ายในการคัดเลือกนักแสดง นักแสดงของคุณประสบความสำเร็จหรือตัวแปรของคุณเริ่มต้นเป็นโมฆะและคุณจัดการกับสิ่งนั้นตามนั้น
.ToString()
ๆ ประเภทค่าเช่นจำนวนเต็มไม่สามารถเป็นอะไรได้เลย ดังนั้นในกรณีนี้ CStr (ตัวเลข) หรือ number.ToString () มีความปลอดภัย ในกรณีทั่วไป (ไม่ใช่แค่ประเภทค่า) CStr (อะไรก็ตาม) จะปลอดภัยเพราะมันสามารถจัดการกับอะไร - ผลจะเป็นอะไรในตัวแปรสตริง TryCast มีประโยชน์มาก - ไม่ได้อยู่ที่นี่
ผู้ใช้คอนราดรูดสนับสนุนสำหรับ DirectCast () ในคำถามกองมากเกิน "คุณลักษณะที่ซ่อนของ VB.NET"
String
จึงไม่น่าเป็นไปได้ที่ OP กำลังพูดคุยถึงสถานการณ์ที่ DirectCast เหมาะสม
String
และการToString
ร้องเรียนของฉันจะไม่นำมาใช้ คุณไม่ควรสนับสนุน DirectCast จนกว่าคุณจะทำให้หัวข้อแคบลงจากการแปลงทั่วไป
จากการสอบรับรองคุณควรใช้ Convert.ToXXX () ทุกครั้งที่ทำได้สำหรับการแปลงแบบง่าย ๆ เพราะจะช่วยเพิ่มประสิทธิภาพการทำงานที่ดีกว่าการแปลง CXXX
ในครั้งเดียวฉันจำได้ว่าเห็นสถานะห้องสมุด MSDN ให้ใช้ CStr () เพราะมันเร็วกว่า ฉันไม่รู้ว่านี่เป็นความจริงหรือไม่