1. 程式人生 > >c# static變數的初始化

c# static變數的初始化

用static宣告的變數或函式,都是屬於類的,而不屬於類物件,所以最好不要在類的建構函式中為static變數初始化(不需要初始化的就不用顧忌了,因為c#預設會給static變數初化得,比如staitc整型變數,會初始化為0)。如果在類的建構函式中初始化static變數,那只有在你new過該類的物件後,static變數的初始化才起作用。

一、 例如:以下程式碼,定義了一個static_test的類,該類中有個static型別的list變數,並在建構函式中為其初始化

class static_test
    {
        //定義static變數
        public static List<int> m_lst;

        public static_test()
        {
            //在建構函式中為m_lst初始化
            m_lst = new List<int>();
            for (int i = 0; i < 10; ++i)
            {
                m_lst.Add(i);
            }
        }
        /// <summary>
        /// 列印m_lst
        /// </summary>
        public static void PrintList()
        {
            if (m_lst == null)
            {
                Console.WriteLine("list is null");
                return;
            }
            for (int i = 0; i < m_lst.Count; ++i)
            {
                Console.Write(m_lst[i] + " ");
            }
            Console.WriteLine();
        }
    }

1. 此時,在沒有定義過static_test型別的物件時,直接呼叫static_test.PrintList(),情況如下:
static void Main(string[] args)
        {
            static_test.PrintList();

            Console.ReadKey();
        }

輸出:

list is null

2. 若定義過static_test型別的物件,再呼叫static_test.PrintList(),m_lst就有值了。

static void Main(string[] args)
        {
            static_test test = new static_test();
            static_test.PrintList();
            Console.ReadKey();
        }

輸出:

0 1 2 3 4 5 6 7 8 9

二、我個人觀點,將需要初始化的靜態變數,在類中宣告時,就給初始化了,以避免不必要的錯誤。如下,加了個InitList()靜態成員函式,static成員變數在宣告時通過該函式初始化

 class static_test
    {
        //定義static變數
        public static List<int> m_lst = InitList();

        public static_test()
        {           
            
        }

        private static List<int> InitList()
        {
            List<int> lst = new List<int>();
            for (int i = 0; i < 10; ++i)
            {
                lst.Add(i);
            }
            return lst;
        }
        /// <summary>
        /// 列印m_lst
        /// </summary>
        public static void PrintList()
        {
            if (m_lst == null)
            {
                Console.WriteLine("list is null");
                return;
            }
            for (int i = 0; i < m_lst.Count; ++i)
            {
                Console.Write(m_lst[i] + " ");
            }
            Console.WriteLine();
        }
    }

此時,在沒有定義過static_test型別的物件時,直接呼叫static_test.PrintList(),情況如下:
static void Main(string[] args)
        {
            static_test.PrintList();

            Console.ReadKey();
        }

輸出:

0 1 2 3 4 5 6 7 8 9