天天看點

.NET Core初級篇 1-4 this、索引器、靜态、常量以及隻讀

C# this、索引器、靜态、常量以及隻讀

.NET Core CSharp初級篇 1-4

全文目錄

(部落格園).NET Core Guide

(Github).NET Core Guide

本節内容為this、索引器、靜态、常量以及隻讀

簡介

在之前的課程中,我們談論過了靜态函數和字段的一小部分知識,本節内容中,我們将詳細的講解關于對象操作的例子,以及更加深入的解釋面向對象。

常量

常量,顧名思義,就是一直為同一個值的變量,并且值不可以被改變。在C#中,定義一個常量需要使用const關鍵字聲明。常量并不占用記憶體的空間。在C#程式編譯的時候,編譯器會把任何使用了該常量替換成這個值。

因為常量并不存儲在記憶體中,是以常量隻允許使用内置的數值類型,例如:bool、char、string、enum。并且聲明的同時必須對常量進行初始化。

例如我們應用的版本号,通常在應用編譯完成之後都是以一個常量存在,也不需要對他進行操作。看下列代碼。

public const string Version="v2.1.1"

public string getString(string msg)
{
    return "Copyright@2019" + msg + Version;
}
           

上述函數代碼在編譯時,将會變成:

public string getString(string msg)
{
    return "Copyright@2019" + msg + "V2.1.1";
}
           

因為常量的上述特性,如果Y程式集使用了X程式集中的這個Version常量,如果X修改了該常量為“2.1.2”并重新編譯,若Y不重新編譯,Y中常量還是“2.1.1”,因為該常量會被直接固化于Y中并用常量值替換變量名。是以需要y進行重新編譯才會使用新的常量值。

靜态

靜态是一個很常用的文法,我們可以在類中構造各種靜态成員,例如靜态字段、函數等等。再C#中定義靜态成員的方法是使用修飾符static,調用的時候隻需要使用“類名.成員名”。

在之前的課程中,我順帶提過一次,靜态是一個隻初始化執行一次,屬于全體共有的一個東西,也可以說是該靜态成員屬于類本體所有,而不是每一個對象所有。我們就從靜态構造函數、靜态字段、靜态函數這三塊進行一個詳細的講解。

靜态構造函數

我們之前以及對構造函數進行過一個簡單的介紹,構造函數是在類被初始化(執行個體化)的時候調用,并且每建立一個對象就會調用一次構造函數。

而靜态構造函數是每一個類型執行一次,也就是這個類型的所有對象公用一個靜态構造函數。這差別與普通構造函數的一個對象執行一次。并且對于靜态構造函數而言,一個類隻允許有一個靜态構造函數,并且必須無參。

靜态構造函數在你通路一個類型的靜态成員的時候,或者執行個體化一個類型的時候,編譯器會自動的調用靜态構造函數。

特别的,因為該初始化的構造函數(靜态構造函數)屬于所有變量共有并且會調用,那麼假設該構造函數報錯,那麼這個類将再程式剩餘生命周期内無法再被使用。

靜态字段

靜态字段也是一樣,屬于一切成員公有,在任何地方你都可以不執行個體化類的情況下對靜态字段操作。

對于靜态字段的初始化,分為兩種情況:

  • 假定類存在一個靜态構造函數,那麼靜态字段在靜态構造函數被調用的一瞬間就會初始化;
  • 假定不存在靜态構造函數,那麼靜态字段将會被類型被使用之前的一瞬間初始化(最晚執行),或者更早,在運作時的某一時間(并無法确定)被初始化。

靜态字段初始化的順序則與定義時的順序一緻,例如:

class A
{
    public static int X = Y;
    public static int Y = 15;
}
.....
Console.WriteLine("X:{0},Y:{1}",X,Y)
           

上例中,X,Y的初始化順序是X先被初始化,此時Y沒有初始化,則是0,是以輸出是X:0,Y:15。

靜态函數

與之前一樣,靜态函數可以在不執行個體化類的情況下調用,但是注意,在靜态函數中,不允許使用任何非靜态的字段。調用的時候直接使用類名.函數名()即可。

靜态類

如果一個類,被聲明為靜态類,那麼該類不可以被執行個體化,也不可以被繼承,同時不可以包含非靜态成員。非靜态類中,可以包含靜态成員。

隻讀

隻讀用于字段的通路控制,使用readonly關鍵字,通常情況下也可以使用無set通路器的屬性進行實作。

class A
{
    public string test{get;}
    public readonly string _test;
}
           

靜态成員的生命周期

從程式開始初始化到程式結束,是以濫用靜态會導緻性能問題。

this關鍵字

在C#中,this關鍵字表示操作的目前對象,在類裡面,如果你使用this關鍵字,則this指代的是你每次操作對象時的目前對象。特别的,如果你的函數形參名稱和字段名相同,并且你需要同時操作這個兩個變量,那麼你需要使用this關鍵字去指明你的操作對象,例如:

class A
{
    private string data;
    public string Data{get{return data;}}

    public void SetData(string data)
    {
        //this.data表示是目前對象的字段data
        this.data = data;
    }


}
           

索引器

在之前的數組操作中,相信大家都發現了數組的通路通過了一個中括号和下标的方式進行通路,這個東西我們稱為索引器。但是在類中的索引器可以以任何類型作為索引的key,這使得整個類的拓展性變得很好。

如何去定義一個索引器呢?這裡就需要用到我們的this關鍵字了。定義的方式有點類似我們對于屬性的定義

public class A
{
    public double[] arry{get;set;}
    public double this [int index]
    {
        get
        {
            return arry[index];
        }
        set
        {
            arry[index] = value;
        }
    }
}
           

通過索引器,我們可以自己定義各種不同的索引方式,而不用拘泥于下标通路

習題

1.請問下列代碼輸出什麼?為什麼?

class A
{
    public static A a = new A();
    public static int X = 3();
    A()
    {
        Console.WriteLine(X);
    }
}
class Program
{
    static void Main()
    {
        Console.WriteLine(A.X);
    }
}
           

2.試着使用索引器,寫出一個二維數組的索引通路,要求實作倒序通路(即a[0]通路最後一位)

作  者:WarrenRyan

出  處:https://www.cnblogs.com/WarrenRyan/

關于作者:熱愛數學、熱愛機器學習,喜歡彈鋼琴的不知名小菜雞。

版權聲明:本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。若需商用,則必須聯系作者獲得授權。

特此聲明:所有評論和私信都會在第一時間回複。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我

聲援部落客:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!

部落客一些其他平台:

微信公衆号:寤言不寐

BiBili——小陳的學習記錄

Github——StevenEco

BiBili——記錄學習的小陳(計算機考研紀實)

掘金——小陳的學習記錄

知乎——小陳的學習記錄

聯系方式:

電子郵件:[email protected]

社交媒體聯系二維碼:

.NET Core初級篇 1-4 this、索引器、靜态、常量以及隻讀

繼續閱讀