2011-08-25 22 views
5

statik sınıfından bazı dize değerlerine erişmek için ConfigurationManager kullanmak istiyorum. Bununla birlikte, özellikle bir değerin yokluğunu veya boş değerlerin varlığını ele almam gerekiyor. Şu anda, işi yapmak içinConfigurationManager ve Statik Sınıf

gibi tür başlatıcıları kullanıyordum. Ancak, "abc" anahtarlı bir dize App.config'da bulunmuyorsa, yürütme işlemi someStr yerine null başvurusuyla devam edecektir. O zaman, bu değeri başlatmadaki doğrulamanın en iyi yolu nedir? Değeri ilklendirdiğim ve sonra geçerliliği kontrol ettiğim statik bir kurucu? Statik kuruculardan kaçınıldığını ve mümkünse tip başlatıcılar tarafından değiştirildiğini duydum.

cevap

6

Böyle bir şey kullanıyorum:

public static readonly string someStr = 
     ConfigurationManager.AppSettings["abc"] ?? "default value"; 

Ya boş bir dize işlemek için:

public static readonly string someStr = 
      !String.IsNullOrEmpty(ConfigurationManager.AppSettings["abc"]) ? 
          ConfigurationManager.AppSettings["abc"] : "default value"; 
2

statik kurucular iyidir, onlar hakkında çok şey, tarafından garantili olmasıdır Çalışma zamanı, bir kez ve sadece bir kez - sınıfın ilk defa kullanıldığı her durumda.

Sen alternatif bir varsayılan değer ayarlamak için bir araya operatörü (??) kullanabilirsiniz:

private static readonly string someStr = ConfigurationManager.AppSettings["abc"] ?? "some default value"; 
4

Bu sadece bir kod inceleme geldi. Sağlanan cevaplar dizeler için harika. Ama onlar int ya da double, vb için çalışmıyorlar. Bugün, bunu bir yeniden deneme sayısı için yapmalıydım ve bir int olması gerekiyor.

Bu yüzden, Type dönüşümünü dahil etmek isteyenler için bir cevap.

kullanın bu uzantı yöntemi: Bir sonraki adam olur http://www.rhyous.com/2015/12/02/how-to-easily-access-a-web-config-appsettings-value-with-a-type-and-a-default-value

Hope:

using System.Collections.Specialized; 
using System.ComponentModel; 

namespace Rhyous.Config.Extensions 
{ 
    public static class NameValueCollectionExtensions 
    { 
     public static T Get<T>(this NameValueCollection collection, string key, T defaultValue) 
     { 
      var value = collection[key]; 
      var converter = TypeDescriptor.GetConverter(typeof(T)); 
      if (string.IsNullOrWhiteSpace(value) || !converter.IsValid(value)) 
      { 
       return defaultValue; 
      } 

      return (T)(converter.ConvertFromInvariantString(value)); 
     } 
    } 
} 

Ben de burada bulabilirsiniz bunun için birim testleri var.

+0

Bu şimdi Rhyous.Collections NuGet paketimde ve GitHub kaynağında görebilirsiniz: https://github.com/rhyous/Collections/blob/master/src/Rhyous.Collections/Extensions/NameValueCollectionExtensions.cs – Rhyous

İlgili konular