从静态成员获取对象引用未设置为对象错误的实例

时间:2013-04-09 07:22:45

标签: c#

我有一个像这样的静态类:

  public static class ApplicationList
    {
        public static List<ApplicationsModel> ApplicationsModels { get; set; }
    }

我想在另一个类

中使用ApplicationsModels
   class Program
    {
        static void Main(string[] args)
        {
            GetApplicationNameFromAppConfigAndAddToApplicationList();
        }

        private static void GetApplicationNameFromAppConfigAndAddToApplicationList()
        {
            List<string> applicationName = ConfigurationManager.AppSettings["AppName"].Split(',').ToList();

            foreach (var variable in applicationName)
            {
                ApplicationList.ApplicationsModels.Add(new ApplicationsModel { DateTime = DateTime.MinValue, Name = variable });

            }
        }
    }

但是我的ApplicationList为null并且出现此错误

Object reference not set to an instance of an object.

这是静态Prpoerty,我们无法创建实例形式静态Prpoerty

enter image description here

3 个答案:

答案 0 :(得分:4)

你有一个

 public static List<ApplicationsModel> ApplicationsModels { get; set; }

未初始化的属性。

可以做这样的事情,而不是:

public static class ApplicationList
{
    private static List<ApplicationsModel> appmodel = new List<ApplicationsModel>();
    public static List<ApplicationsModel> ApplicationsModels 
    { 
       get { return appmodel ;}
    }

    //DON'T THINK YOU NEED A SET IN THIS CASE.. 
    // BUT ADD IT, IF NEED
}

答案 1 :(得分:2)

您获得空引用异常,因为当您尝试使用List<ApplicationsModel> ApplicationsModels时,ApplicationsModels = new List<ApplicationsModel>(); 仍为null。只是声明它是静态的并不意味着编译器或框架为你添加了对

的调用
{{1}}

答案 2 :(得分:1)

简短回答,在加载列表前添加此行:

ApplicationsModels = new List<ApplicationsModel>();

更长的回答:

您需要初始化List,然后才能添加。{/ p>

这是因为默认情况下(引用类型)属性为null,执行null.Add(item)没有意义。

解决方案1:加载前初始化

简单的解决方案是在使用Get...方法加载列表之前添加初始化行:

ApplicationsModels = new List<ApplicationsModel>();

但是,每次调用Get方法时,这都会重新初始化列表(可能是您想要的,也可能不是)。您可以选中仅在null的情况下重新创建列表,但如果这是您之后我倾向于采用以下其他解决方案之一的行为。

解决方案2:使用初始化字段而不是属性

另一种方法是用初始化字段替换您的属性。之一:

public static List<ApplicationsModel> ApplicationsModels = new List<ApplicationsModel>();

或者:

public static List<ApplicationsModel> ApplicationsModels 
{ 
    get { return _applicationsModels; }
    set { _applicationModels = value; } // Do you really want a set?
}
private static List<ApplicationsModel> _applicationsModels = new List<ApplicationsModel>();

解决方案3:保留属性,但使用静态构造函数

另一种方法是在ApplicationList中使用static constructor

static ApplicationList()
{
    ApplicationsModels = new List<ApplicationsModel>();
}