Bir dizeyi bir Guid'e dönüştürmeyi denemek istiyorum, ancak istisnaları yakalamaya güvenmek istemiyorum (
- performans nedeniyle - istisnalar pahalıdır
- kullanılabilirlik nedeniyle - hata ayıklayıcı açılır
- tasarım nedenleriyle - beklenen istisna değildir
Başka bir deyişle, kod:
public static Boolean TryStrToGuid(String s, out Guid value)
{
try
{
value = new Guid(s);
return true;
}
catch (FormatException)
{
value = Guid.Empty;
return false;
}
}
uygun değil.
RegEx kullanmayı denemek istiyorum, ama kılavuz parantez sarılmış olabilir, brace sarılmış, hiçbiri sarılmış, zorlaştırır.
Ayrıca, bazı Guid değerlerinin geçersiz olduğunu düşündüm (?)
Güncelleme 1
ChristianK'ın hepsinden FormatException
ziyade yakalamak için iyi bir fikri vardı . Sorunun kod örneğini öneri içerecek şekilde değiştirdi.
Güncelleme 2
Atılan istisnalar için neden endişeleniyorsunuz? Gerçekten sık sık geçersiz GUID bekliyorum?
Cevap evet . Ben - Ben TryStrToGuid kullanıyorum nedeni budur am hatalı veri bekliyor.
Örnek 1 Ad alanı uzantıları, klasör adına bir GUID eklenerek belirtilebilir . Klasör adlarını ayrıştırabilirim, finalden sonra metnin olup olmadığını kontrol edebilirim . bir GUID'dir.
c:\Program Files
c:\Program Files.old
c:\Users
c:\Users.old
c:\UserManager.{CE7F5AA5-6832-43FE-BAE1-80D14CD8F666}
c:\Windows
c:\Windows.old
Örnek 2 Çok kullanılan bir web sunucusu çalıştırıyor olabilirim ve gönderilen bazı verilerin geçerliliğini kontrol etmek isterim. Geçersiz veri kaynaklarının olması gerekenden 2-3 büyüklükte daha yüksek olmasını istemiyorum.
Örnek 3 Bir kullanıcı tarafından girilen bir arama ifadesini ayrıştırıyor olabilirim.
GUID'leri girerse, bunları özel olarak işlemek istiyorum (özellikle o nesneyi aramak veya yanıt metninde belirli bir arama terimini vurgulamak ve biçimlendirmek gibi).
Güncelleme 3 - Performans karşılaştırmaları
10.000 iyi Rehber ve 10.000 kötü Rehber dönüştürmeyi test edin.
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
ps Bir soruyu haklı göstermek zorunda olmamalıyım.
4.0
. Bu yüzden soru ve kabul edilen cevap, oldukları gibi.