【问题标题】:ConfigurationManager & Static ClassConfigurationManager 和静态类
【发布时间】:2011-08-25 11:22:19
【问题描述】:

我想使用ConfigurationManager 来访问 static 类中的一些字符串值。但是,我需要专门处理缺少值或存在空值的情况。现在我正在使用类型初始化器,比如

private static readonly string someStr = ConfigurationManager.AppSettings["abc"];

完成这项工作。但是,如果App.config 中不存在键为“abc”的字符串,则执行将很高兴继续使用null 引用代替someStr。那么,在初始化时验证该值的最佳方法是什么?我在其中初始化值然后检查有效性的静态构造函数?我听说要避免使用静态构造函数,并在可能的情况下将其替换为类型初始值设定项。

【问题讨论】:

    标签: c# .net static


    【解决方案1】:

    我正在使用这样的东西:

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

    或者处理空字符串:

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

    【讨论】:

      【解决方案2】:

      这只是在一次代码审查中出现的。提供的答案非常适合字符串。但它们不适用于 int 或 double 等...今天,我需要为重试计数执行此操作,并且它必须是 int。

      因此,对于那些想要包含类型转换的人来说,这是一个答案。

      使用这个扩展方法:

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

      我也有它的单元测试,你可以在这里找到:http://www.rhyous.com/2015/12/02/how-to-easily-access-a-web-config-appsettings-value-with-a-type-and-a-default-value

      希望对下一个人有所帮助。

      【讨论】:

      【解决方案3】:

      静态构造函数很好,关于它们的好处是它们保证运行时只执行一次 - 在任何情况下第一次使用该类。

      您也可以使用合并运算符 (??) 来设置默认值:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 2019-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多