ฉันควรส่งใน VB.NET อย่างไร


151

ทั้งหมดนี้เท่ากันหรือไม่ ภายใต้สถานการณ์ใดบ้างที่ฉันควรเลือกระหว่างกัน

  • var.ToString ()

  • CStr (var)

  • CType (var, String)

  • DirectCast (var, String)


แก้ไข: คำแนะนำจากNotMyself ...

  • TryCast (var, String)

คำตอบ:


156

สิ่งเหล่านี้ต่างกันเล็กน้อยและโดยทั่วไปมีการใช้งานที่ยอมรับได้

  • 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 มีการเปรียบเทียบที่ดีเกินไป

15
ไม่มีเหตุผลที่จะใช้ CType (var, String) แทน CStr (var) พวกเขาทำสิ่งเดียวกัน
Jonathan Allen

2
@Maslow TryCastใช้งานได้กับประเภทค่าเท่านั้นเนื่องจากต้องเป็นประเภทที่สามารถมีNothingค่าได้
bdukes

1
@Martinho ค่อนข้างถูกต้อง ที่ควรพูดว่า "ใช้ได้เฉพาะกับประเภทอ้างอิง "
bdukes

3
CStr(var)จะทำให้หายใจไม่ออกและเพิ่มข้อยกเว้นถ้า var เป็น DBNull.Value แต่ตัวเลือกอื่นConvert.ToString(var)จะคืนค่าสตริงว่าง
MCattle

Dim myList AS ArrayList=new ArrayListเมื่อคุณเขียน(From e In myList select CType(e.Name,String)).ToArray()มันไม่ทำงาน ฉันมาเขียน... select CType(e.Name.ToString,String)).ToArray()และดึงรอยยิ้ม
Bellash

13

Cstr() รวบรวมแบบอินไลน์เพื่อประสิทธิภาพที่ดีขึ้น

CType อนุญาตให้ร่ายระหว่างประเภทหากกำหนดตัวดำเนินการแปลง

ToString() ระหว่างชนิดฐานและสตริงจะมีข้อยกเว้นถ้าไม่สามารถทำการแปลงได้

TryParse()จาก String ไปที่ฐานที่typeifเป็นไปได้มิฉะนั้นส่งคืน false

DirectCastใช้ถ้าประเภทที่เกี่ยวข้องผ่านการสืบทอดหรือแบ่งปันอินเทอร์เฟซทั่วไปจะโยนข้อยกเว้นหากการส่งไม่สามารถทำได้trycastจะไม่ส่งคืนอะไรในอินสแตนซ์นี้


8

ดูเหมือนว่าMSDNจะระบุว่า Cxxx casts สำหรับประเภทที่เฉพาะเจาะจงสามารถปรับปรุงประสิทธิภาพใน VB .NET เพราะพวกเขาถูกแปลงเป็นรหัสแบบอินไลน์ ด้วยเหตุผลบางอย่างมันยังแนะนำDirectCastซึ่งตรงข้ามกับ CType ในบางกรณี (เอกสารระบุว่าเมื่อมีความสัมพันธ์ในการสืบทอดฉันเชื่อว่านี่หมายความว่าสติของนักแสดงจะถูกตรวจสอบในเวลาคอมไพล์และสามารถใช้การเพิ่มประสิทธิภาพได้ VB runtime.)

เมื่อฉันเขียนรหัส VB ​​.NET สิ่งที่ฉันใช้ขึ้นอยู่กับสิ่งที่ฉันทำ หากเป็นรหัสต้นแบบที่ฉันจะทิ้งฉันจะใช้สิ่งที่ฉันพิมพ์ ถ้ามันเป็นรหัสที่ฉันจริงจังฉันพยายามใช้ Cxxx cast หากไม่มีอยู่ฉันใช้ DirectCast หากฉันมีความเชื่อตามสมควรว่ามีความสัมพันธ์ในการสืบทอด หากเป็นสถานการณ์ที่ฉันไม่รู้ว่าการส่งข้อมูลควรสำเร็จหรือไม่ (เช่นการป้อนข้อมูลผู้ใช้ -> จำนวนเต็ม) จากนั้นฉันใช้ TryCast เพื่อทำสิ่งที่เป็นมิตรมากกว่าการโยนข้อยกเว้นที่ผู้ใช้

สิ่งหนึ่งที่ฉันไม่สามารถสั่นได้คือฉันมักจะใช้ ToString แทนที่จะเป็น CStr แต่ Cstr น่าจะเร็วกว่า


8

ฉันชอบไวยากรณ์ต่อไปนี้:

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

ฮะคุณสามารถบอกได้ว่าฉันมักจะเขียนโค้ดใน C # 8)

เหตุผลที่ฉันชอบ TryCast คือคุณไม่ต้องยุ่งกับค่าใช้จ่ายในการคัดเลือกนักแสดง นักแสดงของคุณประสบความสำเร็จหรือตัวแปรของคุณเริ่มต้นเป็นโมฆะและคุณจัดการกับสิ่งนั้นตามนั้น


2
ฉันคิดว่าคุณผิด ไม่ใช่ความคิดที่ดีที่จะใช้ TryCast เลย ในกรณีเช่นคุณควรใช้ number.ToString () หรือ CStr (number)
Shimmy Weitzhandler

4
@Shimmy: อะไรคือเหตุผลที่ไม่ใช้ TryCast เลย? DirectCast ดีกว่าไหมที่จะหลีกเลี่ยงข้อยกเว้นในบางสถานการณ์
Dienekes

3
@Dienekes และ NotMyself TryCast สำหรับประเภทการอ้างอิงเท่านั้น ที่นี่เรามีจำนวนเต็มซึ่งเป็นประเภทค่า คอมไพเลอร์จะปฏิเสธ TryCast นอกจากนี้เป้าหมายคือ String เอนทิตี. สุทธิใด ๆ ยกเว้นการสนับสนุนใด.ToString()ๆ ประเภทค่าเช่นจำนวนเต็มไม่สามารถเป็นอะไรได้เลย ดังนั้นในกรณีนี้ CStr (ตัวเลข) หรือ number.ToString () มีความปลอดภัย ในกรณีทั่วไป (ไม่ใช่แค่ประเภทค่า) CStr (อะไรก็ตาม) จะปลอดภัยเพราะมันสามารถจัดการกับอะไร - ผลจะเป็นอะไรในตัวแปรสตริง TryCast มีประโยชน์มาก - ไม่ได้อยู่ที่นี่
ToolmakerSteve

4

-1 เนื่องจาก DirectCast โจ๋งครึ่มไม่เหมาะสมที่นี่ยกเว้นภายใต้สถานการณ์ที่ จำกัด มากซึ่งคุณไม่ต้องพูดถึง DirectCast นั้นดีเมื่อคุณรู้ว่าคุณมีประเภทอ้างอิงที่เกี่ยวข้องสองประเภทและต้องการการหล่อที่มีประสิทธิภาพระหว่างพวกเขา เนื่องจากคำถามเกี่ยวกับการได้รับStringจึงไม่น่าเป็นไปได้ที่ OP กำลังพูดคุยถึงสถานการณ์ที่ DirectCast เหมาะสม
ToolmakerSteve

... หากคำถามไม่ได้กล่าวถึงStringและการToStringร้องเรียนของฉันจะไม่นำมาใช้ คุณไม่ควรสนับสนุน DirectCast จนกว่าคุณจะทำให้หัวข้อแคบลงจากการแปลงทั่วไป
ToolmakerSteve

1

จากการสอบรับรองคุณควรใช้ Convert.ToXXX () ทุกครั้งที่ทำได้สำหรับการแปลงแบบง่าย ๆ เพราะจะช่วยเพิ่มประสิทธิภาพการทำงานที่ดีกว่าการแปลง CXXX


1
FYI จาก Paul Vick ที่ Microsoft ตัวดำเนินการ Cxxx นั้นเร็วกว่าฟังก์ชัน Convert.Toxxx อย่างน้อยในปี 2004 เนื่องจาก Cxxx คอมไพล์โดยตรงกับ IL แทนที่จะเรียกใช้ฟังก์ชัน แม้ว่าเหตุผลของเขาดูเหมือนจะเป็นที่น่าสงสัย แต่ก็มีความสามารถในการเพิ่มประสิทธิภาพการเรียกใช้ฟังก์ชัน JIT panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve

0

ในครั้งเดียวฉันจำได้ว่าเห็นสถานะห้องสมุด MSDN ให้ใช้ CStr () เพราะมันเร็วกว่า ฉันไม่รู้ว่านี่เป็นความจริงหรือไม่


2
DirectCast เร็วกว่า CStr แต่คุณสามารถใช้งานได้เฉพาะเมื่อคัดเลือกวัตถุสตริงลงในตัวแปรสตริง มันจะล้มเหลวหากคุณพยายามแปลงวัตถุอื่นเป็นสตริง
Jonathan Allen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.