CSharp初級篇 1-4 this、索引器、靜態、常量以及只讀

来源:https://www.cnblogs.com/WarrenRyan/archive/2019/07/20/11217976.html
-Advertisement-
Play Games

.NET Core CSharp 初級篇 1 4 本節內容為this、索引器、靜態、常量以及只讀 簡介 在之前的課程中,我們談論過了靜態函數和欄位的一小部分知識,本節內容中,我們將詳細的講解關於對象操作的例子,以及更加深入的解釋面向對象。 常量 常量,顧名思義,就是一直為同一個值的變數,並且值不可以 ...


.NET Core CSharp初級篇 1-4

本節內容為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]訪問最後一位)

前往Github獲取更多本節資料(PPT,實例代碼)
如果我的教程幫到了您,希望您動動小手,在GitHub給我一個star

Github

BiliBili主頁

WarrenRyan's Blog

博客園


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 類集 類集:主要功能就是Java數據結構的實現(java.util) 類集就是動態對象數組(鏈表也是動態數組) Collection 介面 Collection是整個類集之中單值保存的最大 父介面 。即:每一次僅可以向集合中保存一個對象 在Collection定義的常用操作方法 常用操作方法 向集合 ...
  • 使用反射調用類中的setter、getter方法 運行結果: ...
  • 1.什麼是SpringMVC? SpringMVC是Spring框架內置的MVC的實現。SpringMVC就是一個Spring內置的MVC框架。MVC框架,它解決WEB開發中常見的問題(參數接收、文件上傳、表單驗證、國際化等等),而且使用簡單,與Spring無縫集成。 支持 RESTful風格的 U ...
  • 15.迭代器:工具 1.可迭代對象: ​ 官方聲明,只要具有_\_iter\_\_方法的就是可迭代對象 list,dict,str,set,tuple 可迭代對象,使用靈活 2.迭代器: 官方聲明:只要具有\_\_iter\_\_方法_\_next\_\_方法就是迭代器 將可迭代對象,轉換成迭代器 ...
  • EF是微軟推出的官方ORM框架,預設防註入可以配合LINQ一起使用,更方便開發人員。 首先通過SQLSERVER現在有的資料庫類生產EF 右鍵-》添加-》新建項,選擇AOD.NET實體數據模型,來自資料庫的Code FIrst 完成添加後會生成多個文件,並且在你的項目的配置文件中有資料庫的鏈接字元串 ...
  • 目錄 1.開發工具 2.GitLab伺服器搭建 3.新建webapi 4.Dockerfile配置 5.配置docker compose.yml 6.配置.gitlab ci.yml 7.在GitLab上添加一個新項目 8.GitLib Runner安裝 9.提交代碼到gitlab 10.在GitL ...
  • 如下圖所示,新建的類不能直接使用,會顯示報錯,檢查命名空間什麼的,未果 通過百度搜索,發現這麼一篇文章:https://blog.csdn.net/younghaiqing/article/details/71627959 不錯,將類文件的屬性中的“生成操作”里的“內容”改成“編譯”,保存後就能解決 ...
  • Windows服務是非常強大的應用程式,可用於在backgorund中執行許多不同類型的任務。他們可以在不需要任何用戶登錄的情況下啟動,並且可以使用除登錄用戶之外的其他用戶帳戶運行。但是,如果通過遵循常規服務開發步驟開發Windows服務應用程式,即使在開發環境中也難以調試。 本文提出了一種不使用任 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...