SORU
19 EYLÜL 2008, Cuma


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.

enter image description here

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
13 Kasım 2008, PERŞEMBE


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);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MagmaRhino

    MagmaRhino

    16 Temmuz 2011
  • Matus Slovak

    Matus Slovak

    5 Temmuz 2007
  • ShotgunSandwichENT

    ShotgunSandw

    3 EKİM 2012