ฉันต้องการลองแปลงสตริงเป็น Guid แต่ฉันไม่ต้องการพึ่งพาข้อยกเว้น (
- สำหรับเหตุผลด้านประสิทธิภาพ - ข้อยกเว้นมีราคาแพง
- สำหรับเหตุผลในการใช้งาน - โปรแกรมดีบั๊กจะปรากฏขึ้น
- สำหรับเหตุผลด้านการออกแบบ - ความคาดหวังนั้นไม่โดดเด่น
ในคำอื่น ๆ รหัส:
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
ไม่เหมาะ
ฉันจะลองใช้ RegEx แต่เนื่องจาก guid สามารถเป็นวงเล็บปิดวงเล็บปีกกาห่อหุ้มห่อไม่ทำให้มันยาก
นอกจากนี้ฉันคิดว่าค่า Guid บางอย่างไม่ถูกต้อง (?)
อัปเดต 1
ChristianKมีความคิดที่ดีที่จะจับเท่านั้นFormatException
ไม่ใช่ทั้งหมด เปลี่ยนตัวอย่างรหัสของคำถามเพื่อรวมข้อเสนอแนะ
อัปเดต 2
ทำไมต้องกังวลเกี่ยวกับข้อยกเว้นโยน? ฉันคาดหวังว่าจะมี GUID ที่ไม่ถูกต้องทั้งหมดหรือไม่
คำตอบคือใช่ นั่นคือเหตุผลที่ฉันใช้ TryStrToGuid - ฉันกำลังคาดหวังว่าข้อมูลที่ไม่ดี
ตัวอย่างที่ 1 ส่วนขยาย Namespace สามารถระบุได้โดยการผนวก GUID ที่จะชื่อโฟลเดอร์ ฉันอาจจะแยกโฟลเดอร์ชื่อการตรวจสอบเพื่อดูว่าข้อความหลังสุดท้าย คือ GUID
c:\Program Files
c:\Program Files.old
c:\Users
c:\Users.old
c:\UserManager.{CE7F5AA5-6832-43FE-BAE1-80D14CD8F666}
c:\Windows
c:\Windows.old
ตัวอย่างที่ 2ฉันอาจใช้เว็บเซิร์ฟเวอร์ที่ใช้งานหนักต้องการตรวจสอบความถูกต้องของข้อมูลที่โพสต์กลับ ฉันไม่ต้องการให้ข้อมูลที่ไม่ถูกต้องคาดหวังทรัพยากรที่มีขนาด 2-3 คำสั่งสูงกว่าที่ควรจะเป็น
ตัวอย่างที่ 3ฉันอาจแยกวิเคราะห์นิพจน์การค้นหาที่ผู้ใช้ป้อน
หากพวกเขาป้อน GUID ฉันต้องการประมวลผลเป็นพิเศษ (เช่นการค้นหาวัตถุนั้นโดยเฉพาะหรือเน้นและจัดรูปแบบข้อความค้นหาเฉพาะในข้อความตอบกลับ)
อัปเดต 3 - การวัดประสิทธิภาพ
ทดสอบการแปลง 10,000 Guids ที่ดีและ 10,000 Guids ที่ไม่ดี
Catch FormatException:
10,000 good: 63,668 ticks
10,000 bad: 6,435,609 ticks
Regex Pre-Screen with try-catch:
10,000 good: 637,633 ticks
10,000 bad: 717,894 ticks
COM Interop CLSIDFromString
10,000 good: 126,120 ticks
10,000 bad: 23,134 ticks
ป.ล. ฉันไม่ควรต้องพิสูจน์คำถาม
4.0
ก็ไม่มี นั่นเป็นเหตุผลว่าทำไมคำถามและคำตอบที่ยอมรับได้เป็นอย่างที่พวกเขาเป็น