程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#之構造函數

C#之構造函數

編輯:C#基礎知識

構造函數分為:
1.實例構造函數
2.私有構造函數
3.靜態構造函數
構造函數是一種特殊的方法,主要是為了給初始化對象賦初值。
1.實例構造函數

使用new表達式創建某個類的對象時,會使用實例構造函數創建和初始化所有實例成員變量。
 public class ProgramTest
    {
        int j;
        public ProgramTest()
        {
            j = 4;
            Console.WriteLine("I am ProgramTest,{0}", j);
        }
        static void Main(string[] args)
        {
            ProgramTest pt = new ProgramTest();
            Console.Read();
        }

結果為:I am ProgramTest,4

在此次實驗中,我們首先定義了一個私有成員j,經過初始化給他賦了一個初值4,當我實例化類ProgramTest時,就會執行實例構造函數。
諸如此類不帶參數的構造函數叫“默認構造函數”,如果某個類沒有構造函數,則會自動生成一個默認構造函數,並使用默認值來初始化對象字段。 public class ProgramTest
    {
        int j;
        public ProgramTest()
        {
            Console.WriteLine("I am ProgramTest,{0}", j);
        }
        static void Main(string[] args)
        {
            ProgramTest pt = new ProgramTest();
            Console.Read();
        }

    }
結果為:I am ProgramTest,0 

也可以創建帶有參數的構造函數

 public class ProgramTest
    {
        int j;
        public ProgramTest(int i)
        {
            j = 2;
            Console.WriteLine("I am ProgramTest,i={0},j={1}",i, j);
        }
        static void Main(string[] args)
        {
            ProgramTest pt = new ProgramTest(1);
            Console.Read();
        }

 

結果為:I am ProgramTest i=1,j=2 

 

那若是一個類中既有無參構造函數,又有有參構造函數那會怎麼樣呢?

 public class ProgramTest
    {
        int j;
        public ProgramTest()
        {
            j = 3;
            Console.WriteLine("I am ProgramTest 默認構造函數,j={0}", j);
        }
        public ProgramTest(int i)
        {
            j = 2;
            Console.WriteLine("I am ProgramTest 有參構造函數,i={0},j={1}",i, j);
        }
        static void Main(string[] args)
        {
            ProgramTest pt1 = new ProgramTest();
            ProgramTest pt2 = new ProgramTest(1);
            Console.Read();
        }

 

結果為:I am ProgramTest 默認構造函數 j=3
       I am ProgramTest 有參構造函數 i=1,j=2

 

可見,若是兩者同時存在,那麼看類實例化時,是怎麼實例的。
2.私有構造函數

私有構造函數是一種特殊的實例構造函數。它通常用在只包含靜態成員的類中。
如果類具有一個或多個私有構造函數而沒有公共構造函數,則其他類(除嵌套類外)無法創建該類的實例。

 

    public class Test
    {
        private  Test()
        {
            Console.WriteLine("I am Test");
        }
    }
    public class ProgramTest
    {
        int j;
        private ProgramTest()
        {
            j = 3;
            Console.WriteLine("I am ProgramTest 默認構造函數,j={0}", j);
        }
        static void Main(string[] args)
        {
            Test t = new Test();
            ProgramTest pt1 = new ProgramTest();
            Console.Read();
        }
    }

結果:這時你會發現編譯器會提示你,你無法創建Test的實例
(即使你在Test類中添加一個靜態成員,結果依然會提示因為該構造函數受其保護級別的限制而不可訪問)

若是只在自己類裡有私有類呢?

  public class ProgramTest
    {
        int j;
        private ProgramTest()
        {
            j = 3;
            Console.WriteLine("I am ProgramTest 默認構造函數,j={0}", j);
        }
        static void Main(string[] args)
        {
            ProgramTest pt1 = new ProgramTest();
            Console.Read();
        }
    }

結果:I am ProgranmTest 默認構造函數,j=3

注意,如果您不對構造函數使用訪問修飾符,則在默認情況下它仍為私有構造函數。但是,通常顯式地使用private修飾符來清楚地表明該類不能被實例化。
若是一個類中既有實例構造函數又有私有構造函數,那麼當實例對象是會怎麼執行呢?

 public class Test
    {
        int i;
        private  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 默認構造函數 i={0}", i);
        }
        public Test(int i)
        {
            Console.WriteLine("I am Test 有參構造函數 i={0}", i);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t = new Test();  //編譯器提示:因為該構造函數受其保護級別的限制而不可訪問       
            Console.Read();

若是只執行有參構造函數呢?

  public class Test
    {
        int i;
        private  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 默認構造函數 i={0}", i);
        }
        public Test(int i)
        {
            Console.WriteLine("I am Test 有參構造函數 i={0}", i);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t = new Test(2);
            Console.Read();
        }
    }

結果:I am Test 有參構造函數 i=2

3.靜態構造函數
靜態構造函數用來初始化靜態變量,這個構造函數是屬於類的,而不是屬於哪個實例的。

就是說這個構造函數只會被執行一次。也就是在創建第一個實例或引用任何靜態成員之前,由.NET自動調用。  public class Test
    {
        static int i;
        static  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 默認構造函數 i={0}", i);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t1 = new Test();
            Console.Read();
        }
    }

結果為:I am Test 默認構造函數 i=1

靜態構造函數的特點:

1.靜態構造函數既沒有訪問修飾符,也沒有參數。
2.在創建第一個實例或引用任何靜態成員之前,將自動調用靜態構造函數來初始化類,也就是無法直接調用靜態構造函數,也無法控制什麼時候執行靜態構造函數。

3.一個類只能有一個靜態構造函數,最多只能運行一次。
4.靜態構造函數不可以被繼承。
5.如果沒有靜態構造函數,而類中的靜態成員有初始值,那麼編譯器會自動生成默認的靜態構造函數。
如果靜態默認構造函數和公有默認構造函數同時存在,會怎麼樣呢?

 

    public class Test
    {
        static int i;
        static  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 靜態默認構造函數 i={0}", i);
        }
        public Test()
        {
            Console.WriteLine("I am Test 公有默認構造函數 i={0}", i);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t1 = new Test();
            Console.Read();
        }
    }

結果:I am Test 靜態默認構造函數 i=1

       I am Test 公有默認構造函數 i=1

 

 

如果靜態默認構造函數和公有有參構造函數同時存在,我實例化類讓它調用靜態默認構造函數會怎麼樣呢?
 public class Test
    {
        static int i;
        static  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 靜態默認構造函數 i={0}", i);
        }
        public Test(int j)
        {
            Console.WriteLine("I am Test 公有有參構造函數 i={0}", j);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t1 = new Test();  //系統會提示錯誤      
            Console.Read();

        }

    }

如果靜態默認構造函數和公有有參構造函數同時存在,我實例化類讓它調用公有構造函數會怎麼樣呢?     public class Test
    {
        static int i;
        static  Test()
        {
            i = 1;
            Console.WriteLine("I am Test 靜態默認構造函數 i={0}", i);
        }
        public Test(int j)
        {
            Console.WriteLine("I am Test 公有有參構造函數 i={0}", j);
        }
    }
    public class ProgramTest
    {
        static void Main(string[] args)
        {
            Test t1 = new Test(2);
            Console.Read();
        }
    }

結果:I am Test 靜態默認構造函數 i=1
     I am Test 公有有參構造函數 j=2

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved