C#: string atma istisna olmadan gönderilir eğer Test?
Bir Guıd için bir dize dönüştürmek için denemek istiyorum, ama istisnalar yakalamak güvenmek istemiyorum (
- performansı artırmak için - istisnalar pahalı
- kullanılabilirlik nedenden dolayı hata açılır
- tasarım nedenlerle beklenen olağanüstü değil
DiÄŸer bir deyiÅŸle kodu:
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ÄŸildir.
Düzenli ifade kullanarak denemek istiyorum, ama guıd parantez sarılmış olabilir bu yana, brace sarılmış, hiçbiri sarılmış, işleri zorlaştırıyor.
Ayrıca, belirli bir Guıd değerleri geçersiz olduğunu düşündüm(?)
Güncelleme 1
ChristianK FormatException
yerine tüm yakalamak için iyi bir fikir vardı. Soru bu kod örneği, öneri yer değiştirildi.
Güncelleme 2
Neden atılan özel durumları hakkında endişe? Gerçekten bekliyor geçersiz GUID genelde o ben miyim?
CevapEvet. Bu TryStrToGuid - ben kullanıyorum neden oluramkötü veri bekliyor.
Örnek 1Namespace extensions can be specified by appending a GUID to a folder name. Klasör adları, sonra nihai metin olmadığını görmek için kontrol ayrıştırma olabilirim.bir gönderilir.
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 2Geri gönderilen bazı verilerin geçerliliğini kontrol etmek için yoğun olarak kullanılan web sunucu çalışan istiyor olabilirim. Geçersiz veri kaynakları olması gerekenden büyüklükte 2-3 sipariş daha bağlamak istemiyorum.
Örnek 3Arama ifadesi kullanıcı tarafından girilen ayrıştırma olabilirim.
Eğer GUID onları özel olarak işlemek istiyorum (özellikle bu nesne için arama, ya da vurgulayın ve biçim cevap metni. belirli bir arama terimi gibi) girin
3 - Performans kriterleri güncelleştirin
Test 10,000 iyi GUID ve 10,000 kötü GUID dönüştürme.
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
p.s. Bir soru haklı gerek yok.
CEVAP
Performans Kriterleri
Catch exception:
10,000 good: 63,668 ticks
10,000 bad: 6,435,609 ticks
Regex Pre-Screen:
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
COM (en Hızlı) Cevap İntertop:
/// <summary>
/// Attempts to convert a string to a guid.
/// </summary>
/// <param name="s">The string to try to convert</param>
/// <param name="value">Upon return will contain the Guid</param>
/// <returns>Returns true if successful, otherwise false</returns>
public static Boolean TryStrToGuid(String s, out Guid value)
{
//ClsidFromString returns the empty guid for null strings
if ((s == null) || (s == ""))
{
value = Guid.Empty;
return false;
}
int hresult = PInvoke.ObjBase.CLSIDFromString(s, out value);
if (hresult >= 0)
{
return true;
}
else
{
value = Guid.Empty;
return false;
}
}
namespace PInvoke
{
class ObjBase
{
/// <summary>
/// This function converts a string generated by the StringFromCLSID function back into the original class identifier.
/// </summary>
/// <param name="sz">String that represents the class identifier</param>
/// <param name="clsid">On return will contain the class identifier</param>
/// <returns>
/// Positive or zero if class identifier was obtained successfully
/// Negative if the call failed
/// </returns>
[DllImport("ole32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = true)]
public static extern int CLSIDFromString(string sz, out Guid clsid);
}
}
< / ^ hr .
Bottom line: Eğer bir dize gönderilir ve performansı hakkında bakım eğer öğrenmek isterseniz, COM birlikte Çalışabilirlik kullanın.
Eğer bir Guıd Dize gösterimini bir guıd dönüştürmek için ihtiyacınız varsa, kullanın
new Guid(someString);
Eğer string bir sayı ise Test Raylar ü...
El ile (atma) Python bir istisna yükse...
Eğer bir giriş varsa test etmek için k...
Checkbox eÄŸer test jQuery ile kontrol ...
R eğer bir vektörün verilen bir öğe iç...