C#报非静态的字段、方法或属性要求对象引用的原因

我们来看一下代码:

class singleton
    {
     
        private singleton()
        {
     

        }
        protected  singleton instance = null;
        public static singleton GetInstance()
        {
     
            if (instance == null)
                instance = new singleton(); 
            return instance;
        }
    }

以上代码在vs中编辑完成之后,就会报错,如下:
C#报非静态的字段、方法或属性要求对象引用的原因_第1张图片
这是什么原因导致的呢?这是由于静态变量和非静态变量的初始化顺序导致的,由于在C#编译器中静态变量的初始化顺序>非静态变量,所以GetInstance>instance的初始化顺序,这时,编译器发现instance没有被初始化,就会提示instance没有被引用,那么我们怎么去解决这个问题,这里有两种方法,分别如下:
1、将instance也声明为静态的,让instace和GetInstance方法的初始化顺序一致,代码如下:

class singleton
    {
     
        private singleton()
        {
     

        }
        protected  static singleton instance = null;
        public static singleton GetInstance()
        {
     
            if (instance == null)
                instance = new singleton(); 
            return instance;
        }
    }
    

2、将GetInstance方法内部在使用instance之前,先对其初始化,代码如下:

class singleton
    {
     
        private singleton()
        {
     

        }

        public static singleton GetInstance()
        {
     
            singleton instance = null;
            if (instance == null)
                instance = new singleton();
            return instance;
        }
    }

当然第二种方法的代码有点扯淡,因为每次先将其赋值为null,然后又进行判断,还不如直接进行实例化,这里只是举例而已,和代码本身无关,懂得思路就好。

你可能感兴趣的:(c#)