香蕉视频app

香蕉视频appKeep on going never give up.

Let's Go

C# 學習筆記(23)構造函數

C#Lonely2019-05-08 17:00:0057次0條

構造函數的作用:主要用于創建類的實例對象(初始化對象,給屬性中的每個值依次賦值)。當調用構造函數創建一個對象時,構造函數會為對象分配內存空間,并初始化類的成員。構造函數分為實例構造函數和靜態構造函數兩種。

實例構造函數

實例構造函數用于創建和初始化類的實例。使用new運算符創建對象的過程,其實就是在調用實例構造函數,來初始化類中的所有實例成員。

構造函數特點:

香蕉视频app 1、構造函數是一個特殊的方法,不允許有返回類型,連void也不能寫。

2、構造函數的名稱必須跟類名一致。

香蕉视频app 3、創建對象的時候會執行構造函數。

4、構造函數可以有參數,new對象的時候傳遞函數參數即可。

香蕉视频app 5、構造函數可以進行方法重載。實現了方法重載,就可以通過不同的方式來完成類的實例化。

香蕉视频app 6、如果沒有為類顯式地定義一個構造函數,則C#編譯器會自動生成一個函數體為空的默認無參的實例構造函數。當你顯式地定義了一個新的構造函數之后,不管是有參數的還是無參數的,C#編譯器都不會再自動生成那個函數體為空默認無參的構造函數了,所以如果需要無參的構造函數,則需要自己來定義。

7、可以對實例構造函數指定訪問級別,即可以使用public、protected和private修飾符來修飾。

代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Person
    {
        public string Name { get; set; }
        public char Sex { get; set; }
        public int Age { get; set; }
        
        public Person() //定義一個無參數的構造函數
        {
            this.Name = "張三";
            this.Sex = '男';
            this.Age = 22;
        }
        
        public Person(string name,char sex,int age) //定義一個有參數的構造函數
        {
            this.Name = name;
            this.Sex = sex;
            this.Age = age;
        }
        
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //new關鍵字幫我們做了三件事:(1)在內存中開辟一塊空間 (2)在開辟的空間中創建對象 (3)調用對象的構造函數,進行初始化對象
            //創建對象的時候會執行構造函數
            Person p1 = new Person();
            Person p2 = new Person("王燕",'女',18);
            Console.WriteLine("姓名:{0},性別:{1},年齡:{2}", p1.Name, p1.Sex, p1.Age);
            Console.WriteLine("姓名:{0},性別:{1},年齡:{2}", p2.Name, p2.Sex, p2.Age);
            Console.ReadKey();
        }
    }
}

香蕉视频app 運行結果:

image.png

上面的代碼定義的都是公共構造函數(即使用public關鍵字修飾的構造函數),在介紹實例構造函數特點時我們曾提到,也可以使用private、protected關鍵字來修飾實例構造函數。

使用private關鍵字修飾的構造函數稱為私有構造函數香蕉视频app如果類只定義了一個或多個私有構造函數,而沒有其他公共構造函數,則其他類不能通過調用該類的私有構造函數來創建類的實例。私有構造函數最典型的應用是設計模式中的單例模式的實現。

私有構造函數,將構造函數申明為私有的,則不能通過new運算符在外部代碼中實例化(但可以編寫一個靜態方法或屬性在其內部實例化一個對象,再將結果返回給外部代碼)。

私有構造函數的作用:

1、永遠不會實例化,因為它僅用作某些靜態成員的容器。

2、希望類只能通過調用某個靜態方法來實例化(即所謂的對象實例化的類工廠方法)。

代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    //下面實現也是設計模式中單例模式的實現
    class Person
    {
        public string Name { get;  }
        public char Sex { get; }
        public int Age { get;  }
        public static Person person;
        
        private Person() //私有構造函數,只能在類內部調用。也就是說類的實例化只能在類定義時被實例化。
        {
            Console.WriteLine("私有構造函數被調用了!");
            this.Name = "張三";
            this.Sex = '男';
            this.Age = 22;
        }
        
        public static Person GetInstance() //靜態方法,用于返回類的實例。
        {
            if (person == null)
                person = new Person();
            return person;
        }
        
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //通過調用GetInstance()靜態方法來返回一個Person的實例
            //此時不能通過new運算符來創建實例
            //即不能使用 Person p1 = new Person(); 的代碼來創建實例
            Person p1 = Person.GetInstance();            
            Console.WriteLine("姓名:{0},性別:{1},年齡:{2}", p1.Name, p1.Sex, p1.Age); 
            Console.ReadKey();
        }
    }
}

運行結果:

image.png


靜態構造函數

除了實例構造函數之外,構造函數還包括靜態構造函數。靜態構造函數用于初始化類中的靜態成員,在創建第一個實例或引用任何靜態成員之前,CLR都將自動調用靜態構造函數。

靜態構造函數特點:

1、靜態構造函數不能使用任何訪問修飾符。

2、靜態構造函數不能帶有任何參數。

3、靜態構造函數只執行一次。

4、不能直接調用靜態構造函數,因為靜態構造函數不是我們程序員調用的,是由CLR在合適的時機自動調用的。

5、執行時機:是在類被實例化或者靜態成員被調用的時候由CLR自動進行調用的,所以在程序中,我們無法控制執行靜態構造函數的時機。

6、一個類中只能有一個靜態構造函數。

7、香蕉视频app靜態構造函數前面必須是static 關鍵字。如果不加這個關鍵字,那就是普通的構造函數了。

香蕉视频app 8、無參數的靜態構造函數和無參數的構造函數是可以并存的。因為它們一個屬于類級別,一個屬于實例級別,并不沖突。

香蕉视频app 9、如果我們在類中定義了靜態變量,但是又沒有定義靜態構造函數,那么C#編譯器也會自動幫助我們來生成一個靜態構造函數來讓框架自身來調用。

代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Person
    {
        public static string Name { get;  }
        public static char Sex { get; }
        public static int Age { get;  }
        
        static Person() //靜態構造函數只執行一次
        {
            Console.WriteLine("靜態構造函數被調用了!");
            Name = "張三";
            Sex = '男';
            Age = 22;
        }
        
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {           
            Console.WriteLine("姓名:{0},性別:{1},年齡:{2}", Person.Name, Person.Sex, Person.Age);
            Console.WriteLine("姓名:{0},性別:{1},年齡:{2}", Person.Name, Person.Sex, Person.Age);
            Console.ReadKey();
        }
    }
}

運行結果:

image.png


暗錨,解決錨點偏移

文章評論

    嘿,來試試登錄吧!